From f5470e48ec01a42f4776bb7b83ca94a78b5f8774 Mon Sep 17 00:00:00 2001 From: Matteo Pologruto Date: Wed, 14 Sep 2022 15:04:19 +0200 Subject: [PATCH 01/10] Migrate TestCompileWithOutputDirFlag from test_compile_part_2.py to compile_part_2_test.go --- .../compile/compile_part_2_test.go | 73 +++++++++++++++++++ test/test_compile_part_2.py | 40 ---------- 2 files changed, 73 insertions(+), 40 deletions(-) create mode 100644 internal/integrationtest/compile/compile_part_2_test.go diff --git a/internal/integrationtest/compile/compile_part_2_test.go b/internal/integrationtest/compile/compile_part_2_test.go new file mode 100644 index 00000000000..33b29155a0a --- /dev/null +++ b/internal/integrationtest/compile/compile_part_2_test.go @@ -0,0 +1,73 @@ +// This file is part of arduino-cli. +// +// Copyright 2022 ARDUINO SA (http://www.arduino.cc/) +// +// This software is released under the GNU General Public License version 3, +// which covers the main part of arduino-cli. +// The terms of this license can be found at: +// https://www.gnu.org/licenses/gpl-3.0.en.html +// +// You can be released from the requirements of the above licenses by purchasing +// a commercial license. Buying such a license is mandatory if you want to +// modify or otherwise use the software for commercial activities involving the +// Arduino software without disclosing the source code of your own applications. +// To purchase a commercial license, send an email to license@arduino.cc. + +package compile_part_1_test + +import ( + "crypto/md5" + "encoding/hex" + "strings" + "testing" + + "github.com/arduino/arduino-cli/internal/integrationtest" + "github.com/arduino/go-paths-helper" + "github.com/stretchr/testify/require" +) + +func TestCompileWithOutputDirFlag(t *testing.T) { + env, cli := integrationtest.CreateArduinoCLIWithEnvironment(t) + defer env.CleanUp() + + // Init the environment explicitly + _, _, err := cli.Run("core", "update-index") + require.NoError(t, err) + + // Download latest AVR + _, _, err = cli.Run("core", "install", "arduino:avr") + require.NoError(t, err) + + sketchName := "CompileWithOutputDir" + sketchPath := cli.SketchbookDir().Join(sketchName) + fqbn := "arduino:avr:uno" + + // Create a test sketch + stdout, _, err := cli.Run("sketch", "new", sketchPath.String()) + require.NoError(t, err) + require.Contains(t, string(stdout), "Sketch created in: "+sketchPath.String()) + + // Test the --output-dir flag with absolute path + outputDir := cli.SketchbookDir().Join("test_dir", "output_dir") + _, _, err = cli.Run("compile", "-b", fqbn, sketchPath.String(), "--output-dir", outputDir.String()) + require.NoError(t, err) + + // Verifies expected binaries have been built + md5 := md5.Sum(([]byte(sketchPath.String()))) + sketchPathMd5 := strings.ToUpper(hex.EncodeToString(md5[:])) + require.NotEmpty(t, sketchPathMd5) + buildDir := paths.TempDir().Join("arduino-sketch-" + sketchPathMd5) + require.FileExists(t, buildDir.Join(sketchName+".ino.eep").String()) + require.FileExists(t, buildDir.Join(sketchName+".ino.elf").String()) + require.FileExists(t, buildDir.Join(sketchName+".ino.hex").String()) + require.FileExists(t, buildDir.Join(sketchName+".ino.with_bootloader.bin").String()) + require.FileExists(t, buildDir.Join(sketchName+".ino.with_bootloader.hex").String()) + + // Verifies binaries are exported when --output-dir flag is specified + require.DirExists(t, outputDir.String()) + require.FileExists(t, outputDir.Join(sketchName+".ino.eep").String()) + require.FileExists(t, outputDir.Join(sketchName+".ino.elf").String()) + require.FileExists(t, outputDir.Join(sketchName+".ino.hex").String()) + require.FileExists(t, outputDir.Join(sketchName+".ino.with_bootloader.bin").String()) + require.FileExists(t, outputDir.Join(sketchName+".ino.with_bootloader.hex").String()) +} diff --git a/test/test_compile_part_2.py b/test/test_compile_part_2.py index 5e983b43258..b1020bfc560 100644 --- a/test/test_compile_part_2.py +++ b/test/test_compile_part_2.py @@ -19,46 +19,6 @@ import simplejson as json -def test_compile_with_output_dir_flag(run_command, data_dir): - # Init the environment explicitly - run_command(["core", "update-index"]) - - # Download latest AVR - run_command(["core", "install", "arduino:avr"]) - - sketch_name = "CompileWithOutputDir" - sketch_path = Path(data_dir, sketch_name) - fqbn = "arduino:avr:uno" - - # Create a test sketch - result = run_command(["sketch", "new", sketch_path]) - assert result.ok - assert f"Sketch created in: {sketch_path}" in result.stdout - - # Test the --output-dir flag with absolute path - output_dir = Path(data_dir, "test_dir", "output_dir") - result = run_command(["compile", "-b", fqbn, sketch_path, "--output-dir", output_dir]) - assert result.ok - - # Verifies expected binaries have been built - sketch_path_md5 = hashlib.md5(bytes(sketch_path)).hexdigest().upper() - build_dir = Path(tempfile.gettempdir(), f"arduino-sketch-{sketch_path_md5}") - assert (build_dir / f"{sketch_name}.ino.eep").exists() - assert (build_dir / f"{sketch_name}.ino.elf").exists() - assert (build_dir / f"{sketch_name}.ino.hex").exists() - assert (build_dir / f"{sketch_name}.ino.with_bootloader.bin").exists() - assert (build_dir / f"{sketch_name}.ino.with_bootloader.hex").exists() - - # Verifies binaries are exported when --output-dir flag is specified - assert output_dir.exists() - assert output_dir.is_dir() - assert (output_dir / f"{sketch_name}.ino.eep").exists() - assert (output_dir / f"{sketch_name}.ino.elf").exists() - assert (output_dir / f"{sketch_name}.ino.hex").exists() - assert (output_dir / f"{sketch_name}.ino.with_bootloader.bin").exists() - assert (output_dir / f"{sketch_name}.ino.with_bootloader.hex").exists() - - def test_compile_with_export_binaries_flag(run_command, data_dir): # Init the environment explicitly run_command(["core", "update-index"]) From 8fa3d274bfd5a99d5e4c716d55ee0ab0c4486710 Mon Sep 17 00:00:00 2001 From: Matteo Pologruto Date: Wed, 14 Sep 2022 15:16:59 +0200 Subject: [PATCH 02/10] Migrate TestCompileWithExportBinariesFlag from test_compile_part_2.py to compile_part_2_test.go --- .../compile/compile_part_2_test.go | 34 +++++++++++++++++++ test/test_compile_part_2.py | 28 --------------- 2 files changed, 34 insertions(+), 28 deletions(-) diff --git a/internal/integrationtest/compile/compile_part_2_test.go b/internal/integrationtest/compile/compile_part_2_test.go index 33b29155a0a..38068a65dc5 100644 --- a/internal/integrationtest/compile/compile_part_2_test.go +++ b/internal/integrationtest/compile/compile_part_2_test.go @@ -71,3 +71,37 @@ func TestCompileWithOutputDirFlag(t *testing.T) { require.FileExists(t, outputDir.Join(sketchName+".ino.with_bootloader.bin").String()) require.FileExists(t, outputDir.Join(sketchName+".ino.with_bootloader.hex").String()) } + +func TestCompileWithExportBinariesFlag(t *testing.T) { + env, cli := integrationtest.CreateArduinoCLIWithEnvironment(t) + defer env.CleanUp() + + // Init the environment explicitly + _, _, err := cli.Run("core", "update-index") + require.NoError(t, err) + + // Download latest AVR + _, _, err = cli.Run("core", "install", "arduino:avr") + require.NoError(t, err) + + sketchName := "CompileWithExportBinariesFlag" + sketchPath := cli.SketchbookDir().Join(sketchName) + fqbn := "arduino:avr:uno" + + // Create a test sketch + _, _, err = cli.Run("sketch", "new", sketchPath.String()) + require.NoError(t, err) + + // Test the --output-dir flag with absolute path + _, _, err = cli.Run("compile", "-b", fqbn, sketchPath.String(), "--export-binaries") + require.NoError(t, err) + require.DirExists(t, sketchPath.Join("build").String()) + + // Verifies binaries are exported when --export-binaries flag is set + fqbn = strings.ReplaceAll(fqbn, ":", ".") + require.FileExists(t, sketchPath.Join("build", fqbn, sketchName+".ino.eep").String()) + require.FileExists(t, sketchPath.Join("build", fqbn, sketchName+".ino.elf").String()) + require.FileExists(t, sketchPath.Join("build", fqbn, sketchName+".ino.hex").String()) + require.FileExists(t, sketchPath.Join("build", fqbn, sketchName+".ino.with_bootloader.bin").String()) + require.FileExists(t, sketchPath.Join("build", fqbn, sketchName+".ino.with_bootloader.hex").String()) +} diff --git a/test/test_compile_part_2.py b/test/test_compile_part_2.py index b1020bfc560..263f844af33 100644 --- a/test/test_compile_part_2.py +++ b/test/test_compile_part_2.py @@ -19,34 +19,6 @@ import simplejson as json -def test_compile_with_export_binaries_flag(run_command, data_dir): - # Init the environment explicitly - run_command(["core", "update-index"]) - - # Download latest AVR - run_command(["core", "install", "arduino:avr"]) - - sketch_name = "CompileWithExportBinariesFlag" - sketch_path = Path(data_dir, sketch_name) - fqbn = "arduino:avr:uno" - - # Create a test sketch - assert run_command(["sketch", "new", sketch_path]) - - # Test the --output-dir flag with absolute path - result = run_command(["compile", "-b", fqbn, sketch_path, "--export-binaries"]) - assert result.ok - assert Path(sketch_path, "build").exists() - assert Path(sketch_path, "build").is_dir() - - # Verifies binaries are exported when --export-binaries flag is set - assert (sketch_path / "build" / fqbn.replace(":", ".") / f"{sketch_name}.ino.eep").exists() - assert (sketch_path / "build" / fqbn.replace(":", ".") / f"{sketch_name}.ino.elf").exists() - assert (sketch_path / "build" / fqbn.replace(":", ".") / f"{sketch_name}.ino.hex").exists() - assert (sketch_path / "build" / fqbn.replace(":", ".") / f"{sketch_name}.ino.with_bootloader.bin").exists() - assert (sketch_path / "build" / fqbn.replace(":", ".") / f"{sketch_name}.ino.with_bootloader.hex").exists() - - def test_compile_with_custom_build_path(run_command, data_dir): # Init the environment explicitly run_command(["core", "update-index"]) From 76b7003fe5255c813aa9d63c7605d303bdd93329 Mon Sep 17 00:00:00 2001 From: Matteo Pologruto Date: Wed, 14 Sep 2022 15:29:20 +0200 Subject: [PATCH 03/10] Migrate TestCompileWithCustomBuildPath from test_compile_part_2.py to compile_part_2_test.go --- .../compile/compile_part_2_test.go | 45 +++++++++++++++++++ test/test_compile_part_2.py | 41 ----------------- 2 files changed, 45 insertions(+), 41 deletions(-) diff --git a/internal/integrationtest/compile/compile_part_2_test.go b/internal/integrationtest/compile/compile_part_2_test.go index 38068a65dc5..5af09cb71bd 100644 --- a/internal/integrationtest/compile/compile_part_2_test.go +++ b/internal/integrationtest/compile/compile_part_2_test.go @@ -105,3 +105,48 @@ func TestCompileWithExportBinariesFlag(t *testing.T) { require.FileExists(t, sketchPath.Join("build", fqbn, sketchName+".ino.with_bootloader.bin").String()) require.FileExists(t, sketchPath.Join("build", fqbn, sketchName+".ino.with_bootloader.hex").String()) } + +func TestCompileWithCustomBuildPath(t *testing.T) { + env, cli := integrationtest.CreateArduinoCLIWithEnvironment(t) + defer env.CleanUp() + + // Init the environment explicitly + _, _, err := cli.Run("core", "update-index") + require.NoError(t, err) + + // Download latest AVR + _, _, err = cli.Run("core", "install", "arduino:avr") + require.NoError(t, err) + + sketchName := "CompileWithBuildPath" + sketchPath := cli.SketchbookDir().Join(sketchName) + fqbn := "arduino:avr:uno" + + // Create a test sketch + _, _, err = cli.Run("sketch", "new", sketchPath.String()) + require.NoError(t, err) + + // Test the --build-path flag with absolute path + buildPath := cli.DataDir().Join("test_dir", "build_dir") + _, _, err = cli.Run("compile", "-b", fqbn, sketchPath.String(), "--build-path", buildPath.String()) + require.NoError(t, err) + + // Verifies expected binaries have been built to build_path + require.DirExists(t, buildPath.String()) + require.FileExists(t, buildPath.Join(sketchName+".ino.eep").String()) + require.FileExists(t, buildPath.Join(sketchName+".ino.elf").String()) + require.FileExists(t, buildPath.Join(sketchName+".ino.hex").String()) + require.FileExists(t, buildPath.Join(sketchName+".ino.with_bootloader.bin").String()) + require.FileExists(t, buildPath.Join(sketchName+".ino.with_bootloader.hex").String()) + + // Verifies there are no binaries in temp directory + md5 := md5.Sum(([]byte(sketchPath.String()))) + sketchPathMd5 := strings.ToUpper(hex.EncodeToString(md5[:])) + require.NotEmpty(t, sketchPathMd5) + buildDir := paths.TempDir().Join("arduino-sketch-" + sketchPathMd5) + require.NoFileExists(t, buildDir.Join(sketchName+".ino.eep").String()) + require.NoFileExists(t, buildDir.Join(sketchName+".ino.elf").String()) + require.NoFileExists(t, buildDir.Join(sketchName+".ino.hex").String()) + require.NoFileExists(t, buildDir.Join(sketchName+".ino.with_bootloader.bin").String()) + require.NoFileExists(t, buildDir.Join(sketchName+".ino.with_bootloader.hex").String()) +} diff --git a/test/test_compile_part_2.py b/test/test_compile_part_2.py index 263f844af33..befcdd1464c 100644 --- a/test/test_compile_part_2.py +++ b/test/test_compile_part_2.py @@ -19,47 +19,6 @@ import simplejson as json -def test_compile_with_custom_build_path(run_command, data_dir): - # Init the environment explicitly - run_command(["core", "update-index"]) - - # Download latest AVR - run_command(["core", "install", "arduino:avr"]) - - sketch_name = "CompileWithBuildPath" - sketch_path = Path(data_dir, sketch_name) - fqbn = "arduino:avr:uno" - - # Create a test sketch - result = run_command(["sketch", "new", sketch_path]) - assert result.ok - assert f"Sketch created in: {sketch_path}" in result.stdout - - # Test the --build-path flag with absolute path - build_path = Path(data_dir, "test_dir", "build_dir") - result = run_command(["compile", "-b", fqbn, sketch_path, "--build-path", build_path]) - print(result.stderr) - assert result.ok - - # Verifies expected binaries have been built to build_path - assert build_path.exists() - assert build_path.is_dir() - assert (build_path / f"{sketch_name}.ino.eep").exists() - assert (build_path / f"{sketch_name}.ino.elf").exists() - assert (build_path / f"{sketch_name}.ino.hex").exists() - assert (build_path / f"{sketch_name}.ino.with_bootloader.bin").exists() - assert (build_path / f"{sketch_name}.ino.with_bootloader.hex").exists() - - # Verifies there are no binaries in temp directory - sketch_path_md5 = hashlib.md5(bytes(sketch_path)).hexdigest().upper() - build_dir = Path(tempfile.gettempdir(), f"arduino-sketch-{sketch_path_md5}") - assert not (build_dir / f"{sketch_name}.ino.eep").exists() - assert not (build_dir / f"{sketch_name}.ino.elf").exists() - assert not (build_dir / f"{sketch_name}.ino.hex").exists() - assert not (build_dir / f"{sketch_name}.ino.with_bootloader.bin").exists() - assert not (build_dir / f"{sketch_name}.ino.with_bootloader.hex").exists() - - def test_compile_with_export_binaries_env_var(run_command, data_dir, downloads_dir): # Init the environment explicitly run_command(["core", "update-index"]) From 6a8a9f16be1326f5ab330622578404d8e9336f2a Mon Sep 17 00:00:00 2001 From: Matteo Pologruto Date: Thu, 15 Sep 2022 11:33:06 +0200 Subject: [PATCH 04/10] Migrate TestCompileWithInvalidUrl from test_compile_part_2.py to compile_part_2_test.go --- .../compile/compile_part_2_test.go | 30 +++++++++++++++++++ test/test_compile_part_2.py | 28 ----------------- 2 files changed, 30 insertions(+), 28 deletions(-) diff --git a/internal/integrationtest/compile/compile_part_2_test.go b/internal/integrationtest/compile/compile_part_2_test.go index 5af09cb71bd..951b2c4d08b 100644 --- a/internal/integrationtest/compile/compile_part_2_test.go +++ b/internal/integrationtest/compile/compile_part_2_test.go @@ -150,3 +150,33 @@ func TestCompileWithCustomBuildPath(t *testing.T) { require.NoFileExists(t, buildDir.Join(sketchName+".ino.with_bootloader.bin").String()) require.NoFileExists(t, buildDir.Join(sketchName+".ino.with_bootloader.hex").String()) } + +func TestCompileWithInvalidUrl(t *testing.T) { + env, cli := integrationtest.CreateArduinoCLIWithEnvironment(t) + defer env.CleanUp() + + // Init the environment explicitly + _, _, err := cli.Run("core", "update-index") + require.NoError(t, err) + + // Download latest AVR + _, _, err = cli.Run("core", "install", "arduino:avr") + require.NoError(t, err) + + sketchName := "CompileWithInvalidURL" + sketchPath := cli.SketchbookDir().Join(sketchName) + fqbn := "arduino:avr:uno" + + // Create a test sketch + _, _, err = cli.Run("sketch", "new", sketchPath.String()) + require.NoError(t, err) + + _, _, err = cli.Run("config", "init", "--dest-dir", ".", "--additional-urls", "https://example.com/package_example_index.json") + require.NoError(t, err) + + _, stderr, err := cli.Run("compile", "-b", fqbn, sketchPath.String()) + require.NoError(t, err) + require.Contains(t, string(stderr), "Error initializing instance: Loading index file: loading json index file") + expectedIndexfile := cli.DataDir().Join("package_example_index.json") + require.Contains(t, string(stderr), "loading json index file "+expectedIndexfile.String()+": open "+expectedIndexfile.String()+":") +} diff --git a/test/test_compile_part_2.py b/test/test_compile_part_2.py index befcdd1464c..4bc39e84888 100644 --- a/test/test_compile_part_2.py +++ b/test/test_compile_part_2.py @@ -90,34 +90,6 @@ def test_compile_with_export_binaries_config(run_command, data_dir, downloads_di assert (sketch_path / "build" / fqbn.replace(":", ".") / f"{sketch_name}.ino.with_bootloader.hex").exists() -def test_compile_with_invalid_url(run_command, data_dir): - # Init the environment explicitly - run_command(["core", "update-index"]) - - # Download latest AVR - run_command(["core", "install", "arduino:avr"]) - - sketch_name = "CompileWithInvalidURL" - sketch_path = Path(data_dir, sketch_name) - fqbn = "arduino:avr:uno" - - # Create a test sketch - assert run_command(["sketch", "new", sketch_path]) - - # Create settings with custom invalid URL - assert run_command( - ["config", "init", "--dest-dir", ".", "--additional-urls", "https://example.com/package_example_index.json"] - ) - - # Verifies compilation fails cause of missing local index file - res = run_command(["compile", "-b", fqbn, sketch_path]) - assert res.ok - lines = [l.strip() for l in res.stderr.splitlines()] - assert "Error initializing instance: Loading index file: loading json index file" in lines[0] - expected_index_file = Path(data_dir, "package_example_index.json") - assert f"loading json index file {expected_index_file}: " + f"open {expected_index_file}:" in lines[-1] - - def test_compile_with_custom_libraries(run_command, copy_sketch): # Creates config with additional URL to install necessary core url = "http://arduino.esp8266.com/stable/package_esp8266com_index.json" From 4478cdfabf587fda1dca435da17ad8fe6dda5faf Mon Sep 17 00:00:00 2001 From: Matteo Pologruto Date: Thu, 15 Sep 2022 15:23:07 +0200 Subject: [PATCH 05/10] Migrate TestCompileWithExportBinariesEnvVar from test_compile_part_2.py to compile_part_2_test.go --- .../compile/compile_part_2_test.go | 37 +++++++++++++++++++ test/test_compile_part_2.py | 34 ----------------- 2 files changed, 37 insertions(+), 34 deletions(-) diff --git a/internal/integrationtest/compile/compile_part_2_test.go b/internal/integrationtest/compile/compile_part_2_test.go index 951b2c4d08b..a9f141d7f3f 100644 --- a/internal/integrationtest/compile/compile_part_2_test.go +++ b/internal/integrationtest/compile/compile_part_2_test.go @@ -151,6 +151,43 @@ func TestCompileWithCustomBuildPath(t *testing.T) { require.NoFileExists(t, buildDir.Join(sketchName+".ino.with_bootloader.hex").String()) } +func TestCompileWithExportBinariesEnvVar(t *testing.T) { + env, cli := integrationtest.CreateArduinoCLIWithEnvironment(t) + defer env.CleanUp() + + // Init the environment explicitly + _, _, err := cli.Run("core", "update-index") + require.NoError(t, err) + + // Download latest AVR + _, _, err = cli.Run("core", "install", "arduino:avr") + require.NoError(t, err) + + sketchName := "CompileWithExportBinariesEnvVar" + sketchPath := cli.SketchbookDir().Join(sketchName) + fqbn := "arduino:avr:uno" + + // Create a test sketch + _, _, err = cli.Run("sketch", "new", sketchPath.String()) + require.NoError(t, err) + + envVar := cli.GetDefaultEnv() + envVar["ARDUINO_SKETCH_ALWAYS_EXPORT_BINARIES"] = "true" + + // Test compilation with export binaries env var set + _, _, err = cli.RunWithCustomEnv(envVar, "compile", "-b", fqbn, sketchPath.String()) + require.NoError(t, err) + require.DirExists(t, sketchPath.Join("build").String()) + + // Verifies binaries are exported when export binaries env var is set + fqbn = strings.ReplaceAll(fqbn, ":", ".") + require.FileExists(t, sketchPath.Join("build", fqbn, sketchName+".ino.eep").String()) + require.FileExists(t, sketchPath.Join("build", fqbn, sketchName+".ino.elf").String()) + require.FileExists(t, sketchPath.Join("build", fqbn, sketchName+".ino.hex").String()) + require.FileExists(t, sketchPath.Join("build", fqbn, sketchName+".ino.with_bootloader.bin").String()) + require.FileExists(t, sketchPath.Join("build", fqbn, sketchName+".ino.with_bootloader.hex").String()) +} + func TestCompileWithInvalidUrl(t *testing.T) { env, cli := integrationtest.CreateArduinoCLIWithEnvironment(t) defer env.CleanUp() diff --git a/test/test_compile_part_2.py b/test/test_compile_part_2.py index 4bc39e84888..644c10f17d4 100644 --- a/test/test_compile_part_2.py +++ b/test/test_compile_part_2.py @@ -19,40 +19,6 @@ import simplejson as json -def test_compile_with_export_binaries_env_var(run_command, data_dir, downloads_dir): - # Init the environment explicitly - run_command(["core", "update-index"]) - - # Download latest AVR - run_command(["core", "install", "arduino:avr"]) - - sketch_name = "CompileWithExportBinariesEnvVar" - sketch_path = Path(data_dir, sketch_name) - fqbn = "arduino:avr:uno" - - # Create a test sketch - assert run_command(["sketch", "new", sketch_path]) - - env = { - "ARDUINO_DATA_DIR": data_dir, - "ARDUINO_DOWNLOADS_DIR": downloads_dir, - "ARDUINO_SKETCHBOOK_DIR": data_dir, - "ARDUINO_SKETCH_ALWAYS_EXPORT_BINARIES": "true", - } - # Test compilation with export binaries env var set - result = run_command(["compile", "-b", fqbn, sketch_path], custom_env=env) - assert result.ok - assert Path(sketch_path, "build").exists() - assert Path(sketch_path, "build").is_dir() - - # Verifies binaries are exported when export binaries env var is set - assert (sketch_path / "build" / fqbn.replace(":", ".") / f"{sketch_name}.ino.eep").exists() - assert (sketch_path / "build" / fqbn.replace(":", ".") / f"{sketch_name}.ino.elf").exists() - assert (sketch_path / "build" / fqbn.replace(":", ".") / f"{sketch_name}.ino.hex").exists() - assert (sketch_path / "build" / fqbn.replace(":", ".") / f"{sketch_name}.ino.with_bootloader.bin").exists() - assert (sketch_path / "build" / fqbn.replace(":", ".") / f"{sketch_name}.ino.with_bootloader.hex").exists() - - def test_compile_with_export_binaries_config(run_command, data_dir, downloads_dir): # Init the environment explicitly run_command(["core", "update-index"]) From 979f7a7970f045291c40843f101eef40e61f6edc Mon Sep 17 00:00:00 2001 From: Matteo Pologruto Date: Thu, 15 Sep 2022 16:14:28 +0200 Subject: [PATCH 06/10] Migrate TestCompileWithExportBinariesConfig from test_compile_part_2.py to compile_part_2_test.go --- .../compile/compile_part_2_test.go | 51 +++++++++++++++++++ test/test_compile_part_2.py | 37 -------------- 2 files changed, 51 insertions(+), 37 deletions(-) diff --git a/internal/integrationtest/compile/compile_part_2_test.go b/internal/integrationtest/compile/compile_part_2_test.go index a9f141d7f3f..35e9e51c56e 100644 --- a/internal/integrationtest/compile/compile_part_2_test.go +++ b/internal/integrationtest/compile/compile_part_2_test.go @@ -24,6 +24,7 @@ import ( "github.com/arduino/arduino-cli/internal/integrationtest" "github.com/arduino/go-paths-helper" "github.com/stretchr/testify/require" + "go.bug.st/testifyjson/requirejson" ) func TestCompileWithOutputDirFlag(t *testing.T) { @@ -188,6 +189,56 @@ func TestCompileWithExportBinariesEnvVar(t *testing.T) { require.FileExists(t, sketchPath.Join("build", fqbn, sketchName+".ino.with_bootloader.hex").String()) } +func TestCompileWithExportBinariesConfig(t *testing.T) { + env, cli := integrationtest.CreateArduinoCLIWithEnvironment(t) + defer env.CleanUp() + + // Init the environment explicitly + _, _, err := cli.Run("core", "update-index") + require.NoError(t, err) + + // Download latest AVR + _, _, err = cli.Run("core", "install", "arduino:avr") + require.NoError(t, err) + + sketchName := "CompileWithExportBinariesEnvVar" + sketchPath := cli.SketchbookDir().Join(sketchName) + fqbn := "arduino:avr:uno" + + // Create a test sketch + _, _, err = cli.Run("sketch", "new", sketchPath.String()) + require.NoError(t, err) + + // Create settings with export binaries set to true + envVar := cli.GetDefaultEnv() + envVar["ARDUINO_SKETCH_ALWAYS_EXPORT_BINARIES"] = "true" + _, _, err = cli.RunWithCustomEnv(envVar, "config", "init", "--dest-dir", ".") + require.NoError(t, err) + + // Test if arduino-cli config file written in the previous run has the `always_export_binaries` flag set. + stdout, _, err := cli.Run("config", "dump", "--format", "json") + require.NoError(t, err) + requirejson.Contains(t, stdout, ` + { + "sketch": { + "always_export_binaries": "true" + } + }`) + + // Test compilation with export binaries env var set + _, _, err = cli.Run("compile", "-b", fqbn, sketchPath.String()) + require.NoError(t, err) + require.DirExists(t, sketchPath.Join("build").String()) + + // Verifies binaries are exported when export binaries env var is set + fqbn = strings.ReplaceAll(fqbn, ":", ".") + require.FileExists(t, sketchPath.Join("build", fqbn, sketchName+".ino.eep").String()) + require.FileExists(t, sketchPath.Join("build", fqbn, sketchName+".ino.elf").String()) + require.FileExists(t, sketchPath.Join("build", fqbn, sketchName+".ino.hex").String()) + require.FileExists(t, sketchPath.Join("build", fqbn, sketchName+".ino.with_bootloader.bin").String()) + require.FileExists(t, sketchPath.Join("build", fqbn, sketchName+".ino.with_bootloader.hex").String()) +} + func TestCompileWithInvalidUrl(t *testing.T) { env, cli := integrationtest.CreateArduinoCLIWithEnvironment(t) defer env.CleanUp() diff --git a/test/test_compile_part_2.py b/test/test_compile_part_2.py index 644c10f17d4..143dc890f40 100644 --- a/test/test_compile_part_2.py +++ b/test/test_compile_part_2.py @@ -19,43 +19,6 @@ import simplejson as json -def test_compile_with_export_binaries_config(run_command, data_dir, downloads_dir): - # Init the environment explicitly - run_command(["core", "update-index"]) - - # Download latest AVR - run_command(["core", "install", "arduino:avr"]) - - sketch_name = "CompileWithExportBinariesConfig" - sketch_path = Path(data_dir, sketch_name) - fqbn = "arduino:avr:uno" - - # Create a test sketch - assert run_command(["sketch", "new", sketch_path]) - - # Create settings with export binaries set to true - env = { - "ARDUINO_DATA_DIR": data_dir, - "ARDUINO_DOWNLOADS_DIR": downloads_dir, - "ARDUINO_SKETCHBOOK_DIR": data_dir, - "ARDUINO_SKETCH_ALWAYS_EXPORT_BINARIES": "true", - } - assert run_command(["config", "init", "--dest-dir", "."], custom_env=env) - - # Test compilation with export binaries env var set - result = run_command(["compile", "-b", fqbn, sketch_path]) - assert result.ok - assert Path(sketch_path, "build").exists() - assert Path(sketch_path, "build").is_dir() - - # Verifies binaries are exported when export binaries env var is set - assert (sketch_path / "build" / fqbn.replace(":", ".") / f"{sketch_name}.ino.eep").exists() - assert (sketch_path / "build" / fqbn.replace(":", ".") / f"{sketch_name}.ino.elf").exists() - assert (sketch_path / "build" / fqbn.replace(":", ".") / f"{sketch_name}.ino.hex").exists() - assert (sketch_path / "build" / fqbn.replace(":", ".") / f"{sketch_name}.ino.with_bootloader.bin").exists() - assert (sketch_path / "build" / fqbn.replace(":", ".") / f"{sketch_name}.ino.with_bootloader.hex").exists() - - def test_compile_with_custom_libraries(run_command, copy_sketch): # Creates config with additional URL to install necessary core url = "http://arduino.esp8266.com/stable/package_esp8266com_index.json" From c898e3e33cd1cf7d05e7e988f6375de897734ae2 Mon Sep 17 00:00:00 2001 From: Matteo Pologruto Date: Thu, 15 Sep 2022 17:09:33 +0200 Subject: [PATCH 07/10] Migrate TestCompileWithCustomLibraries from test_compile_part_2.py to compile_part_2_test.go --- .../compile/compile_part_2_test.go | 26 +++++++++++++++++++ .../libraries1/Lib/lib1.h | 0 .../libraries2/Lib/lib2.h | 0 .../sketch_with_multiple_custom_libraries.ino | 16 ++++++------ 4 files changed, 34 insertions(+), 8 deletions(-) rename {test => internal/integrationtest}/testdata/sketch_with_multiple_custom_libraries/libraries1/Lib/lib1.h (100%) rename {test => internal/integrationtest}/testdata/sketch_with_multiple_custom_libraries/libraries2/Lib/lib2.h (100%) rename {test => internal/integrationtest}/testdata/sketch_with_multiple_custom_libraries/sketch_with_multiple_custom_libraries.ino (89%) diff --git a/internal/integrationtest/compile/compile_part_2_test.go b/internal/integrationtest/compile/compile_part_2_test.go index 35e9e51c56e..a3e1fafa85b 100644 --- a/internal/integrationtest/compile/compile_part_2_test.go +++ b/internal/integrationtest/compile/compile_part_2_test.go @@ -268,3 +268,29 @@ func TestCompileWithInvalidUrl(t *testing.T) { expectedIndexfile := cli.DataDir().Join("package_example_index.json") require.Contains(t, string(stderr), "loading json index file "+expectedIndexfile.String()+": open "+expectedIndexfile.String()+":") } + +func TestCompileWithCustomLibraries(t *testing.T) { + env, cli := integrationtest.CreateArduinoCLIWithEnvironment(t) + defer env.CleanUp() + + // Creates config with additional URL to install necessary core + url := "http://arduino.esp8266.com/stable/package_esp8266com_index.json" + _, _, err := cli.Run("config", "init", "--dest-dir", ".", "--additional-urls", url) + require.NoError(t, err) + + // Init the environment explicitly + _, _, err = cli.Run("update") + require.NoError(t, err) + + _, _, err = cli.Run("core", "install", "esp8266:esp8266") + require.NoError(t, err) + + sketchName := "sketch_with_multiple_custom_libraries" + sketchPath := cli.CopySketch(sketchName) + fqbn := "esp8266:esp8266:nodemcu:xtal=80,vt=heap,eesz=4M1M,wipe=none,baud=115200" + + firstLib := sketchPath.Join("libraries1") + secondLib := sketchPath.Join("libraries2") + _, _, err = cli.Run("compile", "--libraries", firstLib.String(), "--libraries", secondLib.String(), "-b", fqbn, sketchPath.String()) + require.NoError(t, err) +} diff --git a/test/testdata/sketch_with_multiple_custom_libraries/libraries1/Lib/lib1.h b/internal/integrationtest/testdata/sketch_with_multiple_custom_libraries/libraries1/Lib/lib1.h similarity index 100% rename from test/testdata/sketch_with_multiple_custom_libraries/libraries1/Lib/lib1.h rename to internal/integrationtest/testdata/sketch_with_multiple_custom_libraries/libraries1/Lib/lib1.h diff --git a/test/testdata/sketch_with_multiple_custom_libraries/libraries2/Lib/lib2.h b/internal/integrationtest/testdata/sketch_with_multiple_custom_libraries/libraries2/Lib/lib2.h similarity index 100% rename from test/testdata/sketch_with_multiple_custom_libraries/libraries2/Lib/lib2.h rename to internal/integrationtest/testdata/sketch_with_multiple_custom_libraries/libraries2/Lib/lib2.h diff --git a/test/testdata/sketch_with_multiple_custom_libraries/sketch_with_multiple_custom_libraries.ino b/internal/integrationtest/testdata/sketch_with_multiple_custom_libraries/sketch_with_multiple_custom_libraries.ino similarity index 89% rename from test/testdata/sketch_with_multiple_custom_libraries/sketch_with_multiple_custom_libraries.ino rename to internal/integrationtest/testdata/sketch_with_multiple_custom_libraries/sketch_with_multiple_custom_libraries.ino index fb99d2a57ee..896c7156fe7 100644 --- a/test/testdata/sketch_with_multiple_custom_libraries/sketch_with_multiple_custom_libraries.ino +++ b/internal/integrationtest/testdata/sketch_with_multiple_custom_libraries/sketch_with_multiple_custom_libraries.ino @@ -1,8 +1,8 @@ -#include "lib1.h" -#include "lib2.h" - -void setup() { -} - -void loop() { -} +#include "lib1.h" +#include "lib2.h" + +void setup() { +} + +void loop() { +} From be54e5214d2938e480b8dfe9edec32381c2dd680 Mon Sep 17 00:00:00 2001 From: Matteo Pologruto Date: Fri, 16 Sep 2022 10:34:59 +0200 Subject: [PATCH 08/10] Migrate TestCompileWithArchivesAndLongPaths from test_compile_part_2.py to compile_part_2_test.go --- .../compile/compile_part_2_test.go | 34 +++++++++++++++++++ test/test_compile_part_2.py | 22 ------------ 2 files changed, 34 insertions(+), 22 deletions(-) diff --git a/internal/integrationtest/compile/compile_part_2_test.go b/internal/integrationtest/compile/compile_part_2_test.go index a3e1fafa85b..1096fd35316 100644 --- a/internal/integrationtest/compile/compile_part_2_test.go +++ b/internal/integrationtest/compile/compile_part_2_test.go @@ -18,6 +18,7 @@ package compile_part_1_test import ( "crypto/md5" "encoding/hex" + "encoding/json" "strings" "testing" @@ -294,3 +295,36 @@ func TestCompileWithCustomLibraries(t *testing.T) { _, _, err = cli.Run("compile", "--libraries", firstLib.String(), "--libraries", secondLib.String(), "-b", fqbn, sketchPath.String()) require.NoError(t, err) } + +func TestCompileWithArchivesAndLongPaths(t *testing.T) { + env, cli := integrationtest.CreateArduinoCLIWithEnvironment(t) + defer env.CleanUp() + + // Creates config with additional URL to install necessary core + url := "http://arduino.esp8266.com/stable/package_esp8266com_index.json" + _, _, err := cli.Run("config", "init", "--dest-dir", ".", "--additional-urls", url) + require.NoError(t, err) + + // Init the environment explicitly + _, _, err = cli.Run("update") + require.NoError(t, err) + + // Install core to compile + _, _, err = cli.Run("core", "install", "esp8266:esp8266@2.7.4") + require.NoError(t, err) + + // Install test library + _, _, err = cli.Run("lib", "install", "ArduinoIoTCloud") + require.NoError(t, err) + + stdout, _, err := cli.Run("lib", "examples", "ArduinoIoTCloud", "--format", "json") + require.NoError(t, err) + var libOutput []map[string]interface{} + err = json.Unmarshal(stdout, &libOutput) + require.NoError(t, err) + sketchPath := paths.New(libOutput[0]["library"].(map[string]interface{})["install_dir"].(string)) + sketchPath = sketchPath.Join("examples", "ArduinoIoTCloud-Advanced") + + _, _, err = cli.Run("compile", "-b", "esp8266:esp8266:huzzah", sketchPath.String()) + require.NoError(t, err) +} diff --git a/test/test_compile_part_2.py b/test/test_compile_part_2.py index 143dc890f40..f2c5bb6eda8 100644 --- a/test/test_compile_part_2.py +++ b/test/test_compile_part_2.py @@ -40,28 +40,6 @@ def test_compile_with_custom_libraries(run_command, copy_sketch): assert run_command(["compile", "--libraries", first_lib, "--libraries", second_lib, "-b", fqbn, sketch_path]) -def test_compile_with_archives_and_long_paths(run_command): - # Creates config with additional URL to install necessary core - url = "http://arduino.esp8266.com/stable/package_esp8266com_index.json" - assert run_command(["config", "init", "--dest-dir", ".", "--additional-urls", url]) - - # Init the environment explicitly - assert run_command(["update"]) - - # Install core to compile - assert run_command(["core", "install", "esp8266:esp8266@2.7.4"]) - - # Install test library - assert run_command(["lib", "install", "ArduinoIoTCloud"]) - - result = run_command(["lib", "examples", "ArduinoIoTCloud", "--format", "json"]) - assert result.ok - lib_output = json.loads(result.stdout) - sketch_path = Path(lib_output[0]["library"]["install_dir"], "examples", "ArduinoIoTCloud-Advanced") - - assert run_command(["compile", "-b", "esp8266:esp8266:huzzah", sketch_path]) - - def test_compile_with_precompiled_library(run_command, data_dir): assert run_command(["update"]) From 2e8288057476213d5f97ad076a0ffec1b0a8cbcc Mon Sep 17 00:00:00 2001 From: Matteo Pologruto Date: Fri, 16 Sep 2022 10:44:04 +0200 Subject: [PATCH 09/10] Migrate TestCompileWithPrecompileLibrary to compile_part_2_test.go and delete test_compile_part_2.py --- .../compile/compile_part_2_test.go | 24 ++++++++ test/test_compile_part_2.py | 58 ------------------- 2 files changed, 24 insertions(+), 58 deletions(-) delete mode 100644 test/test_compile_part_2.py diff --git a/internal/integrationtest/compile/compile_part_2_test.go b/internal/integrationtest/compile/compile_part_2_test.go index 1096fd35316..58fdeab4897 100644 --- a/internal/integrationtest/compile/compile_part_2_test.go +++ b/internal/integrationtest/compile/compile_part_2_test.go @@ -328,3 +328,27 @@ func TestCompileWithArchivesAndLongPaths(t *testing.T) { _, _, err = cli.Run("compile", "-b", "esp8266:esp8266:huzzah", sketchPath.String()) require.NoError(t, err) } + +func TestCompileWithPrecompileLibrary(t *testing.T) { + env, cli := integrationtest.CreateArduinoCLIWithEnvironment(t) + defer env.CleanUp() + + _, _, err := cli.Run("update") + require.NoError(t, err) + + _, _, err = cli.Run("core", "install", "arduino:samd@1.8.11") + require.NoError(t, err) + fqbn := "arduino:samd:mkrzero" + + // Install precompiled library + // For more information see: + // https://arduino.github.io/arduino-cli/latest/library-specification/#precompiled-binaries + _, _, err = cli.Run("lib", "install", "BSEC Software Library@1.5.1474") + require.NoError(t, err) + sketchFolder := cli.SketchbookDir().Join("libraries", "BSEC_Software_Library", "examples", "basic") + + // Compile and verify dependencies detection for fully precompiled library is not skipped + stdout, _, err := cli.Run("compile", "-b", fqbn, sketchFolder.String(), "-v") + require.NoError(t, err) + require.NotContains(t, string(stdout), "Skipping dependencies detection for precompiled library BSEC Software Library") +} diff --git a/test/test_compile_part_2.py b/test/test_compile_part_2.py deleted file mode 100644 index f2c5bb6eda8..00000000000 --- a/test/test_compile_part_2.py +++ /dev/null @@ -1,58 +0,0 @@ -# This file is part of arduino-cli. -# -# Copyright 2020 ARDUINO SA (http://www.arduino.cc/) -# -# This software is released under the GNU General Public License version 3, -# which covers the main part of arduino-cli. -# The terms of this license can be found at: -# https://www.gnu.org/licenses/gpl-3.0.en.html -# -# You can be released from the requirements of the above licenses by purchasing -# a commercial license. Buying such a license is mandatory if you want to modify or -# otherwise use the software for commercial activities involving the Arduino -# software without disclosing the source code of your own applications. To purchase -# a commercial license, send an email to license@arduino.cc. - -import tempfile -import hashlib -from pathlib import Path -import simplejson as json - - -def test_compile_with_custom_libraries(run_command, copy_sketch): - # Creates config with additional URL to install necessary core - url = "http://arduino.esp8266.com/stable/package_esp8266com_index.json" - assert run_command(["config", "init", "--dest-dir", ".", "--additional-urls", url]) - - # Init the environment explicitly - assert run_command(["update"]) - - # Install core to compile - assert run_command(["core", "install", "esp8266:esp8266"]) - - sketch_path = copy_sketch("sketch_with_multiple_custom_libraries") - fqbn = "esp8266:esp8266:nodemcu:xtal=80,vt=heap,eesz=4M1M,wipe=none,baud=115200" - - first_lib = Path(sketch_path, "libraries1") - second_lib = Path(sketch_path, "libraries2") - # This compile command has been taken from this issue: - # https://github.com/arduino/arduino-cli/issues/973 - assert run_command(["compile", "--libraries", first_lib, "--libraries", second_lib, "-b", fqbn, sketch_path]) - - -def test_compile_with_precompiled_library(run_command, data_dir): - assert run_command(["update"]) - - assert run_command(["core", "install", "arduino:samd@1.8.11"]) - fqbn = "arduino:samd:mkrzero" - - # Install precompiled library - # For more information see: - # https://arduino.github.io/arduino-cli/latest/library-specification/#precompiled-binaries - assert run_command(["lib", "install", "BSEC Software Library@1.5.1474"]) - sketch_folder = Path(data_dir, "libraries", "BSEC_Software_Library", "examples", "basic") - - # Compile and verify dependencies detection for fully precompiled library is not skipped - result = run_command(["compile", "-b", fqbn, sketch_folder, "-v"]) - assert result.ok - assert "Skipping dependencies detection for precompiled library BSEC Software Library" not in result.stdout From b36daf22a1e854d878b8e19a71ff3a674a72e439 Mon Sep 17 00:00:00 2001 From: Matteo Pologruto Date: Mon, 3 Oct 2022 14:56:16 +0200 Subject: [PATCH 10/10] Increase lapse before timeout by 5 minutes --- Taskfile.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Taskfile.yml b/Taskfile.yml index ea46850fcd2..786fe627e7e 100755 --- a/Taskfile.yml +++ b/Taskfile.yml @@ -102,7 +102,7 @@ tasks: -short \ -p 1 \ -run '{{default ".*" .GO_TEST_REGEX}}' \ - {{default "-timeout 10m -coverpkg=./... -covermode=atomic" .GO_TEST_FLAGS}} \ + {{default "-timeout 15m -coverpkg=./... -covermode=atomic" .GO_TEST_FLAGS}} \ -coverprofile=coverage_unit.txt \ {{default .DEFAULT_GO_PACKAGES .GO_PACKAGES}} \ {{.TEST_LDFLAGS}}