14
14
# a commercial license, send an email to license@arduino.cc.
15
15
16
16
import tempfile
17
+ import sys
17
18
import hashlib
18
19
import pytest
19
20
from pathlib import Path
21
+ from typing import Union
20
22
21
23
22
24
def generate_build_dir (sketch_path ):
@@ -26,13 +28,26 @@ def generate_build_dir(sketch_path):
26
28
return build_dir .resolve ()
27
29
28
30
31
+ def generate_expected_output (
32
+ output : str , upload_tools : Union [dict , str ], data_dir : str , upload_port : str , build_dir : str , sketch_name : str
33
+ ) -> str :
34
+ if isinstance (upload_tools , str ):
35
+ tool = upload_tools
36
+ else :
37
+ tool = upload_tools [sys .platform ]
38
+ return output .format (
39
+ tool_executable = tool , data_dir = data_dir , upload_port = upload_port , build_dir = build_dir , sketch_name = sketch_name ,
40
+ ).replace ("\\ " , "/" )
41
+
42
+
29
43
testdata = [
30
44
(
31
45
"" ,
32
46
"arduino:avr:uno" ,
33
47
"arduino:avr@1.8.3" ,
34
48
"/dev/ttyACM0" ,
35
- '"{data_dir}/packages/arduino/tools/avrdude/6.3.0-arduino17/bin/avrdude" '
49
+ '"{data_dir}/packages/arduino/tools/avrdude/6.3.0-arduino17/bin/avrdude"' ,
50
+ "{tool_executable} "
36
51
+ '"-C{data_dir}/packages/arduino/tools/avrdude/6.3.0-arduino17/etc/avrdude.conf" '
37
52
+ '-v -V -patmega328p -carduino "-P{upload_port}" -b115200 -D "-Uflash:w:{build_dir}/{sketch_name}.ino.hex:i"' ,
38
53
),
@@ -41,7 +56,8 @@ def generate_build_dir(sketch_path):
41
56
"arduino:avr:leonardo" ,
42
57
"arduino:avr@1.8.3" ,
43
58
"/dev/ttyACM999" ,
44
- '"{data_dir}/packages/arduino/tools/avrdude/6.3.0-arduino17/bin/avrdude" '
59
+ '"{data_dir}/packages/arduino/tools/avrdude/6.3.0-arduino17/bin/avrdude"' ,
60
+ "{tool_executable} "
45
61
+ '"-C{data_dir}/packages/arduino/tools/avrdude/6.3.0-arduino17/etc/avrdude.conf" '
46
62
+ '-v -V -patmega32u4 -cavr109 "-P{upload_port}0" -b57600 -D "-Uflash:w:{build_dir}/{sketch_name}.ino.hex:i"' ,
47
63
),
@@ -50,7 +66,8 @@ def generate_build_dir(sketch_path):
50
66
"adafruit:avr:flora8" ,
51
67
"adafruit:avr@1.4.13" ,
52
68
"/dev/ttyACM0" ,
53
- '"{data_dir}/packages/arduino/tools/avrdude/6.3.0-arduino17/bin/avrdude" '
69
+ '"{data_dir}/packages/arduino/tools/avrdude/6.3.0-arduino17/bin/avrdude"' ,
70
+ "{tool_executable} "
54
71
+ '"-C{data_dir}/packages/arduino/tools/avrdude/6.3.0-arduino17/etc/avrdude.conf" '
55
72
+ '-v -patmega32u4 -cavr109 -P{upload_port} -b57600 -D "-Uflash:w:{build_dir}/{sketch_name}.ino.hex:i"' ,
56
73
),
@@ -59,7 +76,8 @@ def generate_build_dir(sketch_path):
59
76
"adafruit:avr:flora8" ,
60
77
"adafruit:avr@1.4.13" ,
61
78
"/dev/ttyACM999" ,
62
- '"{data_dir}/packages/arduino/tools/avrdude/6.3.0-arduino17/bin/avrdude" '
79
+ '"{data_dir}/packages/arduino/tools/avrdude/6.3.0-arduino17/bin/avrdude"' ,
80
+ "{tool_executable} "
63
81
+ '"-C{data_dir}/packages/arduino/tools/avrdude/6.3.0-arduino17/etc/avrdude.conf" '
64
82
+ '-v -patmega32u4 -cavr109 -P{upload_port}0 -b57600 -D "-Uflash:w:{build_dir}/{sketch_name}.ino.hex:i"' ,
65
83
),
@@ -68,7 +86,12 @@ def generate_build_dir(sketch_path):
68
86
"esp32:esp32:esp32thing" ,
69
87
"esp32:esp32@1.0.6" ,
70
88
"/dev/ttyACM0" ,
71
- 'python "{data_dir}/packages/esp32/tools/esptool_py/3.0.0/esptool.py" '
89
+ {
90
+ "linux" : 'python "{data_dir}/packages/esp32/tools/esptool_py/3.0.0/esptool.py"' ,
91
+ "darwin" : '"{data_dir}/packages/esp32/tools/esptool_py/3.0.0/esptool.py"' ,
92
+ "win32" : '"{data_dir}/packages/esp32/tools/esptool_py/3.0.0/esptool.exe"' ,
93
+ },
94
+ "{tool_executable} "
72
95
+ '--chip esp32 --port "{upload_port}" --baud 921600 --before default_reset '
73
96
+ "--after hard_reset write_flash -z --flash_mode dio --flash_freq 80m --flash_size detect 0xe000 "
74
97
+ '"{data_dir}/packages/esp32/hardware/esp32/1.0.6/tools/partitions/boot_app0.bin" 0x1000 '
@@ -80,7 +103,8 @@ def generate_build_dir(sketch_path):
80
103
"esp8266:esp8266:generic" ,
81
104
"esp8266:esp8266@3.0.1" ,
82
105
"/dev/ttyACM0" ,
83
- '"{data_dir}/packages/esp8266/tools/python3/3.7.2-post1/python3" '
106
+ '"{data_dir}/packages/esp8266/tools/python3/3.7.2-post1/python3"' ,
107
+ "{tool_executable} "
84
108
+ '"{data_dir}/packages/esp8266/hardware/esp8266/3.0.1/tools/upload.py" '
85
109
+ '--chip esp8266 --port "{upload_port}" --baud "115200" "" '
86
110
+ "--before default_reset --after hard_reset write_flash 0x0 "
@@ -89,17 +113,19 @@ def generate_build_dir(sketch_path):
89
113
]
90
114
91
115
92
- @pytest .mark .parametrize ("index, fqbn, core, upload_port, expected_output" , testdata )
93
- def test_upload_sketch (run_command , session_data_dir , downloads_dir , index , fqbn , core , upload_port , expected_output ):
116
+ @pytest .mark .parametrize ("package_index, fqbn, core, upload_port, upload_tools, output" , testdata )
117
+ def test_upload_sketch (
118
+ run_command , session_data_dir , downloads_dir , package_index , fqbn , core , upload_port , upload_tools , output
119
+ ):
94
120
env = {
95
121
"ARDUINO_DATA_DIR" : session_data_dir ,
96
122
"ARDUINO_DOWNLOADS_DIR" : downloads_dir ,
97
123
"ARDUINO_SKETCHBOOK_DIR" : session_data_dir ,
98
124
}
99
125
100
- if index :
126
+ if package_index :
101
127
assert run_command ("config init --overwrite" , custom_env = env )
102
- assert run_command (f"config add board_manager.additional_urls { index } " , custom_env = env )
128
+ assert run_command (f"config add board_manager.additional_urls { package_index } " , custom_env = env )
103
129
assert run_command ("update" , custom_env = env )
104
130
105
131
assert run_command (f"core install { core } " , custom_env = env )
@@ -115,6 +141,11 @@ def test_upload_sketch(run_command, session_data_dir, downloads_dir, index, fqbn
115
141
res = run_command (f'upload -p { upload_port } -b { fqbn } "{ sketch_path } " --dry-run -v' , custom_env = env )
116
142
assert res .ok
117
143
118
- assert expected_output .format (
119
- data_dir = session_data_dir , upload_port = upload_port , build_dir = build_dir , sketch_name = sketch_name
120
- ).replace ("\\ " , "/" ) in res .stdout .replace ("\\ " , "/" )
144
+ generate_expected_output (
145
+ output = output ,
146
+ upload_tools = upload_tools ,
147
+ data_dir = session_data_dir ,
148
+ upload_port = upload_port ,
149
+ build_dir = build_dir ,
150
+ sketch_name = sketch_name ,
151
+ ) in res .stdout .replace ("\\ " , "/" )
0 commit comments