Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit e178905

Browse files
committedNov 3, 2022
Merge all test files that share a package into one
Having different test files that shared the same package was inefficient, because the whole package test was run one time for each file. This enhancement avoids repeating the same tests more than once.
1 parent 665c1dd commit e178905

12 files changed

+643
-841
lines changed
 

‎internal/integrationtest/board/board_list_test.go

Lines changed: 0 additions & 63 deletions
This file was deleted.

‎internal/integrationtest/board/board_test.go

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,45 @@ import (
2929
"gopkg.in/src-d/go-git.v4/plumbing"
3030
)
3131

32+
func TestCorrectBoardListOrdering(t *testing.T) {
33+
env, cli := integrationtest.CreateArduinoCLIWithEnvironment(t)
34+
defer env.CleanUp()
35+
36+
_, _, err := cli.Run("core", "install", "arduino:avr")
37+
require.NoError(t, err)
38+
jsonOut, _, err := cli.Run("board", "listall", "--format", "json")
39+
require.NoError(t, err)
40+
requirejson.Query(t, jsonOut, "[.boards[] | .fqbn]", `[
41+
"arduino:avr:yun",
42+
"arduino:avr:uno",
43+
"arduino:avr:unomini",
44+
"arduino:avr:diecimila",
45+
"arduino:avr:nano",
46+
"arduino:avr:mega",
47+
"arduino:avr:megaADK",
48+
"arduino:avr:leonardo",
49+
"arduino:avr:leonardoeth",
50+
"arduino:avr:micro",
51+
"arduino:avr:esplora",
52+
"arduino:avr:mini",
53+
"arduino:avr:ethernet",
54+
"arduino:avr:fio",
55+
"arduino:avr:bt",
56+
"arduino:avr:LilyPadUSB",
57+
"arduino:avr:lilypad",
58+
"arduino:avr:pro",
59+
"arduino:avr:atmegang",
60+
"arduino:avr:robotControl",
61+
"arduino:avr:robotMotor",
62+
"arduino:avr:gemma",
63+
"arduino:avr:circuitplay32u4cat",
64+
"arduino:avr:yunmini",
65+
"arduino:avr:chiwawa",
66+
"arduino:avr:one",
67+
"arduino:avr:unowifi"
68+
]`)
69+
}
70+
3271
func TestBoardList(t *testing.T) {
3372
if os.Getenv("CI") != "" {
3473
t.Skip("VMs have no serial ports")

‎internal/integrationtest/compile/compile_part_2_test.go

Lines changed: 0 additions & 162 deletions
This file was deleted.

‎internal/integrationtest/compile/compile_part_3_test.go

Lines changed: 0 additions & 133 deletions
This file was deleted.

‎internal/integrationtest/compile/compile_part_1_test.go renamed to ‎internal/integrationtest/compile/compile_test.go

Lines changed: 246 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@ import (
2727
"github.com/arduino/go-paths-helper"
2828
"github.com/stretchr/testify/require"
2929
"go.bug.st/testifyjson/requirejson"
30+
"gopkg.in/src-d/go-git.v4"
31+
"gopkg.in/src-d/go-git.v4/plumbing"
3032
)
3133

3234
func TestCompile(t *testing.T) {
@@ -711,3 +713,247 @@ func compileUsingBoardsLocalTxt(t *testing.T, env *integrationtest.Environment,
711713
_, _, err = cli.Run("compile", "--clean", "-b", fqbn, sketchPath.String())
712714
require.NoError(t, err)
713715
}
716+
717+
func TestCompileWithoutPrecompiledLibraries(t *testing.T) {
718+
env, cli := integrationtest.CreateArduinoCLIWithEnvironment(t)
719+
defer env.CleanUp()
720+
721+
// Init the environment explicitly
722+
url := "https://adafruit.github.io/arduino-board-index/package_adafruit_index.json"
723+
_, _, err := cli.Run("core", "update-index", "--additional-urls="+url)
724+
require.NoError(t, err)
725+
_, _, err = cli.Run("core", "install", "arduino:mbed@1.3.1", "--additional-urls="+url)
726+
require.NoError(t, err)
727+
728+
// // Precompiled version of Arduino_TensorflowLite
729+
// _, _, err = cli.Run("lib", "install", "Arduino_LSM9DS1")
730+
// require.NoError(t, err)
731+
// _, _, err = cli.Run("lib", "install", "Arduino_TensorflowLite@2.1.1-ALPHA-precompiled")
732+
// require.NoError(t, err)
733+
734+
// sketchPath := cli.SketchbookDir().Join("libraries", "Arduino_TensorFlowLite", "examples", "hello_world")
735+
// _, _, err = cli.Run("compile", "-b", "arduino:mbed:nano33ble", sketchPath.String())
736+
// require.NoError(t, err)
737+
738+
_, _, err = cli.Run("core", "install", "arduino:samd@1.8.7", "--additional-urls="+url)
739+
require.NoError(t, err)
740+
// _, _, err = cli.Run("core", "install", "adafruit:samd@1.6.4", "--additional-urls="+url)
741+
// require.NoError(t, err)
742+
// // should work on adafruit too after https://github.com/arduino/arduino-cli/pull/1134
743+
// _, _, err = cli.Run("compile", "-b", "adafruit:samd:adafruit_feather_m4", sketchPath.String())
744+
// require.NoError(t, err)
745+
746+
// // Non-precompiled version of Arduino_TensorflowLite
747+
// _, _, err = cli.Run("lib", "install", "Arduino_TensorflowLite@2.1.0-ALPHA")
748+
// require.NoError(t, err)
749+
// _, _, err = cli.Run("compile", "-b", "arduino:mbed:nano33ble", sketchPath.String())
750+
// require.NoError(t, err)
751+
// _, _, err = cli.Run("compile", "-b", "adafruit:samd:adafruit_feather_m4", sketchPath.String())
752+
// require.NoError(t, err)
753+
754+
// Bosch sensor library
755+
_, _, err = cli.Run("lib", "install", "BSEC Software Library@1.5.1474")
756+
require.NoError(t, err)
757+
sketchPath := cli.SketchbookDir().Join("libraries", "BSEC_Software_Library", "examples", "basic")
758+
_, _, err = cli.Run("compile", "-b", "arduino:samd:mkr1000", sketchPath.String())
759+
require.NoError(t, err)
760+
_, _, err = cli.Run("compile", "-b", "arduino:mbed:nano33ble", sketchPath.String())
761+
require.NoError(t, err)
762+
763+
// USBBlaster library
764+
_, _, err = cli.Run("lib", "install", "USBBlaster@1.0.0")
765+
require.NoError(t, err)
766+
sketchPath = cli.SketchbookDir().Join("libraries", "USBBlaster", "examples", "USB_Blaster")
767+
_, _, err = cli.Run("compile", "-b", "arduino:samd:mkrvidor4000", sketchPath.String())
768+
require.NoError(t, err)
769+
}
770+
771+
func TestCompileWithCustomLibraries(t *testing.T) {
772+
env, cli := integrationtest.CreateArduinoCLIWithEnvironment(t)
773+
defer env.CleanUp()
774+
775+
// Creates config with additional URL to install necessary core
776+
url := "http://arduino.esp8266.com/stable/package_esp8266com_index.json"
777+
_, _, err := cli.Run("config", "init", "--dest-dir", ".", "--additional-urls", url)
778+
require.NoError(t, err)
779+
780+
// Init the environment explicitly
781+
_, _, err = cli.Run("update")
782+
require.NoError(t, err)
783+
784+
_, _, err = cli.Run("core", "install", "esp8266:esp8266")
785+
require.NoError(t, err)
786+
787+
sketchName := "sketch_with_multiple_custom_libraries"
788+
sketchPath := cli.CopySketch(sketchName)
789+
fqbn := "esp8266:esp8266:nodemcu:xtal=80,vt=heap,eesz=4M1M,wipe=none,baud=115200"
790+
791+
firstLib := sketchPath.Join("libraries1")
792+
secondLib := sketchPath.Join("libraries2")
793+
_, _, err = cli.Run("compile", "--libraries", firstLib.String(), "--libraries", secondLib.String(), "-b", fqbn, sketchPath.String())
794+
require.NoError(t, err)
795+
}
796+
797+
func TestCompileWithArchivesAndLongPaths(t *testing.T) {
798+
env, cli := integrationtest.CreateArduinoCLIWithEnvironment(t)
799+
defer env.CleanUp()
800+
801+
// Creates config with additional URL to install necessary core
802+
url := "http://arduino.esp8266.com/stable/package_esp8266com_index.json"
803+
_, _, err := cli.Run("config", "init", "--dest-dir", ".", "--additional-urls", url)
804+
require.NoError(t, err)
805+
806+
// Init the environment explicitly
807+
_, _, err = cli.Run("update")
808+
require.NoError(t, err)
809+
810+
// Install core to compile
811+
_, _, err = cli.Run("core", "install", "esp8266:esp8266@2.7.4")
812+
require.NoError(t, err)
813+
814+
// Install test library
815+
_, _, err = cli.Run("lib", "install", "ArduinoIoTCloud")
816+
require.NoError(t, err)
817+
818+
stdout, _, err := cli.Run("lib", "examples", "ArduinoIoTCloud", "--format", "json")
819+
require.NoError(t, err)
820+
var libOutput []map[string]interface{}
821+
err = json.Unmarshal(stdout, &libOutput)
822+
require.NoError(t, err)
823+
sketchPath := paths.New(libOutput[0]["library"].(map[string]interface{})["install_dir"].(string))
824+
sketchPath = sketchPath.Join("examples", "ArduinoIoTCloud-Advanced")
825+
826+
_, _, err = cli.Run("compile", "-b", "esp8266:esp8266:huzzah", sketchPath.String())
827+
require.NoError(t, err)
828+
}
829+
830+
func TestCompileWithPrecompileLibrary(t *testing.T) {
831+
env, cli := integrationtest.CreateArduinoCLIWithEnvironment(t)
832+
defer env.CleanUp()
833+
834+
_, _, err := cli.Run("update")
835+
require.NoError(t, err)
836+
837+
_, _, err = cli.Run("core", "install", "arduino:samd@1.8.11")
838+
require.NoError(t, err)
839+
fqbn := "arduino:samd:mkrzero"
840+
841+
// Install precompiled library
842+
// For more information see:
843+
// https://arduino.github.io/arduino-cli/latest/library-specification/#precompiled-binaries
844+
_, _, err = cli.Run("lib", "install", "BSEC Software Library@1.5.1474")
845+
require.NoError(t, err)
846+
sketchFolder := cli.SketchbookDir().Join("libraries", "BSEC_Software_Library", "examples", "basic")
847+
848+
// Compile and verify dependencies detection for fully precompiled library is not skipped
849+
stdout, _, err := cli.Run("compile", "-b", fqbn, sketchFolder.String(), "-v")
850+
require.NoError(t, err)
851+
require.NotContains(t, string(stdout), "Skipping dependencies detection for precompiled library BSEC Software Library")
852+
}
853+
854+
func TestCompileWithFullyPrecompiledLibrary(t *testing.T) {
855+
env, cli := integrationtest.CreateArduinoCLIWithEnvironment(t)
856+
defer env.CleanUp()
857+
858+
_, _, err := cli.Run("update")
859+
require.NoError(t, err)
860+
861+
_, _, err = cli.Run("core", "install", "arduino:mbed@1.3.1")
862+
require.NoError(t, err)
863+
fqbn := "arduino:mbed:nano33ble"
864+
865+
// Create settings with library unsafe install set to true
866+
envVar := cli.GetDefaultEnv()
867+
envVar["ARDUINO_LIBRARY_ENABLE_UNSAFE_INSTALL"] = "true"
868+
_, _, err = cli.RunWithCustomEnv(envVar, "config", "init", "--dest-dir", ".")
869+
require.NoError(t, err)
870+
871+
// Install fully precompiled library
872+
// For more information see:
873+
// https://arduino.github.io/arduino-cli/latest/library-specification/#precompiled-binaries
874+
wd, err := paths.Getwd()
875+
require.NoError(t, err)
876+
_, _, err = cli.Run("lib", "install", "--zip-path", wd.Parent().Join("testdata", "Arduino_TensorFlowLite-2.1.0-ALPHA-precompiled.zip").String())
877+
require.NoError(t, err)
878+
sketchFolder := cli.SketchbookDir().Join("libraries", "Arduino_TensorFlowLite-2.1.0-ALPHA-precompiled", "examples", "hello_world")
879+
880+
// Install example dependency
881+
_, _, err = cli.Run("lib", "install", "Arduino_LSM9DS1")
882+
require.NoError(t, err)
883+
884+
// Compile and verify dependencies detection for fully precompiled library is skipped
885+
stdout, _, err := cli.Run("compile", "-b", fqbn, sketchFolder.String(), "-v")
886+
require.NoError(t, err)
887+
require.Contains(t, string(stdout), "Skipping dependencies detection for precompiled library Arduino_TensorFlowLite")
888+
}
889+
890+
func TestCompileManuallyInstalledPlatform(t *testing.T) {
891+
env, cli := integrationtest.CreateArduinoCLIWithEnvironment(t)
892+
defer env.CleanUp()
893+
894+
_, _, err := cli.Run("update")
895+
require.NoError(t, err)
896+
897+
sketchName := "CompileSketchManuallyInstalledPlatformUsingPlatformLocalTxt"
898+
sketchPath := cli.SketchbookDir().Join(sketchName)
899+
fqbn := "arduino-beta-development:avr:uno"
900+
_, _, err = cli.Run("sketch", "new", sketchPath.String())
901+
require.NoError(t, err)
902+
903+
// Manually installs a core in sketchbooks hardware folder
904+
gitUrl := "https://github.com/arduino/ArduinoCore-avr.git"
905+
repoDir := cli.SketchbookDir().Join("hardware", "arduino-beta-development", "avr")
906+
_, err = git.PlainClone(repoDir.String(), false, &git.CloneOptions{
907+
URL: gitUrl,
908+
ReferenceName: plumbing.NewTagReferenceName("1.8.3"),
909+
})
910+
require.NoError(t, err)
911+
912+
// Installs also the same core via CLI so all the necessary tools are installed
913+
_, _, err = cli.Run("core", "install", "arduino:avr@1.8.3")
914+
require.NoError(t, err)
915+
916+
// Verifies compilation works without issues
917+
_, _, err = cli.Run("compile", "--clean", "-b", fqbn, sketchPath.String())
918+
require.NoError(t, err)
919+
}
920+
921+
func TestCompileManuallyInstalledPlatformUsingPlatformLocalTxt(t *testing.T) {
922+
env, cli := integrationtest.CreateArduinoCLIWithEnvironment(t)
923+
defer env.CleanUp()
924+
925+
_, _, err := cli.Run("update")
926+
require.NoError(t, err)
927+
928+
sketchName := "CompileSketchManuallyInstalledPlatformUsingPlatformLocalTxt"
929+
sketchPath := cli.SketchbookDir().Join(sketchName)
930+
fqbn := "arduino-beta-development:avr:uno"
931+
_, _, err = cli.Run("sketch", "new", sketchPath.String())
932+
require.NoError(t, err)
933+
934+
// Manually installs a core in sketchbooks hardware folder
935+
gitUrl := "https://github.com/arduino/ArduinoCore-avr.git"
936+
repoDir := cli.SketchbookDir().Join("hardware", "arduino-beta-development", "avr")
937+
_, err = git.PlainClone(repoDir.String(), false, &git.CloneOptions{
938+
URL: gitUrl,
939+
ReferenceName: plumbing.NewTagReferenceName("1.8.3"),
940+
})
941+
require.NoError(t, err)
942+
943+
// Installs also the same core via CLI so all the necessary tools are installed
944+
_, _, err = cli.Run("core", "install", "arduino:avr@1.8.3")
945+
require.NoError(t, err)
946+
947+
// Verifies compilation works without issues
948+
_, _, err = cli.Run("compile", "--clean", "-b", fqbn, sketchPath.String())
949+
require.NoError(t, err)
950+
951+
// Overrides default platform compiler with an unexisting one
952+
platformLocalTxt := repoDir.Join("platform.local.txt")
953+
platformLocalTxt.WriteFile([]byte("compiler.c.cmd=my-compiler-that-does-not-exist"))
954+
955+
// Verifies compilation now fails because compiler is not found
956+
_, stderr, err := cli.Run("compile", "--clean", "-b", fqbn, sketchPath.String())
957+
require.Error(t, err)
958+
require.Contains(t, string(stderr), "my-compiler-that-does-not-exist")
959+
}

‎internal/integrationtest/core/core_list_test.go

Lines changed: 0 additions & 40 deletions
This file was deleted.

‎internal/integrationtest/core/core_test.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,21 @@ import (
2626
"go.bug.st/testifyjson/requirejson"
2727
)
2828

29+
func TestCorrectHandlingOfPlatformVersionProperty(t *testing.T) {
30+
// See: https://github.com/arduino/arduino-cli/issues/1823
31+
env, cli := integrationtest.CreateArduinoCLIWithEnvironment(t)
32+
defer env.CleanUp()
33+
34+
// Copy test platform
35+
testPlatform := paths.New("testdata", "issue_1823", "DxCore-dev")
36+
require.NoError(t, testPlatform.CopyDirTo(cli.SketchbookDir().Join("hardware", "DxCore-dev")))
37+
38+
// Trigger problematic call
39+
out, _, err := cli.Run("core", "list", "--format", "json")
40+
require.NoError(t, err)
41+
requirejson.Contains(t, out, `[{"id":"DxCore-dev:megaavr","installed":"1.4.10","name":"DxCore"}]`)
42+
}
43+
2944
func TestCoreSearch(t *testing.T) {
3045
env, cli := integrationtest.CreateArduinoCLIWithEnvironment(t)
3146
defer env.CleanUp()

‎internal/integrationtest/daemon/daemon_board_watch_test.go

Lines changed: 0 additions & 82 deletions
This file was deleted.

‎internal/integrationtest/daemon/daemon_compile_test.go

Lines changed: 0 additions & 127 deletions
This file was deleted.

‎internal/integrationtest/daemon/daemon_core_test.go

Lines changed: 0 additions & 78 deletions
This file was deleted.

‎internal/integrationtest/daemon/daemon_lib_install_test.go

Lines changed: 0 additions & 156 deletions
This file was deleted.

‎internal/integrationtest/daemon/daemon_test.go

Lines changed: 343 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,73 @@
1616
package daemon_test
1717

1818
import (
19+
"context"
20+
"fmt"
21+
"io"
1922
"testing"
23+
"time"
2024

2125
"github.com/arduino/arduino-cli/internal/integrationtest"
26+
"github.com/arduino/arduino-cli/rpc/cc/arduino/cli/commands/v1"
27+
"github.com/arduino/go-paths-helper"
2228
"github.com/stretchr/testify/require"
2329
)
2430

31+
func TestArduinoCliDaemon(t *testing.T) {
32+
// See: https://github.com/arduino/arduino-cli/pull/1804
33+
34+
t.SkipNow() // TO BE Removed once the bug is fixed
35+
36+
env, cli := createEnvForDaemon(t)
37+
defer env.CleanUp()
38+
39+
grpcInst := cli.Create()
40+
require.NoError(t, grpcInst.Init("", "", func(ir *commands.InitResponse) {
41+
fmt.Printf("INIT> %v\n", ir.GetMessage())
42+
}))
43+
44+
// Run a one-shot board list
45+
boardListResp, err := grpcInst.BoardList(time.Second)
46+
require.NoError(t, err)
47+
fmt.Printf("Got boardlist response with %d ports\n", len(boardListResp.GetPorts()))
48+
49+
// Run a one-shot board list again (should not fail)
50+
boardListResp, err = grpcInst.BoardList(time.Second)
51+
require.NoError(t, err)
52+
fmt.Printf("Got boardlist response with %d ports\n", len(boardListResp.GetPorts()))
53+
54+
testWatcher := func() {
55+
// Run watcher
56+
watcher, err := grpcInst.BoardListWatch()
57+
require.NoError(t, err)
58+
ctx, cancel := context.WithCancel(context.Background())
59+
go func() {
60+
defer cancel()
61+
for {
62+
msg, err := watcher.Recv()
63+
if err == io.EOF {
64+
fmt.Println("Watcher EOF")
65+
return
66+
}
67+
require.Empty(t, msg.Error, "Board list watcher returned an error")
68+
require.NoError(t, err, "BoardListWatch grpc call returned an error")
69+
fmt.Printf("WATCH> %v\n", msg)
70+
}
71+
}()
72+
time.Sleep(time.Second)
73+
require.NoError(t, watcher.CloseSend())
74+
select {
75+
case <-ctx.Done():
76+
// all right!
77+
case <-time.After(time.Second):
78+
require.Fail(t, "BoardListWatch didn't close")
79+
}
80+
}
81+
82+
testWatcher()
83+
testWatcher()
84+
}
85+
2586
// createEnvForDaemon performs the minimum required operations to start the arduino-cli daemon.
2687
// It returns a testsuite.Environment and an ArduinoCLI client to perform the integration tests.
2788
// The Environment must be disposed by calling the CleanUp method via defer.
@@ -39,3 +100,285 @@ func createEnvForDaemon(t *testing.T) (*integrationtest.Environment, *integratio
39100
_ = cli.StartDaemon(false)
40101
return env, cli
41102
}
103+
104+
func TestDaemonCompileOptions(t *testing.T) {
105+
// See: https://github.com/arduino/arduino-cli/issues/1614
106+
// See: https://github.com/arduino/arduino-cli/pull/1820
107+
108+
env, cli := createEnvForDaemon(t)
109+
defer env.CleanUp()
110+
111+
grpcInst := cli.Create()
112+
require.NoError(t, grpcInst.Init("", "", func(ir *commands.InitResponse) {
113+
fmt.Printf("INIT> %v\n", ir.GetMessage())
114+
}))
115+
116+
plInst, err := grpcInst.PlatformInstall(context.Background(), "arduino", "avr", "1.8.5", true)
117+
require.NoError(t, err)
118+
for {
119+
msg, err := plInst.Recv()
120+
if err == io.EOF {
121+
break
122+
}
123+
require.NoError(t, err)
124+
fmt.Printf("INSTALL> %v\n", msg)
125+
}
126+
127+
// Install boards.local.txt to trigger bug
128+
platformLocalTxt := paths.New("testdata", "boards.local.txt-issue1614")
129+
err = platformLocalTxt.CopyTo(cli.DataDir().
130+
Join("packages", "arduino", "hardware", "avr", "1.8.5", "boards.local.txt"))
131+
require.NoError(t, err)
132+
133+
// Re-init instance to update changes
134+
require.NoError(t, grpcInst.Init("", "", func(ir *commands.InitResponse) {
135+
fmt.Printf("INIT> %v\n", ir.GetMessage())
136+
}))
137+
138+
// Build sketch (with errors)
139+
sk := paths.New("testdata", "bare_minimum")
140+
compile, err := grpcInst.Compile(context.Background(), "arduino:avr:uno:some_menu=bad", sk.String())
141+
require.NoError(t, err)
142+
for {
143+
msg, err := compile.Recv()
144+
if err == io.EOF {
145+
require.FailNow(t, "Expected compilation failure", "compilation succeeded")
146+
break
147+
}
148+
if err != nil {
149+
fmt.Println("COMPILE ERROR>", err)
150+
break
151+
}
152+
if msg.ErrStream != nil {
153+
fmt.Printf("COMPILE> %v\n", string(msg.GetErrStream()))
154+
}
155+
}
156+
157+
// Build sketch (without errors)
158+
compile, err = grpcInst.Compile(context.Background(), "arduino:avr:uno:some_menu=good", sk.String())
159+
require.NoError(t, err)
160+
for {
161+
msg, err := compile.Recv()
162+
if err == io.EOF {
163+
break
164+
}
165+
require.NoError(t, err)
166+
if msg.ErrStream != nil {
167+
fmt.Printf("COMPILE> %v\n", string(msg.GetErrStream()))
168+
}
169+
}
170+
}
171+
172+
func TestDaemonCompileAfterFailedLibInstall(t *testing.T) {
173+
// See: https://github.com/arduino/arduino-cli/issues/1812
174+
175+
env, cli := createEnvForDaemon(t)
176+
defer env.CleanUp()
177+
178+
grpcInst := cli.Create()
179+
require.NoError(t, grpcInst.Init("", "", func(ir *commands.InitResponse) {
180+
fmt.Printf("INIT> %v\n", ir.GetMessage())
181+
}))
182+
183+
// Build sketch (with errors)
184+
sk := paths.New("testdata", "bare_minimum")
185+
compile, err := grpcInst.Compile(context.Background(), "", sk.String())
186+
require.NoError(t, err)
187+
for {
188+
msg, err := compile.Recv()
189+
if err == io.EOF {
190+
require.FailNow(t, "Expected compilation failure", "compilation succeeded")
191+
break
192+
}
193+
if err != nil {
194+
fmt.Println("COMPILE ERROR>", err)
195+
require.Contains(t, err.Error(), "Missing FQBN")
196+
break
197+
}
198+
if msg.ErrStream != nil {
199+
fmt.Printf("COMPILE> %v\n", string(msg.GetErrStream()))
200+
}
201+
}
202+
}
203+
204+
func TestDaemonCoreUpdateIndex(t *testing.T) {
205+
env, cli := createEnvForDaemon(t)
206+
defer env.CleanUp()
207+
208+
grpcInst := cli.Create()
209+
require.NoError(t, grpcInst.Init("", "", func(ir *commands.InitResponse) {
210+
fmt.Printf("INIT> %v\n", ir.GetMessage())
211+
}))
212+
213+
// Set extra indexes
214+
err := cli.SetValue(
215+
"board_manager.additional_urls", ""+
216+
`["http://arduino.esp8266.com/stable/package_esp8266com_index.json",`+
217+
` "http://downloads.arduino.cc/package_inexistent_index.json"]`)
218+
require.NoError(t, err)
219+
220+
analyzeUpdateIndexClient := func(cl commands.ArduinoCoreService_UpdateIndexClient) (map[string]*commands.DownloadProgressEnd, error) {
221+
analyzer := NewDownloadProgressAnalyzer(t)
222+
for {
223+
msg, err := cl.Recv()
224+
// fmt.Println("DOWNLOAD>", msg)
225+
if err == io.EOF {
226+
return analyzer.Results, nil
227+
}
228+
if err != nil {
229+
return analyzer.Results, err
230+
}
231+
require.NoError(t, err)
232+
analyzer.Process(msg.GetDownloadProgress())
233+
}
234+
}
235+
236+
{
237+
cl, err := grpcInst.UpdateIndex(context.Background(), true)
238+
require.NoError(t, err)
239+
res, err := analyzeUpdateIndexClient(cl)
240+
require.NoError(t, err)
241+
require.Len(t, res, 1)
242+
require.True(t, res["https://downloads.arduino.cc/packages/package_index.tar.bz2"].Success)
243+
}
244+
{
245+
cl, err := grpcInst.UpdateIndex(context.Background(), false)
246+
require.NoError(t, err)
247+
res, err := analyzeUpdateIndexClient(cl)
248+
require.Error(t, err)
249+
require.Len(t, res, 3)
250+
require.True(t, res["https://downloads.arduino.cc/packages/package_index.tar.bz2"].Success)
251+
require.True(t, res["http://arduino.esp8266.com/stable/package_esp8266com_index.json"].Success)
252+
require.False(t, res["http://downloads.arduino.cc/package_inexistent_index.json"].Success)
253+
}
254+
}
255+
256+
func TestDaemonBundleLibInstall(t *testing.T) {
257+
env, cli := createEnvForDaemon(t)
258+
defer env.CleanUp()
259+
260+
grpcInst := cli.Create()
261+
require.NoError(t, grpcInst.Init("", "", func(ir *commands.InitResponse) {
262+
fmt.Printf("INIT> %v\n", ir.GetMessage())
263+
}))
264+
265+
// Install libraries in bundled dir
266+
{
267+
instCl, err := grpcInst.LibraryInstall(context.Background(), "Arduino_BuiltIn", "", false, false, true)
268+
require.NoError(t, err)
269+
for {
270+
msg, err := instCl.Recv()
271+
if err == io.EOF {
272+
break
273+
}
274+
require.NoError(t, err)
275+
fmt.Printf("LIB INSTALL> %+v\n", msg)
276+
}
277+
}
278+
279+
// Check if libraries are installed as expected
280+
{
281+
resp, err := grpcInst.LibraryList(context.Background(), "", "", true, false)
282+
require.NoError(t, err)
283+
libsAndLocation := map[string]commands.LibraryLocation{}
284+
for _, lib := range resp.GetInstalledLibraries() {
285+
libsAndLocation[lib.Library.Name] = lib.Library.Location
286+
}
287+
require.Contains(t, libsAndLocation, "Ethernet")
288+
require.Contains(t, libsAndLocation, "SD")
289+
require.Contains(t, libsAndLocation, "Firmata")
290+
require.Equal(t, libsAndLocation["Ethernet"], commands.LibraryLocation_LIBRARY_LOCATION_BUILTIN)
291+
require.Equal(t, libsAndLocation["SD"], commands.LibraryLocation_LIBRARY_LOCATION_BUILTIN)
292+
require.Equal(t, libsAndLocation["Firmata"], commands.LibraryLocation_LIBRARY_LOCATION_BUILTIN)
293+
}
294+
295+
// Install a library in sketchbook to override bundled
296+
{
297+
instCl, err := grpcInst.LibraryInstall(context.Background(), "Ethernet", "", false, false, false)
298+
require.NoError(t, err)
299+
for {
300+
msg, err := instCl.Recv()
301+
if err == io.EOF {
302+
break
303+
}
304+
require.NoError(t, err)
305+
fmt.Printf("LIB INSTALL> %+v\n", msg)
306+
}
307+
}
308+
309+
// Check if libraries are installed as expected
310+
installedEthernetVersion := ""
311+
{
312+
resp, err := grpcInst.LibraryList(context.Background(), "", "", true, false)
313+
require.NoError(t, err)
314+
libsAndLocation := map[string]commands.LibraryLocation{}
315+
for _, lib := range resp.GetInstalledLibraries() {
316+
libsAndLocation[lib.Library.Name] = lib.Library.Location
317+
if lib.Library.Name == "Ethernet" {
318+
installedEthernetVersion = lib.Library.Version
319+
}
320+
}
321+
require.Contains(t, libsAndLocation, "Ethernet")
322+
require.Contains(t, libsAndLocation, "SD")
323+
require.Contains(t, libsAndLocation, "Firmata")
324+
require.Equal(t, libsAndLocation["Ethernet"], commands.LibraryLocation_LIBRARY_LOCATION_USER)
325+
require.Equal(t, libsAndLocation["SD"], commands.LibraryLocation_LIBRARY_LOCATION_BUILTIN)
326+
require.Equal(t, libsAndLocation["Firmata"], commands.LibraryLocation_LIBRARY_LOCATION_BUILTIN)
327+
}
328+
329+
// Remove library from sketchbook
330+
{
331+
uninstCl, err := grpcInst.LibraryUninstall(context.Background(), "Ethernet", installedEthernetVersion)
332+
require.NoError(t, err)
333+
for {
334+
msg, err := uninstCl.Recv()
335+
if err == io.EOF {
336+
break
337+
}
338+
require.NoError(t, err)
339+
fmt.Printf("LIB INSTALL> %+v\n", msg)
340+
}
341+
}
342+
343+
// Check if libraries are installed as expected
344+
{
345+
resp, err := grpcInst.LibraryList(context.Background(), "", "", true, false)
346+
require.NoError(t, err)
347+
libsAndLocation := map[string]commands.LibraryLocation{}
348+
for _, lib := range resp.GetInstalledLibraries() {
349+
libsAndLocation[lib.Library.Name] = lib.Library.Location
350+
}
351+
require.Contains(t, libsAndLocation, "Ethernet")
352+
require.Contains(t, libsAndLocation, "SD")
353+
require.Contains(t, libsAndLocation, "Firmata")
354+
require.Equal(t, libsAndLocation["Ethernet"], commands.LibraryLocation_LIBRARY_LOCATION_BUILTIN)
355+
require.Equal(t, libsAndLocation["SD"], commands.LibraryLocation_LIBRARY_LOCATION_BUILTIN)
356+
require.Equal(t, libsAndLocation["Firmata"], commands.LibraryLocation_LIBRARY_LOCATION_BUILTIN)
357+
}
358+
359+
// Un-Set builtin libraries dir
360+
err := cli.SetValue("directories.builtin.libraries", `""`)
361+
require.NoError(t, err)
362+
363+
// Re-init
364+
require.NoError(t, grpcInst.Init("", "", func(ir *commands.InitResponse) {
365+
fmt.Printf("INIT> %v\n", ir.GetMessage())
366+
}))
367+
368+
// Install libraries in bundled dir (should now fail)
369+
{
370+
instCl, err := grpcInst.LibraryInstall(context.Background(), "Arduino_BuiltIn", "", false, false, true)
371+
require.NoError(t, err)
372+
for {
373+
msg, err := instCl.Recv()
374+
if err == io.EOF {
375+
require.FailNow(t, "LibraryInstall is supposed to fail because builtin libraries directory is not set")
376+
}
377+
if err != nil {
378+
fmt.Println("LIB INSTALL ERROR:", err)
379+
break
380+
}
381+
fmt.Printf("LIB INSTALL> %+v\n", msg)
382+
}
383+
}
384+
}

0 commit comments

Comments
 (0)
Please sign in to comment.