1414# a commercial license, send an email to license@arduino.cc.
1515
1616import tempfile
17+ import sys
1718import hashlib
1819import pytest
1920from pathlib import Path
21+ from typing import Union
2022
2123
2224def generate_build_dir (sketch_path ):
@@ -26,13 +28,26 @@ def generate_build_dir(sketch_path):
2628 return build_dir .resolve ()
2729
2830
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+
2943testdata = [
3044 (
3145 "" ,
3246 "arduino:avr:uno" ,
3347 "arduino:avr@1.8.3" ,
3448 "/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} "
3651 + '"-C{data_dir}/packages/arduino/tools/avrdude/6.3.0-arduino17/etc/avrdude.conf" '
3752 + '-v -V -patmega328p -carduino "-P{upload_port}" -b115200 -D "-Uflash:w:{build_dir}/{sketch_name}.ino.hex:i"' ,
3853 ),
@@ -41,7 +56,8 @@ def generate_build_dir(sketch_path):
4156 "arduino:avr:leonardo" ,
4257 "arduino:avr@1.8.3" ,
4358 "/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} "
4561 + '"-C{data_dir}/packages/arduino/tools/avrdude/6.3.0-arduino17/etc/avrdude.conf" '
4662 + '-v -V -patmega32u4 -cavr109 "-P{upload_port}0" -b57600 -D "-Uflash:w:{build_dir}/{sketch_name}.ino.hex:i"' ,
4763 ),
@@ -50,7 +66,8 @@ def generate_build_dir(sketch_path):
5066 "adafruit:avr:flora8" ,
5167 "adafruit:avr@1.4.13" ,
5268 "/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} "
5471 + '"-C{data_dir}/packages/arduino/tools/avrdude/6.3.0-arduino17/etc/avrdude.conf" '
5572 + '-v -patmega32u4 -cavr109 -P{upload_port} -b57600 -D "-Uflash:w:{build_dir}/{sketch_name}.ino.hex:i"' ,
5673 ),
@@ -59,7 +76,8 @@ def generate_build_dir(sketch_path):
5976 "adafruit:avr:flora8" ,
6077 "adafruit:avr@1.4.13" ,
6178 "/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} "
6381 + '"-C{data_dir}/packages/arduino/tools/avrdude/6.3.0-arduino17/etc/avrdude.conf" '
6482 + '-v -patmega32u4 -cavr109 -P{upload_port}0 -b57600 -D "-Uflash:w:{build_dir}/{sketch_name}.ino.hex:i"' ,
6583 ),
@@ -68,7 +86,12 @@ def generate_build_dir(sketch_path):
6886 "esp32:esp32:esp32thing" ,
6987 "esp32:esp32@1.0.6" ,
7088 "/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} "
7295 + '--chip esp32 --port "{upload_port}" --baud 921600 --before default_reset '
7396 + "--after hard_reset write_flash -z --flash_mode dio --flash_freq 80m --flash_size detect 0xe000 "
7497 + '"{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):
80103 "esp8266:esp8266:generic" ,
81104 "esp8266:esp8266@3.0.1" ,
82105 "/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} "
84108 + '"{data_dir}/packages/esp8266/hardware/esp8266/3.0.1/tools/upload.py" '
85109 + '--chip esp8266 --port "{upload_port}" --baud "115200" "" '
86110 + "--before default_reset --after hard_reset write_flash 0x0 "
@@ -89,17 +113,19 @@ def generate_build_dir(sketch_path):
89113]
90114
91115
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+ ):
94120 env = {
95121 "ARDUINO_DATA_DIR" : session_data_dir ,
96122 "ARDUINO_DOWNLOADS_DIR" : downloads_dir ,
97123 "ARDUINO_SKETCHBOOK_DIR" : session_data_dir ,
98124 }
99125
100- if index :
126+ if package_index :
101127 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 )
103129 assert run_command ("update" , custom_env = env )
104130
105131 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
115141 res = run_command (f'upload -p { upload_port } -b { fqbn } "{ sketch_path } " --dry-run -v' , custom_env = env )
116142 assert res .ok
117143
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