github.com/robgonnella/ardi/v2@v2.4.5-0.20230102052001-11a49de978c3/commands/upload_test.go (about) 1 package commands_test 2 3 import ( 4 "errors" 5 "os" 6 "path" 7 "testing" 8 9 rpc "github.com/arduino/arduino-cli/rpc/cc/arduino/cli/commands/v1" 10 "github.com/golang/mock/gomock" 11 "github.com/robgonnella/ardi/v2/testutil" 12 "github.com/stretchr/testify/assert" 13 ) 14 15 func TestUploadCommand(t *testing.T) { 16 board := testutil.GenerateRPCBoard("Arduino Mega", "arduino:avr:mega") 17 rpcPort := &rpc.Port{ 18 Address: board.Port, 19 } 20 buildName := "blink" 21 sketchDir := testutil.BlinkProjectDir() 22 sketch := path.Join(sketchDir, "blink.ino") 23 bogusSketch := "noop" 24 fqbn := testutil.ArduinoMegaFQBN() 25 26 instance := &rpc.Instance{Id: int32(1)} 27 28 platformReq := &rpc.PlatformListRequest{ 29 Instance: instance, 30 UpdatableOnly: false, 31 All: true, 32 } 33 34 boardReq := &rpc.BoardListRequest{ 35 Instance: instance, 36 } 37 38 boardItem := &rpc.BoardListItem{ 39 Name: board.Name, 40 Fqbn: board.FQBN, 41 } 42 43 port := &rpc.DetectedPort{ 44 Port: rpcPort, 45 MatchingBoards: []*rpc.BoardListItem{boardItem}, 46 } 47 48 detectedPorts := []*rpc.DetectedPort{port} 49 50 addBuild := func(e *testutil.MockIntegrationTestEnv) { 51 err := e.RunProjectInit() 52 assert.NoError(e.T, err) 53 54 args := []string{"add", "build", "--name", buildName, "--fqbn", fqbn, "--sketch", sketchDir} 55 err = e.Execute(args) 56 assert.NoError(e.T, err) 57 } 58 59 expectUsuals := func(e *testutil.MockIntegrationTestEnv) { 60 e.SerialPort.EXPECT().Close().MaxTimes(1) 61 e.SerialPort.EXPECT().SetTargets("", 0).MaxTimes(1) 62 e.ArduinoCli.EXPECT().CreateInstance().Return(instance).MaxTimes(1) 63 e.ArduinoCli.EXPECT().GetPlatforms(platformReq).MaxTimes(1) 64 } 65 66 testutil.RunMockIntegrationTest("uploads a build", t, func(env *testutil.MockIntegrationTestEnv) { 67 addBuild(env) 68 expectUsuals(env) 69 req := &rpc.UploadRequest{ 70 Instance: instance, 71 SketchPath: sketchDir, 72 Fqbn: fqbn, 73 Port: rpcPort, 74 } 75 env.ArduinoCli.EXPECT().ConnectedBoards(boardReq).Return(detectedPorts, nil).MaxTimes(1) 76 env.ArduinoCli.EXPECT().Upload(gomock.Any(), req, gomock.Any(), gomock.Any()).MaxTimes(1) 77 args := []string{"upload", buildName} 78 err := env.Execute(args) 79 assert.NoError(env.T, err) 80 }) 81 82 testutil.RunMockIntegrationTest("uploads a sketch", t, func(env *testutil.MockIntegrationTestEnv) { 83 addBuild(env) 84 expectUsuals(env) 85 req := &rpc.UploadRequest{ 86 Instance: instance, 87 SketchPath: sketchDir, 88 Fqbn: fqbn, 89 Port: rpcPort, 90 } 91 env.ArduinoCli.EXPECT().ConnectedBoards(boardReq).Return(detectedPorts, nil).MaxTimes(1) 92 env.ArduinoCli.EXPECT().Upload(gomock.Any(), req, gomock.Any(), gomock.Any()).MaxTimes(1) 93 args := []string{"upload", "--fqbn", fqbn, sketch} 94 err := env.Execute(args) 95 assert.NoError(env.T, err) 96 }) 97 98 testutil.RunMockIntegrationTest("uploads a sketch using default build auto-detected values", t, func(env *testutil.MockIntegrationTestEnv) { 99 addBuild(env) 100 expectUsuals(env) 101 102 env.RunProjectInit() 103 104 defaultBuild := "default" 105 defaultSketchDir := testutil.PixieProjectDir() 106 defaultSketch := path.Join(defaultSketchDir, "pixie.ino") 107 defaultFQBN := testutil.ArduinoMegaFQBN() 108 109 args := []string{"add", "build", "--name", defaultBuild, "--fqbn", defaultFQBN, "--sketch", defaultSketch} 110 111 err := env.Execute(args) 112 assert.NoError(env.T, err) 113 114 defaultUploadReq := &rpc.UploadRequest{ 115 Instance: instance, 116 Fqbn: defaultFQBN, 117 SketchPath: defaultSketchDir, 118 Port: rpcPort, 119 } 120 121 env.ArduinoCli.EXPECT().ConnectedBoards(boardReq).Return(detectedPorts, nil).MaxTimes(1) 122 env.ArduinoCli.EXPECT().Upload(gomock.Any(), defaultUploadReq, gomock.Any(), gomock.Any()).MaxTimes(1) 123 124 args = []string{"upload"} 125 err = env.Execute(args) 126 assert.NoError(env.T, err) 127 }) 128 129 testutil.RunMockIntegrationTest("uploads a sketch using single build values", t, func(env *testutil.MockIntegrationTestEnv) { 130 addBuild(env) 131 expectUsuals(env) 132 req := &rpc.UploadRequest{ 133 Instance: instance, 134 SketchPath: sketchDir, 135 Fqbn: fqbn, 136 Port: rpcPort, 137 } 138 env.ArduinoCli.EXPECT().ConnectedBoards(boardReq).Return(detectedPorts, nil).MaxTimes(1) 139 env.ArduinoCli.EXPECT().Upload(gomock.Any(), req, gomock.Any(), gomock.Any()).MaxTimes(1) 140 141 args := []string{"upload"} 142 err := env.Execute(args) 143 assert.NoError(env.T, err) 144 }) 145 146 testutil.RunMockIntegrationTest("uploads a sketch using auto detected .ino values", t, func(env *testutil.MockIntegrationTestEnv) { 147 currentDir, _ := os.Getwd() 148 pixieDir := testutil.PixieProjectDir() 149 150 os.Chdir(pixieDir) 151 152 defer func() { 153 testutil.CleanPixieDir() 154 os.Chdir(currentDir) 155 }() 156 157 err := env.RunProjectInit() 158 assert.NoError(env.T, err) 159 160 expectedReq := &rpc.UploadRequest{ 161 Instance: instance, 162 SketchPath: pixieDir, 163 Fqbn: board.FQBN, 164 Port: rpcPort, 165 } 166 167 expectUsuals(env) 168 env.ArduinoCli.EXPECT().ConnectedBoards(boardReq).Return(detectedPorts, nil).MaxTimes(1) 169 env.ArduinoCli.EXPECT().Upload(gomock.Any(), expectedReq, gomock.Any(), gomock.Any()).MaxTimes(1) 170 171 args := []string{"upload"} 172 err = env.Execute(args) 173 assert.NoError(env.T, err) 174 }) 175 176 testutil.RunMockIntegrationTest("returns upload errors", t, func(env *testutil.MockIntegrationTestEnv) { 177 addBuild(env) 178 expectUsuals(env) 179 dummyErr := errors.New("dummy") 180 req := &rpc.UploadRequest{ 181 Instance: instance, 182 SketchPath: sketchDir, 183 Fqbn: fqbn, 184 Port: rpcPort, 185 } 186 env.ArduinoCli.EXPECT().ConnectedBoards(boardReq).Return(detectedPorts, nil).MaxTimes(1) 187 env.ArduinoCli.EXPECT().Upload(gomock.Any(), req, gomock.Any(), gomock.Any()).Return(nil, dummyErr).MaxTimes(1) 188 args := []string{"upload", "--fqbn", fqbn, sketch} 189 err := env.Execute(args) 190 assert.Error(env.T, err) 191 assert.EqualError(env.T, err, dummyErr.Error()) 192 }) 193 194 testutil.RunMockIntegrationTest("errors if sketch not found", t, func(env *testutil.MockIntegrationTestEnv) { 195 addBuild(env) 196 expectUsuals(env) 197 env.ArduinoCli.EXPECT().ConnectedBoards(boardReq).Return([]*rpc.DetectedPort{}, nil).MaxTimes(1) 198 args := []string{"upload", "--fqbn", fqbn, bogusSketch} 199 err := env.Execute(args) 200 assert.Error(env.T, err) 201 }) 202 203 testutil.RunMockIntegrationTest("errors if no board connected", t, func(env *testutil.MockIntegrationTestEnv) { 204 addBuild(env) 205 expectUsuals(env) 206 env.ArduinoCli.EXPECT().ConnectedBoards(boardReq).Return([]*rpc.DetectedPort{}, nil).MaxTimes(1) 207 args := []string{"upload", buildName, "--attach"} 208 err := env.Execute(args) 209 assert.Error(env.T, err) 210 }) 211 212 testutil.RunMockIntegrationTest("errors if project not initialized", t, func(env *testutil.MockIntegrationTestEnv) { 213 args := []string{"upload", buildName, "--attach"} 214 err := env.Execute(args) 215 assert.Error(env.T, err) 216 }) 217 }