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 dataclasses import dataclass
22+ from typing import Union
2023
2124
2225def generate_build_dir (sketch_path ):
@@ -26,13 +29,26 @@ def generate_build_dir(sketch_path):
2629 return build_dir .resolve ()
2730
2831
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+
2944testdata = [
3045 (
3146 "" ,
3247 "arduino:avr:uno" ,
3348 "arduino:avr@1.8.3" ,
3449 "/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} "
3652 + '"-C{data_dir}/packages/arduino/tools/avrdude/6.3.0-arduino17/etc/avrdude.conf" '
3753 + '-v -V -patmega328p -carduino "-P{upload_port}" -b115200 -D "-Uflash:w:{build_dir}/{sketch_name}.ino.hex:i"' ,
3854 ),
@@ -41,7 +57,8 @@ def generate_build_dir(sketch_path):
4157 "arduino:avr:leonardo" ,
4258 "arduino:avr@1.8.3" ,
4359 "/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} "
4562 + '"-C{data_dir}/packages/arduino/tools/avrdude/6.3.0-arduino17/etc/avrdude.conf" '
4663 + '-v -V -patmega32u4 -cavr109 "-P{upload_port}0" -b57600 -D "-Uflash:w:{build_dir}/{sketch_name}.ino.hex:i"' ,
4764 ),
@@ -50,7 +67,8 @@ def generate_build_dir(sketch_path):
5067 "adafruit:avr:flora8" ,
5168 "adafruit:avr@1.4.13" ,
5269 "/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} "
5472 + '"-C{data_dir}/packages/arduino/tools/avrdude/6.3.0-arduino17/etc/avrdude.conf" '
5573 + '-v -patmega32u4 -cavr109 -P{upload_port} -b57600 -D "-Uflash:w:{build_dir}/{sketch_name}.ino.hex:i"' ,
5674 ),
@@ -59,7 +77,8 @@ def generate_build_dir(sketch_path):
5977 "adafruit:avr:flora8" ,
6078 "adafruit:avr@1.4.13" ,
6179 "/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} "
6382 + '"-C{data_dir}/packages/arduino/tools/avrdude/6.3.0-arduino17/etc/avrdude.conf" '
6483 + '-v -patmega32u4 -cavr109 -P{upload_port}0 -b57600 -D "-Uflash:w:{build_dir}/{sketch_name}.ino.hex:i"' ,
6584 ),
@@ -68,7 +87,12 @@ def generate_build_dir(sketch_path):
6887 "esp32:esp32:esp32thing" ,
6988 "esp32:esp32@1.0.6" ,
7089 "/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} "
7296 + '--chip esp32 --port "{upload_port}" --baud 921600 --before default_reset '
7397 + "--after hard_reset write_flash -z --flash_mode dio --flash_freq 80m --flash_size detect 0xe000 "
7498 + '"{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):
80104 "esp8266:esp8266:generic" ,
81105 "esp8266:esp8266@3.0.1" ,
82106 "/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} "
84109 + '"{data_dir}/packages/esp8266/hardware/esp8266/3.0.1/tools/upload.py" '
85110 + '--chip esp8266 --port "{upload_port}" --baud "115200" "" '
86111 + "--before default_reset --after hard_reset write_flash 0x0 "
@@ -89,17 +114,19 @@ def generate_build_dir(sketch_path):
89114]
90115
91116
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+ ):
94121 env = {
95122 "ARDUINO_DATA_DIR" : session_data_dir ,
96123 "ARDUINO_DOWNLOADS_DIR" : downloads_dir ,
97124 "ARDUINO_SKETCHBOOK_DIR" : session_data_dir ,
98125 }
99126
100- if index :
127+ if package_index :
101128 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 )
103130 assert run_command ("update" , custom_env = env )
104131
105132 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
115142 res = run_command (f'upload -p { upload_port } -b { fqbn } "{ sketch_path } " --dry-run -v' , custom_env = env )
116143 assert res .ok
117144
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