@@ -23,6 +23,7 @@ import (
23
23
"fmt"
24
24
"io"
25
25
"os"
26
+ "runtime"
26
27
"strings"
27
28
"sync"
28
29
"testing"
@@ -204,32 +205,98 @@ func (cli *ArduinoCLI) convertEnvForExecutils(env map[string]string) []string {
204
205
// InstallMockedSerialDiscovery will replace the already installed serial-discovery
205
206
// with a mocked one.
206
207
func (cli * ArduinoCLI ) InstallMockedSerialDiscovery (t * testing.T ) {
208
+ fmt .Println (color .BlueString ("<<< Install mocked serial-discovery" ))
209
+
207
210
// Build mocked serial-discovery
208
- mockDir := FindRepositoryRootPath (t ).Join ("internal" , "integrationtest" , " mock_serial_discovery" )
211
+ mockDir := FindRepositoryRootPath (t ).Join ("internal" , "mock_serial_discovery" )
209
212
gobuild , err := executils .NewProcess (nil , "go" , "build" )
210
213
require .NoError (t , err )
211
214
gobuild .SetDirFromPath (mockDir )
212
215
require .NoError (t , gobuild .Run (), "Building mocked serial-discovery" )
216
+ ext := ""
217
+ if runtime .GOOS == "windows" {
218
+ ext = ".exe"
219
+ }
220
+ mockBin := mockDir .Join ("mock_serial_discovery" + ext )
221
+ require .True (t , mockBin .Exist ())
222
+ fmt .Println (color .HiBlackString (" Build of mocked serial-discovery succeeded." ))
213
223
214
224
// Install it replacing the current serial discovery
215
- mockBin := mockDir .Join ("mock_serial_discovery" )
216
225
dataDir := cli .DataDir ()
217
226
require .NotNil (t , dataDir , "data dir missing" )
218
227
serialDiscoveries , err := dataDir .Join ("packages" , "builtin" , "tools" , "serial-discovery" ).ReadDirRecursiveFiltered (
219
228
nil , paths .AndFilter (
220
- paths .FilterNames ("serial-discovery" ),
229
+ paths .FilterNames ("serial-discovery" + ext ),
221
230
paths .FilterOutDirectories (),
222
231
),
223
232
)
224
233
require .NoError (t , err , "scanning data dir for serial-discoveries" )
225
234
require .NotEmpty (t , serialDiscoveries , "no serial-discoveries found in data dir" )
226
235
for _ , serialDiscovery := range serialDiscoveries {
227
236
require .NoError (t , mockBin .CopyTo (serialDiscovery ), "installing mocked serial discovery to %s" , serialDiscovery )
237
+ fmt .Println (color .HiBlackString (" Discovery installed in " + serialDiscovery .String ()))
238
+ }
239
+ }
240
+
241
+ // InstallMockedSerialMonitor will replace the already installed serial-monitor
242
+ // with a mocked one.
243
+ func (cli * ArduinoCLI ) InstallMockedSerialMonitor (t * testing.T ) {
244
+ fmt .Println (color .BlueString ("<<< Install mocked serial-monitor" ))
245
+
246
+ // Build mocked serial-monitor
247
+ mockDir := FindRepositoryRootPath (t ).Join ("internal" , "mock_serial_monitor" )
248
+ gobuild , err := executils .NewProcess (nil , "go" , "build" )
249
+ require .NoError (t , err )
250
+ gobuild .SetDirFromPath (mockDir )
251
+ require .NoError (t , gobuild .Run (), "Building mocked serial-monitor" )
252
+ ext := ""
253
+ if runtime .GOOS == "windows" {
254
+ ext = ".exe"
255
+ }
256
+ mockBin := mockDir .Join ("mock_serial_monitor" + ext )
257
+ require .True (t , mockBin .Exist ())
258
+ fmt .Println (color .HiBlackString (" Build of mocked serial-monitor succeeded." ))
259
+
260
+ // Install it replacing the current serial monitor
261
+ dataDir := cli .DataDir ()
262
+ require .NotNil (t , dataDir , "data dir missing" )
263
+ serialMonitors , err := dataDir .Join ("packages" , "builtin" , "tools" , "serial-monitor" ).ReadDirRecursiveFiltered (
264
+ nil , paths .AndFilter (
265
+ paths .FilterNames ("serial-monitor" + ext ),
266
+ paths .FilterOutDirectories (),
267
+ ),
268
+ )
269
+ require .NoError (t , err , "scanning data dir for serial-monitor" )
270
+ require .NotEmpty (t , serialMonitors , "no serial-monitor found in data dir" )
271
+ for _ , serialMonitor := range serialMonitors {
272
+ require .NoError (t , mockBin .CopyTo (serialMonitor ), "installing mocked serial monitor to %s" , serialMonitor )
273
+ fmt .Println (color .HiBlackString (" Monitor installed in " + serialMonitor .String ()))
228
274
}
229
275
}
230
276
231
277
// RunWithCustomEnv executes the given arduino-cli command with the given custom env and returns the output.
232
278
func (cli * ArduinoCLI ) RunWithCustomEnv (env map [string ]string , args ... string ) ([]byte , []byte , error ) {
279
+ var stdoutBuf , stderrBuf bytes.Buffer
280
+ err := cli .run (& stdoutBuf , & stderrBuf , nil , env , args ... )
281
+
282
+ errBuf := stderrBuf .Bytes ()
283
+ cli .t .NotContains (string (errBuf ), "panic: runtime error:" , "arduino-cli panicked" )
284
+
285
+ return stdoutBuf .Bytes (), errBuf , err
286
+ }
287
+
288
+ // RunWithCustomInput executes the given arduino-cli command pushing the given input stream and returns the output.
289
+ func (cli * ArduinoCLI ) RunWithCustomInput (in io.Reader , args ... string ) ([]byte , []byte , error ) {
290
+ var stdoutBuf , stderrBuf bytes.Buffer
291
+ err := cli .run (& stdoutBuf , & stderrBuf , in , cli .cliEnvVars , args ... )
292
+
293
+ errBuf := stderrBuf .Bytes ()
294
+ cli .t .NotContains (string (errBuf ), "panic: runtime error:" , "arduino-cli panicked" )
295
+
296
+ return stdoutBuf .Bytes (), errBuf , err
297
+ }
298
+
299
+ func (cli * ArduinoCLI ) run (stdoutBuff , stderrBuff io.Writer , stdinBuff io.Reader , env map [string ]string , args ... string ) error {
233
300
if cli .cliConfigPath != nil {
234
301
args = append ([]string {"--config-file" , cli .cliConfigPath .String ()}, args ... )
235
302
}
@@ -240,35 +307,44 @@ func (cli *ArduinoCLI) RunWithCustomEnv(env map[string]string, args ...string) (
240
307
cli .t .NoError (err )
241
308
stderr , err := cliProc .StderrPipe ()
242
309
cli .t .NoError (err )
243
- _ , err = cliProc .StdinPipe ()
310
+ stdin , err : = cliProc .StdinPipe ()
244
311
cli .t .NoError (err )
245
312
cliProc .SetDir (cli .WorkingDir ().String ())
246
313
247
314
cli .t .NoError (cliProc .Start ())
248
315
249
- var stdoutBuf , stderrBuf bytes.Buffer
250
316
var wg sync.WaitGroup
251
317
wg .Add (2 )
252
318
go func () {
253
319
defer wg .Done ()
254
- if _ , err := io .Copy (& stdoutBuf , io .TeeReader (stdout , os .Stdout )); err != nil {
320
+ if stdoutBuff == nil {
321
+ stdoutBuff = io .Discard
322
+ }
323
+ if _ , err := io .Copy (stdoutBuff , io .TeeReader (stdout , os .Stdout )); err != nil {
255
324
fmt .Println (color .HiBlackString ("<<< stdout copy error:" ), err )
256
325
}
257
326
}()
258
327
go func () {
259
328
defer wg .Done ()
260
- if _ , err := io .Copy (& stderrBuf , io .TeeReader (stderr , os .Stderr )); err != nil {
329
+ if stderrBuff == nil {
330
+ stderrBuff = io .Discard
331
+ }
332
+ if _ , err := io .Copy (stderrBuff , io .TeeReader (stderr , os .Stderr )); err != nil {
261
333
fmt .Println (color .HiBlackString ("<<< stderr copy error:" ), err )
262
334
}
263
335
}()
336
+ if stdinBuff != nil {
337
+ go func () {
338
+ if _ , err := io .Copy (stdin , stdinBuff ); err != nil {
339
+ fmt .Println (color .HiBlackString ("<<< stdin copy error:" ), err )
340
+ }
341
+ }()
342
+ }
264
343
wg .Wait ()
265
344
cliErr := cliProc .Wait ()
266
345
fmt .Println (color .HiBlackString ("<<< Run completed (err = %v)" , cliErr ))
267
346
268
- errBuf := stderrBuf .Bytes ()
269
- cli .t .NotContains (string (errBuf ), "panic: runtime error:" , "arduino-cli panicked" )
270
-
271
- return stdoutBuf .Bytes (), errBuf , cliErr
347
+ return cliErr
272
348
}
273
349
274
350
// StartDaemon starts the Arduino CLI daemon. It returns the address of the daemon.
0 commit comments