From 5a54e094b947a7007e1f165b46bf7add0e0ed08d Mon Sep 17 00:00:00 2001 From: Matteo Pologruto Date: Mon, 13 Mar 2023 17:52:47 +0100 Subject: [PATCH 1/2] Recover from failed builtin tools installation --- arduino/cores/tools.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/arduino/cores/tools.go b/arduino/cores/tools.go index 2c78f8b92ae..e1cf078b286 100644 --- a/arduino/cores/tools.go +++ b/arduino/cores/tools.go @@ -106,7 +106,11 @@ func (tool *Tool) String() string { // IsInstalled returns true if the ToolRelease is installed func (tr *ToolRelease) IsInstalled() bool { - return tr.InstallDir != nil + if tr.InstallDir == nil { + return false + } + dirContent, _ := tr.InstallDir.ReadDir() + return dirContent.Len() != 0 } func (tr *ToolRelease) String() string { From 44513afe1fd8175bf8cff9b2ef235349a58e0ad1 Mon Sep 17 00:00:00 2001 From: Matteo Pologruto Date: Tue, 14 Mar 2023 10:36:22 +0100 Subject: [PATCH 2/2] Add tests for the changes --- arduino/cores/packagemanager/loader_test.go | 4 ++++ .../packagemanager/package_manager_test.go | 2 ++ internal/integrationtest/board/board_test.go | 24 +++++++++++++++++++ 3 files changed, 30 insertions(+) diff --git a/arduino/cores/packagemanager/loader_test.go b/arduino/cores/packagemanager/loader_test.go index 5330dd3e9c0..150df716232 100644 --- a/arduino/cores/packagemanager/loader_test.go +++ b/arduino/cores/packagemanager/loader_test.go @@ -170,6 +170,8 @@ arduino_zero_edbg.serial.disableRTS=true func TestLoadDiscoveries(t *testing.T) { // Create all the necessary data to load discoveries fakePath := paths.New("fake-path") + require.NoError(t, fakePath.Join("LICENSE").MkdirAll()) + defer fakePath.RemoveAll() createTestPackageManager := func() *PackageManager { pmb := NewBuilder(fakePath, fakePath, fakePath, fakePath, "test") @@ -277,6 +279,8 @@ func TestLoadDiscoveries(t *testing.T) { require.Contains(t, discoveries, "teensy") pmeRelease() } + + require.NoError(t, fakePath.RemoveAll()) } func TestConvertUploadToolsToPluggableDiscovery(t *testing.T) { diff --git a/arduino/cores/packagemanager/package_manager_test.go b/arduino/cores/packagemanager/package_manager_test.go index eb63ba1315d..afae83f9b55 100644 --- a/arduino/cores/packagemanager/package_manager_test.go +++ b/arduino/cores/packagemanager/package_manager_test.go @@ -457,6 +457,8 @@ func TestPackageManagerClear(t *testing.T) { func TestFindToolsRequiredFromPlatformRelease(t *testing.T) { // Create all the necessary data to load discoveries fakePath := paths.New("fake-path") + require.NoError(t, fakePath.Join("LICENSE").MkdirAll()) + defer fakePath.RemoveAll() pmb := NewBuilder(fakePath, fakePath, fakePath, fakePath, "test") pack := pmb.GetOrCreatePackage("arduino") diff --git a/internal/integrationtest/board/board_test.go b/internal/integrationtest/board/board_test.go index 4a714277e8a..3369b8a0228 100644 --- a/internal/integrationtest/board/board_test.go +++ b/internal/integrationtest/board/board_test.go @@ -558,3 +558,27 @@ func TestBoardSearchWithOutdatedCore(t *testing.T) { // Installed version must be older than latest require.True(t, installedVersion.LessThan(latestVersion)) } + +func TestBoardListWithFailedBuiltinInstallation(t *testing.T) { + env, cli := integrationtest.CreateArduinoCLIWithEnvironment(t) + defer env.CleanUp() + + _, _, err := cli.Run("core", "update-index") + require.NoError(t, err) + + // board list to install builtin tools + _, _, err = cli.Run("board", "list") + require.NoError(t, err) + + // remove files from serial-discovery directory to simulate a failed installation + serialDiscovery, err := cli.DataDir().Join("packages", "builtin", "tools", "serial-discovery").ReadDir() + require.NoError(t, err) + require.NoError(t, serialDiscovery[0].Join("LICENSE.txt").Remove()) + require.NoError(t, serialDiscovery[0].Join("serial-discovery.exe").Remove()) + + // board list should install serial-discovery again + stdout, stderr, err := cli.Run("board", "list") + require.NoError(t, err) + require.Empty(t, stderr) + require.Contains(t, string(stdout), "Downloading missing tool builtin:serial-discovery") +}