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  }