gobot.io/x/gobot/v2@v2.1.0/platforms/adaptors/spibusadaptor_test.go (about) 1 package adaptors 2 3 import ( 4 "fmt" 5 "strings" 6 "testing" 7 8 "gobot.io/x/gobot/v2/drivers/spi" 9 "gobot.io/x/gobot/v2/gobottest" 10 "gobot.io/x/gobot/v2/system" 11 ) 12 13 // make sure that this SpiBusAdaptor fulfills all the required interfaces 14 var _ spi.Connector = (*SpiBusAdaptor)(nil) 15 16 const spiTestAllowedBus = 15 17 18 func initTestSpiBusAdaptorWithMockedSpi() (*SpiBusAdaptor, *system.MockSpiAccess) { 19 validator := func(busNr int) error { 20 if busNr != spiTestAllowedBus { 21 return fmt.Errorf("%d not valid", busNr) 22 } 23 return nil 24 } 25 sys := system.NewAccesser() 26 spi := sys.UseMockSpi() 27 a := NewSpiBusAdaptor(sys, validator, 1, 2, 3, 4, 5) 28 if err := a.Connect(); err != nil { 29 panic(err) 30 } 31 return a, spi 32 } 33 34 func TestNewSpiAdaptor(t *testing.T) { 35 // arrange 36 a := NewSpiBusAdaptor(nil, nil, 1, 2, 3, 4, 5) 37 // act & assert 38 gobottest.Assert(t, a.SpiDefaultBusNumber(), 1) 39 gobottest.Assert(t, a.SpiDefaultChipNumber(), 2) 40 gobottest.Assert(t, a.SpiDefaultMode(), 3) 41 gobottest.Assert(t, a.SpiDefaultBitCount(), 4) 42 gobottest.Assert(t, a.SpiDefaultMaxSpeed(), int64(5)) 43 _, err := a.GetSpiConnection(10, 0, 0, 8, 10000000) 44 gobottest.Assert(t, err.Error(), "not connected") 45 } 46 47 func TestGetSpiConnection(t *testing.T) { 48 // arrange 49 const ( 50 busNum = spiTestAllowedBus 51 chipNum = 14 52 mode = 13 53 bits = 12 54 maxSpeed = int64(11) 55 ) 56 a, spi := initTestSpiBusAdaptorWithMockedSpi() 57 gobottest.Assert(t, len(a.connections), 0) 58 // act 59 con1, err1 := a.GetSpiConnection(busNum, chipNum, mode, bits, maxSpeed) 60 // assert 61 gobottest.Assert(t, err1, nil) 62 gobottest.Refute(t, con1, nil) 63 gobottest.Assert(t, len(a.connections), 1) 64 // assert cached connection 65 con1a, err2 := a.GetSpiConnection(busNum, chipNum, mode, bits, maxSpeed) 66 gobottest.Assert(t, err2, nil) 67 gobottest.Assert(t, con1a, con1) 68 gobottest.Assert(t, len(a.connections), 1) 69 // assert second connection 70 con2, err3 := a.GetSpiConnection(busNum, chipNum+1, mode, bits, maxSpeed) 71 gobottest.Assert(t, err3, nil) 72 gobottest.Refute(t, con2, nil) 73 gobottest.Refute(t, con2, con1) 74 gobottest.Assert(t, len(a.connections), 2) 75 // assert bus validation error 76 con, err := a.GetSpiConnection(busNum+1, chipNum, mode, bits, maxSpeed) 77 gobottest.Assert(t, err.Error(), "16 not valid") 78 gobottest.Assert(t, con, nil) 79 // assert create error 80 spi.CreateError = true 81 con, err = a.GetSpiConnection(busNum, chipNum+2, mode, bits, maxSpeed) 82 gobottest.Assert(t, err.Error(), "error while create SPI connection in mock") 83 gobottest.Assert(t, con, nil) 84 } 85 86 func TestSpiFinalize(t *testing.T) { 87 // arrange 88 a, _ := initTestSpiBusAdaptorWithMockedSpi() 89 _, e := a.GetSpiConnection(spiTestAllowedBus, 2, 3, 4, 5) 90 gobottest.Assert(t, e, nil) 91 gobottest.Assert(t, len(a.connections), 1) 92 // act 93 err := a.Finalize() 94 // assert 95 gobottest.Assert(t, err, nil) 96 gobottest.Assert(t, len(a.connections), 0) 97 } 98 99 func TestSpiFinalizeWithError(t *testing.T) { 100 // arrange 101 a, spi := initTestSpiBusAdaptorWithMockedSpi() 102 _, e := a.GetSpiConnection(spiTestAllowedBus, 2, 3, 4, 5) 103 gobottest.Assert(t, e, nil) 104 spi.SetCloseError(true) 105 // act 106 err := a.Finalize() 107 // assert 108 gobottest.Assert(t, strings.Contains(err.Error(), "error while SPI close"), true) 109 } 110 111 func TestSpiReConnect(t *testing.T) { 112 // arrange 113 a, _ := initTestSpiBusAdaptorWithMockedSpi() 114 gobottest.Assert(t, a.Finalize(), nil) 115 // act 116 gobottest.Assert(t, a.Connect(), nil) 117 // assert 118 gobottest.Refute(t, a.connections, nil) 119 gobottest.Assert(t, len(a.connections), 0) 120 }