Skip to content

Commit d20e576

Browse files
return different exit codes in the upload command
1 parent 0a73399 commit d20e576

File tree

3 files changed

+56
-3
lines changed

3 files changed

+56
-3
lines changed

internal/cli/upload/upload.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ func runUploadCommand(command *cobra.Command, args []string) {
9292

9393
sk, err := sketch.New(sketchPath)
9494
if err != nil && importDir == "" && importFile == "" {
95-
feedback.Fatal(tr("Error during Upload: %v", err), feedback.ErrGeneric)
95+
feedback.Fatal(tr("Error during Upload: %v", err), feedback.ErrSketchError)
9696
}
9797

9898
instance, profile := instance.CreateAndInitWithProfile(profileArg.Get(), sketchPath)
@@ -136,7 +136,7 @@ func runUploadCommand(command *cobra.Command, args []string) {
136136
msg += tr("Platform %s is not found in any known index\nMaybe you need to add a 3rd party URL?", platformErr.Platform)
137137
}
138138
}
139-
feedback.Fatal(msg, feedback.ErrGeneric)
139+
feedback.Fatal(msg, feedback.ErrBoardUpload)
140140
}
141141

142142
fields := map[string]string{}
@@ -169,7 +169,7 @@ func runUploadCommand(command *cobra.Command, args []string) {
169169
UserFields: fields,
170170
}
171171
if err := upload.Upload(context.Background(), req, stdOut, stdErr); err != nil {
172-
feedback.FatalError(err, feedback.ErrGeneric)
172+
feedback.FatalError(err, feedback.ErrBoardUpload)
173173
}
174174
feedback.PrintResult(stdIOResult())
175175
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
// This file is part of arduino-cli.
2+
//
3+
// Copyright 2023 ARDUINO SA (http://www.arduino.cc/)
4+
//
5+
// This software is released under the GNU General Public License version 3,
6+
// which covers the main part of arduino-cli.
7+
// The terms of this license can be found at:
8+
// https://www.gnu.org/licenses/gpl-3.0.en.html
9+
//
10+
// You can be released from the requirements of the above licenses by purchasing
11+
// a commercial license. Buying such a license is mandatory if you want to
12+
// modify or otherwise use the software for commercial activities involving the
13+
// Arduino software without disclosing the source code of your own applications.
14+
// To purchase a commercial license, send an email to license@arduino.cc.
15+
16+
package assert
17+
18+
import (
19+
"os/exec"
20+
"testing"
21+
22+
"github.com/arduino/arduino-cli/internal/cli/feedback"
23+
"github.com/stretchr/testify/require"
24+
)
25+
26+
func CmdExitCode(t *testing.T, expected feedback.ExitCode, err error) {
27+
var cmdErr *exec.ExitError
28+
require.ErrorAs(t, err, &cmdErr)
29+
require.Equal(t, expected, feedback.ExitCode(cmdErr.ExitCode()))
30+
}

