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