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  }