internal/integrationtest/compile_1/compile_test.go

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,9 @@ import (
2626
"time"
2727

2828
"github.com/arduino/arduino-cli/arduino/builder/cpp"
29+
"github.com/arduino/arduino-cli/internal/cli/feedback"
2930
"github.com/arduino/arduino-cli/internal/integrationtest"
31+
"github.com/arduino/arduino-cli/internal/integrationtest/assert"
3032
"github.com/arduino/go-paths-helper"
3133
"github.com/stretchr/testify/require"
3234
"go.bug.st/testifyjson/requirejson"
@@ -91,21 +93,26 @@ func compileErrorMessage(t *testing.T, env *integrationtest.Environment, cli *in
9193
_, stderr, err := cli.Run("compile", "-b", "arduino:avr:uno", abcdef.String())
9294
require.Error(t, err)
9395
require.Contains(t, string(stderr), "no such file or directory:")
96+
assert.CmdExitCode(t, feedback.ErrSketchError, err)
9497
_, stderr, err = cli.Run("compile", "-b", "arduino:avr:uno", abcdef.Join("ABCDEF.ino").String())
9598
require.Error(t, err)
9699
require.Contains(t, string(stderr), "no such file or directory:")
100+
assert.CmdExitCode(t, feedback.ErrSketchError, err)
97101
_, stderr, err = cli.Run("compile", "-b", "arduino:avr:uno", abcdef.Join("QWERTY").String())
98102
require.Error(t, err)
99103
require.Contains(t, string(stderr), "no such file or directory:")
104+
assert.CmdExitCode(t, feedback.ErrSketchError, err)
100105

101106
err = abcdef.Mkdir()
102107
require.NoError(t, err)
103108
_, stderr, err = cli.Run("compile", "-b", "arduino:avr:uno", abcdef.String())
104109
require.Error(t, err)
105110
require.Contains(t, string(stderr), "main file missing from sketch:")
111+
assert.CmdExitCode(t, feedback.ErrSketchError, err)
106112
_, stderr, err = cli.Run("compile", "-b", "arduino:avr:uno", abcdef.Join("ABCDEF.ino").String())
107113
require.Error(t, err)
108114
require.Contains(t, string(stderr), "no such file or directory:")
115+
assert.CmdExitCode(t, feedback.ErrSketchError, err)
109116

110117
qwertyIno := abcdef.Join("QWERTY.ino")
111118
f, err := qwertyIno.Create()
@@ -114,6 +121,7 @@ func compileErrorMessage(t *testing.T, env *integrationtest.Environment, cli *in
114121
_, stderr, err = cli.Run("compile", "-b", "arduino:avr:uno", qwertyIno.String())
115122
require.Error(t, err)
116123
require.Contains(t, string(stderr), "main file missing from sketch:")
124+
assert.CmdExitCode(t, feedback.ErrSketchError, err)
117125
}
118126

119127
func compileWithSimpleSketch(t *testing.T, env *integrationtest.Environment, cli *integrationtest.ArduinoCLI) {
@@ -228,6 +236,7 @@ func compileWithSketchWithSymlinkSelfloop(t *testing.T, env *integrationtest.Env
228236
// returning a different error detailed message
229237
require.Contains(t, string(stderr), "Can't open sketch:")
230238
require.Error(t, err)
239+
assert.CmdExitCode(t, feedback.ErrSketchError, err)
231240
}
232241
{
233242
sketchName := "CompileIntegrationTestSymlinkDirLoop"
@@ -254,6 +263,7 @@ func compileWithSketchWithSymlinkSelfloop(t *testing.T, env *integrationtest.Env
254263
// returning a different error detailed message
255264
require.Contains(t, string(stderr), "Can't open sketch:")
256265
require.Error(t, err)
266+
assert.CmdExitCode(t, feedback.ErrSketchError, err)
257267
}
258268
}
259269

@@ -349,6 +359,7 @@ func compileWithMultipleBuildPropertyFlags(t *testing.T, env *integrationtest.En
349359
sketchPath.String(), "--verbose", "--clean",
350360
)
351361
require.Error(t, err)
362+
assert.CmdExitCode(t, feedback.ErrCompilation, err)
352363

353364
// Compile using multiple build properties separated by a space and properly quoted
354365
stdout, _, err := cli.Run(
@@ -366,6 +377,7 @@ func compileWithMultipleBuildPropertyFlags(t *testing.T, env *integrationtest.En
366377
sketchPath.String(), "--verbose", "--clean",
367378
)
368379
require.Error(t, err)
380+
assert.CmdExitCode(t, feedback.ErrCompilation, err)
369381

370382
stdout, _, err = cli.Run(
371383
"compile", "-b", fqbn,
@@ -376,6 +388,7 @@ func compileWithMultipleBuildPropertyFlags(t *testing.T, env *integrationtest.En
376388
require.Error(t, err)
377389
require.NotContains(t, string(stdout), "-DPIN=2")
378390
require.Contains(t, string(stdout), "-DSSID=\\\"This is a String\\\"")
391+
assert.CmdExitCode(t, feedback.ErrCompilation, err)
379392

380393
stdout, _, err = cli.Run(
381394
"compile", "-b", fqbn,
@@ -621,16 +634,19 @@ func compileWithMultipleMainFiles(t *testing.T, env *integrationtest.Environment
621634
_, stderr, err := cli.Run("compile", "--clean", "-b", fqbn, sketchPath.String())
622635
require.Error(t, err)
623636
require.Contains(t, string(stderr), "Can't open sketch: multiple main sketch files found")
637+
assert.CmdExitCode(t, feedback.ErrSketchError, err)
624638

625639
// Build sketch from .ino file
626640
_, stderr, err = cli.Run("compile", "--clean", "-b", fqbn, sketchFileIno.String())
627641
require.Error(t, err)
628642
require.Contains(t, string(stderr), "Can't open sketch: multiple main sketch files found")
643+
assert.CmdExitCode(t, feedback.ErrSketchError, err)
629644

630645
// Build sketch from .pde file
631646
_, stderr, err = cli.Run("compile", "--clean", "-b", fqbn, sketchFilePde.String())
632647
require.Error(t, err)
633648
require.Contains(t, string(stderr), "Can't open sketch: multiple main sketch files found")
649+
assert.CmdExitCode(t, feedback.ErrSketchError, err)
634650
}
635651

636652
func compileCaseMismatchFails(t *testing.T, env *integrationtest.Environment, cli *integrationtest.ArduinoCLI) {
@@ -653,16 +669,19 @@ func compileCaseMismatchFails(t *testing.T, env *integrationtest.Environment, cl
653669
_, stderr, err := cli.Run("compile", "--clean", "-b", fqbn, sketchPath.String())
654670
require.Error(t, err)
655671
require.Contains(t, string(stderr), "Can't open sketch:")
672+
assert.CmdExitCode(t, feedback.ErrSketchError, err)
656673
// * Compiling with sketch main file
657674
_, stderr, err = cli.Run("compile", "--clean", "-b", fqbn, sketchMainFile.String())
658675
require.Error(t, err)
659676
require.Contains(t, string(stderr), "Can't open sketch:")
677+
assert.CmdExitCode(t, feedback.ErrSketchError, err)
660678
// * Compiling in sketch path
661679
cli.SetWorkingDir(sketchPath)
662680
defer cli.SetWorkingDir(env.RootDir())
663681
_, stderr, err = cli.Run("compile", "--clean", "-b", fqbn)
664682
require.Error(t, err)
665683
require.Contains(t, string(stderr), "Can't open sketch:")
684+
assert.CmdExitCode(t, feedback.ErrSketchError, err)
666685
}
667686

668687
func compileOnlyCompilationDatabaseFlag(t *testing.T, env *integrationtest.Environment, cli *integrationtest.ArduinoCLI) {
@@ -721,6 +740,7 @@ func compileUsingPlatformLocalTxt(t *testing.T, env *integrationtest.Environment
721740
_, stderr, err := cli.Run("compile", "--clean", "-b", fqbn, sketchPath.String())
722741
require.Error(t, err)
723742
require.Contains(t, string(stderr), "my-compiler-that-does-not-exist")
743+
assert.CmdExitCode(t, feedback.ErrCompilation, err)
724744
}
725745

726746
func compileUsingBoardsLocalTxt(t *testing.T, env *integrationtest.Environment, cli *integrationtest.ArduinoCLI) {
@@ -737,6 +757,7 @@ func compileUsingBoardsLocalTxt(t *testing.T, env *integrationtest.Environment,
737757
_, stderr, err := cli.Run("compile", "--clean", "-b", fqbn, sketchPath.String())
738758
require.Error(t, err)
739759
require.Contains(t, string(stderr), "Error during build: Invalid FQBN: board arduino:avr:nessuno not found")
760+
assert.CmdExitCode(t, feedback.ErrCompilation, err)
740761

741762
// Use custom boards.local.txt with made arduino:avr:nessuno board
742763
boardsLocalTxt := cli.DataDir().Join("packages", "arduino", "hardware", "avr", "1.8.5", "boards.local.txt")
@@ -999,6 +1020,7 @@ func TestCompileManuallyInstalledPlatformUsingPlatformLocalTxt(t *testing.T) {
9991020
_, stderr, err := cli.Run("compile", "--clean", "-b", fqbn, sketchPath.String())
10001021
require.Error(t, err)
10011022
require.Contains(t, string(stderr), "my-compiler-that-does-not-exist")
1023+
assert.CmdExitCode(t, feedback.ErrCompilation, err)
10021024
}
10031025

10041026
func compileWithInvalidBuildOptionJson(t *testing.T, env *integrationtest.Environment, cli *integrationtest.ArduinoCLI) {
@@ -1134,6 +1156,7 @@ func compileWithFakeSecureBootCore(t *testing.T, env *integrationtest.Environmen
11341156
)
11351157
require.Error(t, err)
11361158
require.Contains(t, string(stderr), "Flag --sign-key is mandatory when used in conjunction with: --keys-keychain, --sign-key, --encrypt-key")
1159+
assert.CmdExitCode(t, feedback.ErrBadArgument, err)
11371160

11381161
// Verifies compilation works with secure boot enabled and when overriding the sign key and encryption key used
11391162
keysDir := cli.SketchbookDir().Join("keys_dir")

0 commit comments

Comments
 (0)