17
17
import sys
18
18
import hashlib
19
19
import pytest
20
+ import os
20
21
from pathlib import Path
21
22
from typing import Union
22
23
@@ -29,107 +30,130 @@ def generate_build_dir(sketch_path):
29
30
30
31
31
32
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
+ output : Union [dict , str ], data_dir : str , upload_port : str , build_dir : str , sketch_name : str
33
34
) -> str :
34
- if isinstance (upload_tools , str ):
35
- tool = upload_tools
35
+ if isinstance (output , str ):
36
+ out = output
36
37
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 ,
40
44
).replace ("\\ " , "/" )
41
45
42
46
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
+
55
+
56
+
57
+
58
+ ]
59
+
43
60
testdata = [
44
61
(
45
- "" ,
46
62
"arduino:avr:uno" ,
47
-
48
- [],
49
63
"/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 ' ,
54
68
),
55
69
(
56
- "" ,
57
70
"arduino:avr:leonardo" ,
58
-
59
- [],
60
71
"/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 ' ,
65
79
),
66
80
(
67
- "https://adafruit.github.io/arduino-board-index/package_adafruit_index.json" ,
68
81
"adafruit:avr:flora8" ,
69
-
70
-
71
82
"/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 ' ,
76
90
),
77
91
(
78
- "https://adafruit.github.io/arduino-board-index/package_adafruit_index.json" ,
79
92
"adafruit:avr:flora8" ,
80
-
81
-
82
93
"/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 ' ,
87
101
),
88
102
(
89
- "https://dl.espressif.com/dl/package_esp32_index.json" ,
90
103
"esp32:esp32:esp32thing" ,
91
-
92
- [],
93
104
"/dev/ttyACM0" ,
94
105
{
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 ' ,
98
136
},
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"' ,
105
137
),
106
138
(
107
- "http://arduino.esp8266.com/stable/package_esp8266com_index.json" ,
108
139
"esp8266:esp8266:generic" ,
109
-
110
- [],
111
140
"/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 ' ,
118
146
),
119
147
]
120
148
121
149
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 )
123
151
def test_upload_sketch (
124
152
run_command ,
125
153
session_data_dir ,
126
154
downloads_dir ,
127
- package_index ,
128
155
fqbn ,
129
- core ,
130
- core_dependencies ,
131
156
upload_port ,
132
- upload_tools ,
133
157
output ,
134
158
):
135
159
env = {
@@ -138,15 +162,15 @@ def test_upload_sketch(
138
162
"ARDUINO_SKETCHBOOK_DIR" : session_data_dir ,
139
163
}
140
164
141
- if package_index :
165
+ # Install everything just once
166
+ if not os .path .isdir (session_data_dir + "/packages" ):
142
167
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 )
144
170
assert run_command ("update" , custom_env = env )
145
171
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 )
150
174
151
175
# Create a sketch
152
176
sketch_name = "TestSketchForUpload"
@@ -161,9 +185,8 @@ def test_upload_sketch(
161
185
162
186
generate_expected_output (
163
187
output = output ,
164
- upload_tools = upload_tools ,
165
188
data_dir = session_data_dir ,
166
189
upload_port = upload_port ,
167
190
build_dir = build_dir ,
168
191
sketch_name = sketch_name ,
169
- ) in res .stdout .replace ("\\ " , "/" )
192
+ ) in res .stdout .replace ("\\ " , "/" ). replace ( " \r " , "" )
0 commit comments