github.com/robgonnella/ardi/v2@v2.4.5-0.20230102052001-11a49de978c3/commands/attach_and_watch_test.go (about) 1 package commands_test 2 3 import ( 4 "os" 5 "os/exec" 6 "path" 7 "testing" 8 "time" 9 10 rpc "github.com/arduino/arduino-cli/rpc/cc/arduino/cli/commands/v1" 11 "github.com/golang/mock/gomock" 12 "github.com/robgonnella/ardi/v2/testutil" 13 "github.com/stretchr/testify/assert" 14 ) 15 16 func TestAttachAndWatchCommand(t *testing.T) { 17 board := testutil.GenerateRPCBoard("Arduino Mega", "arduino:avr:mega") 18 buildName := "blink" 19 sketchDir := testutil.BlinkProjectDir() 20 sketch := path.Join(sketchDir, "blink.ino") 21 sketchCopy := path.Join(testutil.BlinkCopyProjectDir(), "blink2.ino") 22 fqbn := testutil.ArduinoMegaFQBN() 23 rpcPort := &rpc.Port{ 24 Address: board.Port, 25 } 26 27 instance := &rpc.Instance{Id: int32(1)} 28 29 uploadReq := &rpc.UploadRequest{ 30 Instance: instance, 31 Fqbn: fqbn, 32 SketchPath: sketchDir, 33 Port: rpcPort, 34 } 35 36 platformReq := &rpc.PlatformListRequest{ 37 Instance: instance, 38 UpdatableOnly: false, 39 All: true, 40 } 41 42 boardReq := &rpc.BoardListRequest{ 43 Instance: instance, 44 } 45 46 compileReq := &rpc.CompileRequest{ 47 Instance: instance, 48 Fqbn: board.FQBN, 49 SketchPath: sketch, 50 ExportDir: path.Join(sketchDir, "build"), 51 BuildProperties: []string{}, 52 ShowProperties: false, 53 } 54 55 boardItem := &rpc.BoardListItem{ 56 Name: board.Name, 57 Fqbn: board.FQBN, 58 } 59 60 port := &rpc.DetectedPort{ 61 Port: rpcPort, 62 MatchingBoards: []*rpc.BoardListItem{boardItem}, 63 } 64 65 detectedPorts := []*rpc.DetectedPort{port} 66 67 testutil.RunMockIntegrationTest("attaches and watches saved build", t, func(env *testutil.MockIntegrationTestEnv) { 68 cpCmd := exec.Command("cp", sketchCopy, sketch) 69 70 err := env.RunProjectInit() 71 assert.NoError(env.T, err) 72 73 args := []string{"add", "build", "--name", buildName, "--fqbn", fqbn, "--sketch", sketchDir} 74 err = env.Execute(args) 75 assert.NoError(env.T, err) 76 77 env.SerialPort.EXPECT().SetTargets(board.Port, 9600).AnyTimes() 78 env.SerialPort.EXPECT().SetTargets("", 0).AnyTimes() 79 env.SerialPort.EXPECT().Watch().AnyTimes() 80 env.SerialPort.EXPECT().Close().AnyTimes() 81 82 env.ArduinoCli.EXPECT().CreateInstance().Return(instance).AnyTimes() 83 env.ArduinoCli.EXPECT().Compile(gomock.Any(), compileReq, gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes() 84 env.ArduinoCli.EXPECT().ConnectedBoards(boardReq).Return(detectedPorts, nil) 85 env.ArduinoCli.EXPECT().GetPlatforms(platformReq) 86 env.ArduinoCli.EXPECT().Upload(gomock.Any(), uploadReq, gomock.Any(), gomock.Any()).AnyTimes() 87 88 args = []string{"attach-and-watch", buildName} 89 go env.Execute(args) 90 91 time.Sleep(time.Second * 5) 92 93 env.ClearStdout() 94 err = cpCmd.Run() 95 assert.NoError(env.T, err) 96 97 // wait a second for watcher to trigger 98 time.Sleep(time.Second) 99 100 assert.Contains(env.T, env.Stdout.String(), "Uploading...") 101 assert.Contains(env.T, env.Stdout.String(), "Upload successful") 102 }) 103 104 testutil.RunMockIntegrationTest("attaches and watches directory sketch", t, func(env *testutil.MockIntegrationTestEnv) { 105 cpCmd := exec.Command("cp", sketchCopy, sketch) 106 107 cwd, _ := os.Getwd() 108 os.Chdir(testutil.BlinkProjectDir()) 109 defer os.Chdir(cwd) 110 111 err := env.RunProjectInit() 112 assert.NoError(env.T, err) 113 114 env.SerialPort.EXPECT().SetTargets(board.Port, 9600).AnyTimes() 115 env.SerialPort.EXPECT().SetTargets("", 0).AnyTimes() 116 env.SerialPort.EXPECT().Watch().AnyTimes() 117 env.SerialPort.EXPECT().Close().AnyTimes() 118 119 env.ArduinoCli.EXPECT().CreateInstance().Return(instance).AnyTimes() 120 env.ArduinoCli.EXPECT().Compile(gomock.Any(), compileReq, gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes() 121 env.ArduinoCli.EXPECT().ConnectedBoards(boardReq).Return(detectedPorts, nil) 122 env.ArduinoCli.EXPECT().GetPlatforms(platformReq) 123 env.ArduinoCli.EXPECT().Upload(gomock.Any(), uploadReq, gomock.Any(), gomock.Any()).AnyTimes() 124 125 args := []string{"attach-and-watch", "--fqbn", fqbn, sketch} 126 go env.Execute(args) 127 128 time.Sleep(time.Second * 5) 129 130 env.ClearStdout() 131 err = cpCmd.Run() 132 assert.NoError(env.T, err) 133 134 // wait a second for watcher to trigger 135 time.Sleep(time.Second) 136 137 assert.Contains(env.T, env.Stdout.String(), "Uploading...") 138 assert.Contains(env.T, env.Stdout.String(), "Upload successful") 139 }) 140 141 testutil.RunMockIntegrationTest("attaches and watches using auto detected values", t, func(env *testutil.MockIntegrationTestEnv) { 142 cpCmd := exec.Command("cp", sketchCopy, sketch) 143 144 cwd, _ := os.Getwd() 145 os.Chdir(testutil.BlinkProjectDir()) 146 147 err := env.RunProjectInit() 148 assert.NoError(env.T, err) 149 150 env.SerialPort.EXPECT().SetTargets(board.Port, 9600).AnyTimes() 151 env.SerialPort.EXPECT().SetTargets("", 0).AnyTimes() 152 env.SerialPort.EXPECT().Watch().AnyTimes() 153 env.SerialPort.EXPECT().Close().AnyTimes() 154 155 env.ArduinoCli.EXPECT().CreateInstance().Return(instance).AnyTimes() 156 env.ArduinoCli.EXPECT().Compile(gomock.Any(), compileReq, gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes() 157 env.ArduinoCli.EXPECT().ConnectedBoards(boardReq).Return(detectedPorts, nil) 158 env.ArduinoCli.EXPECT().GetPlatforms(platformReq) 159 env.ArduinoCli.EXPECT().Upload(gomock.Any(), uploadReq, gomock.Any(), gomock.Any()).AnyTimes() 160 161 args := []string{"attach-and-watch"} 162 go env.Execute(args) 163 164 time.Sleep(time.Second * 5) 165 166 env.ClearStdout() 167 err = cpCmd.Run() 168 assert.NoError(env.T, err) 169 170 // wait a second for watcher to trigger 171 time.Sleep(time.Second) 172 173 assert.Contains(env.T, env.Stdout.String(), "Uploading...") 174 assert.Contains(env.T, env.Stdout.String(), "Upload successful") 175 os.Chdir(cwd) 176 }) 177 178 testutil.RunMockIntegrationTest("returns error if no sketch found in current directory", t, func(env *testutil.MockIntegrationTestEnv) { 179 env.RunProjectInit() 180 args := []string{"attach-and-watch"} 181 err := env.Execute(args) 182 assert.Error(env.T, err) 183 }) 184 185 testutil.RunMockIntegrationTest("errors if project not initialized", t, func(env *testutil.MockIntegrationTestEnv) { 186 args := []string{"attach-and-watch"} 187 err := env.Execute(args) 188 assert.Error(env.T, err) 189 }) 190 }