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  }