diff --git a/internal/integrationtest/arduino-cli.go b/internal/integrationtest/arduino-cli.go index f3266a7e153..9ba990476bc 100644 --- a/internal/integrationtest/arduino-cli.go +++ b/internal/integrationtest/arduino-cli.go @@ -158,6 +158,12 @@ func (cli *ArduinoCLI) SketchbookDir() *paths.Path { return cli.sketchbookDir } +// SetSketchbookDir sets the sketchbook directory +func (cli *ArduinoCLI) SetSketchbookDir(d *paths.Path) { + cli.sketchbookDir = d + cli.cliEnvVars["ARDUINO_SKETCHBOOK_DIR"] = d.String() +} + // WorkingDir returns the working directory func (cli *ArduinoCLI) WorkingDir() *paths.Path { return cli.workingDir diff --git a/internal/integrationtest/compile_2/compile_test.go b/internal/integrationtest/compile_2/compile_test.go index 42312ca7477..f5ba921bbb2 100644 --- a/internal/integrationtest/compile_2/compile_test.go +++ b/internal/integrationtest/compile_2/compile_test.go @@ -26,6 +26,7 @@ import ( "github.com/go-git/go-git/v5" "github.com/go-git/go-git/v5/plumbing" "github.com/stretchr/testify/require" + "go.bug.st/testifyjson/requirejson" ) func TestCompilePart4(t *testing.T) { @@ -449,3 +450,41 @@ func TestCompileWithKnownPlatformNotInstalled(t *testing.T) { // Verifies command to fix error is shown to user require.Contains(t, string(stderr), "Try running `arduino-cli core install arduino:avr`") } + +func TestSketchWithVendoredLibraries(t *testing.T) { + sketchBook, err := paths.New("testdata", "sketchbook_1").Abs() + require.NoError(t, err) + + env, cli := integrationtest.CreateArduinoCLIWithEnvironment(t) + defer env.CleanUp() + + cli.SetSketchbookDir(sketchBook) + + _, _, err = cli.Run("core", "install", "arduino:avr") + require.NoError(t, err) + + { + sketchWithLibsPath := sketchBook.Join("SketchWithLibraries") + // Sketch should use sketch bundled "MyLib" with and without profiles + out, _, err := cli.Run("compile", "-b", "arduino:avr:uno", sketchWithLibsPath.String(), "--format", "json") + require.NoError(t, err) + requirejson.Query(t, out, ".builder_result.used_libraries[0].name", `"MyLib"`) + requirejson.Query(t, out, ".builder_result.used_libraries[0].author", `"user"`) + out, _, err = cli.Run("compile", "--profile", "uno", sketchWithLibsPath.String(), "--format", "json") + require.NoError(t, err) + requirejson.Query(t, out, ".builder_result.used_libraries[0].name", `"MyLib"`) + requirejson.Query(t, out, ".builder_result.used_libraries[0].author", `"user"`) + } + + { + sketchWithoutLibsPath := sketchBook.Join("SketchWithoutLibraries") + // This sketch should take the user-installed MyLib + out, _, err := cli.Run("compile", "-b", "arduino:avr:uno", sketchWithoutLibsPath.String(), "--format", "json") + require.NoError(t, err) + requirejson.Query(t, out, ".builder_result.used_libraries[0].name", `"MyLib"`) + requirejson.Query(t, out, ".builder_result.used_libraries[0].author", `"upstream"`) + // This sketch should fail to compile since profiles will not see the user-installed MyLib + _, _, err = cli.Run("compile", "--profile", "uno", sketchWithoutLibsPath.String()) + require.Error(t, err) + } +} diff --git a/internal/integrationtest/compile_2/testdata/sketchbook_1/SketchWithLibraries/SketchWithLibraries.ino b/internal/integrationtest/compile_2/testdata/sketchbook_1/SketchWithLibraries/SketchWithLibraries.ino new file mode 100644 index 00000000000..b66e280362f --- /dev/null +++ b/internal/integrationtest/compile_2/testdata/sketchbook_1/SketchWithLibraries/SketchWithLibraries.ino @@ -0,0 +1,6 @@ +#include + +void setup() {} +void loop() { + myFunction(); +} diff --git a/internal/integrationtest/compile_2/testdata/sketchbook_1/SketchWithLibraries/libraries/AnotherLib/AnotherLib.h b/internal/integrationtest/compile_2/testdata/sketchbook_1/SketchWithLibraries/libraries/AnotherLib/AnotherLib.h new file mode 100644 index 00000000000..96e57ec5d58 --- /dev/null +++ b/internal/integrationtest/compile_2/testdata/sketchbook_1/SketchWithLibraries/libraries/AnotherLib/AnotherLib.h @@ -0,0 +1,3 @@ + +void anotherFunction() { +} diff --git a/internal/integrationtest/compile_2/testdata/sketchbook_1/SketchWithLibraries/libraries/AnotherLib/library.properties b/internal/integrationtest/compile_2/testdata/sketchbook_1/SketchWithLibraries/libraries/AnotherLib/library.properties new file mode 100644 index 00000000000..f165fefe9ec --- /dev/null +++ b/internal/integrationtest/compile_2/testdata/sketchbook_1/SketchWithLibraries/libraries/AnotherLib/library.properties @@ -0,0 +1 @@ +name=AnotherLib diff --git a/internal/integrationtest/compile_2/testdata/sketchbook_1/SketchWithLibraries/libraries/MyLib/MyLib.h b/internal/integrationtest/compile_2/testdata/sketchbook_1/SketchWithLibraries/libraries/MyLib/MyLib.h new file mode 100644 index 00000000000..5ed3d655e94 --- /dev/null +++ b/internal/integrationtest/compile_2/testdata/sketchbook_1/SketchWithLibraries/libraries/MyLib/MyLib.h @@ -0,0 +1,3 @@ + +void myFunction() { +} diff --git a/internal/integrationtest/compile_2/testdata/sketchbook_1/SketchWithLibraries/libraries/MyLib/library.properties b/internal/integrationtest/compile_2/testdata/sketchbook_1/SketchWithLibraries/libraries/MyLib/library.properties new file mode 100644 index 00000000000..07f99b93d96 --- /dev/null +++ b/internal/integrationtest/compile_2/testdata/sketchbook_1/SketchWithLibraries/libraries/MyLib/library.properties @@ -0,0 +1,2 @@ +name=MyLib +author=user diff --git a/internal/integrationtest/compile_2/testdata/sketchbook_1/SketchWithLibraries/sketch.yaml b/internal/integrationtest/compile_2/testdata/sketchbook_1/SketchWithLibraries/sketch.yaml new file mode 100644 index 00000000000..79937bdfac2 --- /dev/null +++ b/internal/integrationtest/compile_2/testdata/sketchbook_1/SketchWithLibraries/sketch.yaml @@ -0,0 +1,6 @@ +profiles: + uno: + fqbn: arduino:avr:uno + platforms: + - platform: arduino:avr (1.8.5) + diff --git a/internal/integrationtest/compile_2/testdata/sketchbook_1/SketchWithoutLibraries/SketchWithoutLibraries.ino b/internal/integrationtest/compile_2/testdata/sketchbook_1/SketchWithoutLibraries/SketchWithoutLibraries.ino new file mode 100644 index 00000000000..a0220e4a7f1 --- /dev/null +++ b/internal/integrationtest/compile_2/testdata/sketchbook_1/SketchWithoutLibraries/SketchWithoutLibraries.ino @@ -0,0 +1,6 @@ +#include + +void setup() {} +void loop() { + myWrongFunction(); +} diff --git a/internal/integrationtest/compile_2/testdata/sketchbook_1/SketchWithoutLibraries/sketch.yaml b/internal/integrationtest/compile_2/testdata/sketchbook_1/SketchWithoutLibraries/sketch.yaml new file mode 100644 index 00000000000..79937bdfac2 --- /dev/null +++ b/internal/integrationtest/compile_2/testdata/sketchbook_1/SketchWithoutLibraries/sketch.yaml @@ -0,0 +1,6 @@ +profiles: + uno: + fqbn: arduino:avr:uno + platforms: + - platform: arduino:avr (1.8.5) + diff --git a/internal/integrationtest/compile_2/testdata/sketchbook_1/libraries/MyLib/MyLib.h b/internal/integrationtest/compile_2/testdata/sketchbook_1/libraries/MyLib/MyLib.h new file mode 100644 index 00000000000..2ce641a99a4 --- /dev/null +++ b/internal/integrationtest/compile_2/testdata/sketchbook_1/libraries/MyLib/MyLib.h @@ -0,0 +1,5 @@ + +// This is the wrong library to include (the sketch-bundled one should take priority) + +void myWrongFunction() { +} diff --git a/internal/integrationtest/compile_2/testdata/sketchbook_1/libraries/MyLib/library.properties b/internal/integrationtest/compile_2/testdata/sketchbook_1/libraries/MyLib/library.properties new file mode 100644 index 00000000000..0d0b76480a9 --- /dev/null +++ b/internal/integrationtest/compile_2/testdata/sketchbook_1/libraries/MyLib/library.properties @@ -0,0 +1,2 @@ +name=MyLib +author=upstream