1717import sys
1818import hashlib
1919import pytest
20+ import os
2021from pathlib import Path
2122from typing import Union
2223
@@ -29,107 +30,130 @@ def generate_build_dir(sketch_path):
2930
3031
3132def generate_expected_output (
32- output : str , upload_tools : Union [dict , str ], data_dir : str , upload_port : str , build_dir : str , sketch_name : str
33+ output : Union [dict , str ], data_dir : str , upload_port : str , build_dir : str , sketch_name : str
3334) -> str :
34- if isinstance (upload_tools , str ):
35- tool = upload_tools
35+ if isinstance (output , str ):
36+ out = output
3637 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 ,
38+ out = output [sys .platform ]
39+ return out .format (
40+ data_dir = data_dir ,
41+ upload_port = upload_port ,
42+ build_dir = build_dir ,
43+ sketch_name = sketch_name ,
4044 ).replace ("\\ " , "/" )
4145
4246
47+ indexes = [
48+ "https://adafruit.github.io/arduino-board-index/package_adafruit_index.json" ,
49+ "https://dl.espressif.com/dl/package_esp32_index.json" ,
50+ "http://arduino.esp8266.com/stable/package_esp8266com_index.json" ,
51+ ]
52+
53+ cores_to_install = [
54+ "arduino:avr@1.8.3" ,
55+ "adafruit:avr@1.4.13" ,
56+ "esp32:esp32@1.0.6" ,
57+ "esp8266:esp8266@3.0.1" ,
58+ ]
59+
4360testdata = [
4461 (
45- "" ,
4662 "arduino:avr:uno" ,
47- "arduino:avr@1.8.3" ,
48- [],
4963 "/dev/ttyACM0" ,
50- '"{data_dir}/packages/arduino/tools/avrdude/6.3.0-arduino17/bin/avrdude"' ,
51- "{tool_executable} "
52- + '"-C{data_dir}/packages/arduino/tools/avrdude/6.3.0-arduino17/etc/avrdude.conf" '
53- + '-v -V -patmega328p -carduino "-P{upload_port}" -b115200 -D "- Uflash:w:{build_dir}/{sketch_name}.ino.hex:i"' ,
64+ '"{data_dir}/packages/arduino/tools/avrdude/6.3.0-arduino17/bin/avrdude" '
65+ '"-C{data_dir}/packages/arduino/tools/avrdude/6.3.0-arduino17/etc/avrdude.conf" '
66+ '-v -V -patmega328p -carduino "-P/dev/ttyACM0" -b115200 -D '
67+ '"- Uflash:w:{build_dir}/{sketch_name}.ino.hex:i"\n ' ,
5468 ),
5569 (
56- "" ,
5770 "arduino:avr:leonardo" ,
58- "arduino:avr@1.8.3" ,
59- [],
6071 "/dev/ttyACM999" ,
61- '"{data_dir}/packages/arduino/tools/avrdude/6.3.0-arduino17/bin/avrdude"' ,
62- "{tool_executable} "
63- + '"-C{data_dir}/packages/arduino/tools/avrdude/6.3.0-arduino17/etc/avrdude.conf" '
64- + '-v -V -patmega32u4 -cavr109 "-P{upload_port}0" -b57600 -D "-Uflash:w:{build_dir}/{sketch_name}.ino.hex:i"' ,
72+ "Performing 1200-bps touch reset on serial port /dev/ttyACM999\n "
73+ "Waiting for upload port...\n "
74+ "Upload port found on /dev/ttyACM9990\n "
75+ '"{data_dir}/packages/arduino/tools/avrdude/6.3.0-arduino17/bin/avrdude" '
76+ '"-C{data_dir}/packages/arduino/tools/avrdude/6.3.0-arduino17/etc/avrdude.conf" '
77+ '-v -V -patmega32u4 -cavr109 "-P/dev/ttyACM9990" -b57600 -D '
78+ '"-Uflash:w:{build_dir}/{sketch_name}.ino.hex:i"\n ' ,
6579 ),
6680 (
67- "https://adafruit.github.io/arduino-board-index/package_adafruit_index.json" ,
6881 "adafruit:avr:flora8" ,
69- "adafruit:avr@1.4.13" ,
70- ["arduino:avr@1.8.3" ],
7182 "/dev/ttyACM0" ,
72- '"{data_dir}/packages/arduino/tools/avrdude/6.3.0-arduino17/bin/avrdude"' ,
73- "{tool_executable} "
74- + '"-C{data_dir}/packages/arduino/tools/avrdude/6.3.0-arduino17/etc/avrdude.conf" '
75- + '-v -patmega32u4 -cavr109 -P{upload_port} -b57600 -D "-Uflash:w:{build_dir}/{sketch_name}.ino.hex:i"' ,
83+ "Performing 1200-bps touch reset on serial port /dev/ttyACM0\n "
84+ "Waiting for upload port...\n "
85+ "No upload port found, using /dev/ttyACM0 as fallback\n "
86+ '"{data_dir}/packages/arduino/tools/avrdude/6.3.0-arduino17/bin/avrdude" '
87+ '"-C{data_dir}/packages/arduino/tools/avrdude/6.3.0-arduino17/etc/avrdude.conf" '
88+ "-v -patmega32u4 -cavr109 -P/dev/ttyACM0 -b57600 -D "
89+ '"-Uflash:w:{build_dir}/{sketch_name}.ino.hex:i"\n ' ,
7690 ),
7791 (
78- "https://adafruit.github.io/arduino-board-index/package_adafruit_index.json" ,
7992 "adafruit:avr:flora8" ,
80- "adafruit:avr@1.4.13" ,
81- ["arduino:avr@1.8.3" ],
8293 "/dev/ttyACM999" ,
83- '"{data_dir}/packages/arduino/tools/avrdude/6.3.0-arduino17/bin/avrdude"' ,
84- "{tool_executable} "
85- + '"-C{data_dir}/packages/arduino/tools/avrdude/6.3.0-arduino17/etc/avrdude.conf" '
86- + '-v -patmega32u4 -cavr109 -P{upload_port}0 -b57600 -D "-Uflash:w:{build_dir}/{sketch_name}.ino.hex:i"' ,
94+ "Performing 1200-bps touch reset on serial port /dev/ttyACM999\n "
95+ "Waiting for upload port...\n "
96+ "Upload port found on /dev/ttyACM9990\n "
97+ '"{data_dir}/packages/arduino/tools/avrdude/6.3.0-arduino17/bin/avrdude" '
98+ '"-C{data_dir}/packages/arduino/tools/avrdude/6.3.0-arduino17/etc/avrdude.conf" '
99+ "-v -patmega32u4 -cavr109 -P/dev/ttyACM9990 -b57600 -D "
100+ '"-Uflash:w:{build_dir}/{sketch_name}.ino.hex:i"\n ' ,
87101 ),
88102 (
89- "https://dl.espressif.com/dl/package_esp32_index.json" ,
90103 "esp32:esp32:esp32thing" ,
91- "esp32:esp32@1.0.6" ,
92- [],
93104 "/dev/ttyACM0" ,
94105 {
95- "linux" : 'python "{data_dir}/packages/esp32/tools/esptool_py/3.0.0/esptool.py"' ,
96- "darwin" : '"{data_dir}/packages/esp32/tools/esptool_py/3.0.0/esptool.py"' ,
97- "win32" : '"{data_dir}/packages/esp32/tools/esptool_py/3.0.0/esptool.exe"' ,
106+ "linux" : "python "
107+ '"{data_dir}/packages/esp32/tools/esptool_py/3.0.0/esptool.py" '
108+ '--chip esp32 --port "/dev/ttyACM0" --baud 921600 --before '
109+ "default_reset --after hard_reset write_flash -z --flash_mode "
110+ "dio --flash_freq 80m --flash_size detect 0xe000 "
111+ '"{data_dir}/packages/esp32/hardware/esp32/1.0.6/tools/partitions/boot_app0.bin" '
112+ "0x1000 "
113+ '"{data_dir}/packages/esp32/hardware/esp32/1.0.6/tools/sdk/bin/bootloader_dio_80m.bin" '
114+ '0x10000 "{build_dir}/{sketch_name}.ino.bin" 0x8000 '
115+ '"{build_dir}/{sketch_name}.ino.partitions.bin"\n ' ,
116+ "darwin" : '"{data_dir}/packages/esp32/tools/esptool_py/3.0.0/esptool" '
117+ '--chip esp32 --port "/dev/ttyACM0" --baud 921600 --before '
118+ "default_reset --after hard_reset write_flash -z "
119+ "--flash_mode dio --flash_freq 80m --flash_size detect "
120+ "0xe000 "
121+ '"{data_dir}/packages/esp32/hardware/esp32/1.0.6/tools/partitions/boot_app0.bin" '
122+ "0x1000 "
123+ '"{data_dir}/packages/esp32/hardware/esp32/1.0.6/tools/sdk/bin/bootloader_dio_80m.bin" '
124+ '0x10000 "{build_dir}/{sketch_name}.ino.bin" 0x8000 '
125+ '"{build_dir}/{sketch_name}.ino.partitions.bin"\n ' ,
126+ "win32" : '"{data_dir}/packages/esp32/tools/esptool_py/3.0.0/esptool.exe" '
127+ '--chip esp32 --port "/dev/ttyACM0" --baud 921600 --before '
128+ "default_reset --after hard_reset write_flash -z "
129+ "--flash_mode dio --flash_freq 80m --flash_size detect "
130+ "0xe000 "
131+ '"{data_dir}/packages/esp32/hardware/esp32/1.0.6/tools/partitions/boot_app0.bin" '
132+ "0x1000 "
133+ '"{data_dir}/packages/esp32/hardware/esp32/1.0.6/tools/sdk/bin/bootloader_dio_80m.bin" '
134+ '0x10000 "{build_dir}/{sketch_name}.ino.bin" 0x8000 '
135+ '"{build_dir}/{sketch_name}.ino.partitions.bin"\n ' ,
98136 },
99- "{tool_executable} "
100- + '--chip esp32 --port "{upload_port}" --baud 921600 --before default_reset '
101- + "--after hard_reset write_flash -z --flash_mode dio --flash_freq 80m --flash_size detect 0xe000 "
102- + '"{data_dir}/packages/esp32/hardware/esp32/1.0.6/tools/partitions/boot_app0.bin" 0x1000 '
103- + '"{data_dir}/packages/esp32/hardware/esp32/1.0.6/tools/sdk/bin/bootloader_dio_80m.bin" 0x10000 '
104- + '"{build_dir}/{sketch_name}.ino.bin" 0x8000 "{build_dir}/{sketch_name}.ino.partitions.bin"' ,
105137 ),
106138 (
107- "http://arduino.esp8266.com/stable/package_esp8266com_index.json" ,
108139 "esp8266:esp8266:generic" ,
109- "esp8266:esp8266@3.0.1" ,
110- [],
111140 "/dev/ttyACM0" ,
112- '"{data_dir}/packages/esp8266/tools/python3/3.7.2-post1/python3"' ,
113- "{tool_executable} "
114- + '"{data_dir}/packages/esp8266/hardware/esp8266/3.0.1/tools/upload.py" '
115- + '--chip esp8266 --port "{upload_port}" --baud "115200" "" '
116- + "--before default_reset --after hard_reset write_flash 0x0 "
117- + '"{build_dir}/{sketch_name}.ino.bin"' ,
141+ '"{data_dir}/packages/esp8266/tools/python3/3.7.2-post1/python3" '
142+ '"{data_dir}/packages/esp8266/hardware/esp8266/3.0.1/tools/upload.py" '
143+ '--chip esp8266 --port "/dev/ttyACM0" --baud "115200" "" --before '
144+ "default_reset --after hard_reset write_flash 0x0 "
145+ '"{build_dir}/{sketch_name}.ino.bin"\n ' ,
118146 ),
119147]
120148
121149
122- @pytest .mark .parametrize ("package_index, fqbn, core, core_dependencies, upload_port, upload_tools , output" , testdata )
150+ @pytest .mark .parametrize ("fqbn, upload_port, output" , testdata )
123151def test_upload_sketch (
124152 run_command ,
125153 session_data_dir ,
126154 downloads_dir ,
127- package_index ,
128155 fqbn ,
129- core ,
130- core_dependencies ,
131156 upload_port ,
132- upload_tools ,
133157 output ,
134158):
135159 env = {
@@ -138,15 +162,15 @@ def test_upload_sketch(
138162 "ARDUINO_SKETCHBOOK_DIR" : session_data_dir ,
139163 }
140164
141- if package_index :
165+ # Install everything just once
166+ if not os .path .isdir (session_data_dir + "/packages" ):
142167 assert run_command ("config init --overwrite" , custom_env = env )
143- assert run_command (f"config add board_manager.additional_urls { package_index } " , custom_env = env )
168+ for package_index in indexes :
169+ assert run_command (f"config add board_manager.additional_urls { package_index } " , custom_env = env )
144170 assert run_command ("update" , custom_env = env )
145171
146- assert run_command (f"core install { core } " , custom_env = env )
147-
148- for d in core_dependencies :
149- assert run_command (f"core install { d } " , custom_env = env )
172+ for d in cores_to_install :
173+ assert run_command (f"core install { d } " , custom_env = env )
150174
151175 # Create a sketch
152176 sketch_name = "TestSketchForUpload"
@@ -161,9 +185,8 @@ def test_upload_sketch(
161185
162186 generate_expected_output (
163187 output = output ,
164- upload_tools = upload_tools ,
165188 data_dir = session_data_dir ,
166189 upload_port = upload_port ,
167190 build_dir = build_dir ,
168191 sketch_name = sketch_name ,
169- ) in res .stdout .replace ("\\ " , "/" )
192+ ) in res .stdout .replace ("\\ " , "/" ). replace ( " \r " , "" )
0 commit comments