@@ -17,8 +17,11 @@ package packagemanager_test
1717
1818import (
1919 "fmt"
20+ "io"
2021 "net/url"
2122 "os"
23+ "runtime"
24+ "sync"
2225 "testing"
2326
2427 "github.com/arduino/arduino-cli/arduino/cores"
@@ -639,3 +642,70 @@ func TestLegacyPackageConversionToPluggableDiscovery(t *testing.T) {
639642 require .Equal (t , `"{network_cmd}" -address {upload.port.address} -port {upload.port.properties.port} -sketch "{build.path}/{build.project_name}.hex" -upload {upload.port.properties.endpoint_upload} -sync {upload.port.properties.endpoint_sync} -reset {upload.port.properties.endpoint_reset} -sync_exp {upload.port.properties.sync_return}` , platformProps .Get ("tools.avrdude__pluggable_network.upload.pattern" ))
640643 }
641644}
645+
646+ func TestRunPostInstall (t * testing.T ) {
647+ pmb := packagemanager .NewBuilder (nil , nil , nil , nil , "test" )
648+ pm := pmb .Build ()
649+ pme , release := pm .NewExplorer ()
650+ defer release ()
651+
652+ // prepare dummy post install script
653+ dir := paths .New (t .TempDir ())
654+
655+ // check that the script output is redirected to the current process
656+ // standard one
657+ outputR , outputW , err := os .Pipe ()
658+ require .NoError (t , err )
659+ errorR , errorW , err := os .Pipe ()
660+ require .NoError (t , err )
661+
662+ prevStdout , prevStderr := os .Stdout , os .Stderr
663+
664+ var stdout []byte
665+ var stderr []byte
666+ wg := sync.WaitGroup {}
667+ wg .Add (2 )
668+
669+ go func () {
670+ defer wg .Done ()
671+ var err error
672+ stdout , err = io .ReadAll (outputR )
673+ require .NoError (t , err )
674+ }()
675+
676+ go func () {
677+ defer wg .Done ()
678+ var err error
679+ stderr , err = io .ReadAll (errorR )
680+ require .NoError (t , err )
681+ }()
682+ var scriptPath * paths.Path
683+ if runtime .GOOS == "windows" {
684+ scriptPath = dir .Join ("post_install.bat" )
685+
686+ err = scriptPath .WriteFile ([]byte (
687+ `echo "sent in stdout"
688+ echo "sent in stderr" 1>&2` ))
689+ } else {
690+ scriptPath = dir .Join ("post_install.sh" )
691+ err = scriptPath .WriteFile ([]byte (
692+ `#!/bin/sh
693+ echo "sent in stdout"
694+ echo "sent in stderr" 1>&2` ))
695+ }
696+ require .NoError (t , err )
697+ err = os .Chmod (scriptPath .String (), 0777 )
698+ require .NoError (t , err )
699+ os .Stdout = outputW
700+ os .Stderr = errorW
701+ pme .RunPostInstallScript (dir )
702+
703+ outputW .Close ()
704+ errorW .Close ()
705+ wg .Wait ()
706+ os .Stdout = prevStdout
707+ os .Stderr = prevStderr
708+
709+ require .Equal (t , "sent in stdout\n " , string (stdout ))
710+ require .Equal (t , "sent in stderr\n " , string (stderr ))
711+ }
0 commit comments