gobot.io/x/gobot@v1.16.0/platforms/upboard/up2/adaptor_test.go (about)

     1  package up2
     2  
     3  import (
     4  	"errors"
     5  	"strings"
     6  	"testing"
     7  
     8  	"gobot.io/x/gobot"
     9  	"gobot.io/x/gobot/drivers/gpio"
    10  	"gobot.io/x/gobot/drivers/i2c"
    11  	"gobot.io/x/gobot/drivers/spi"
    12  	"gobot.io/x/gobot/gobottest"
    13  	"gobot.io/x/gobot/sysfs"
    14  )
    15  
    16  // make sure that this Adaptor fullfills all the required interfaces
    17  var _ gobot.Adaptor = (*Adaptor)(nil)
    18  var _ gpio.DigitalReader = (*Adaptor)(nil)
    19  var _ gpio.DigitalWriter = (*Adaptor)(nil)
    20  var _ gpio.PwmWriter = (*Adaptor)(nil)
    21  var _ gpio.ServoWriter = (*Adaptor)(nil)
    22  var _ sysfs.DigitalPinnerProvider = (*Adaptor)(nil)
    23  var _ sysfs.PWMPinnerProvider = (*Adaptor)(nil)
    24  var _ i2c.Connector = (*Adaptor)(nil)
    25  var _ spi.Connector = (*Adaptor)(nil)
    26  
    27  func initTestUP2Adaptor() (*Adaptor, *sysfs.MockFilesystem) {
    28  	a := NewAdaptor()
    29  	fs := sysfs.NewMockFilesystem([]string{
    30  		"/sys/class/gpio/export",
    31  		"/sys/class/gpio/unexport",
    32  		"/sys/class/gpio/gpio462/value",
    33  		"/sys/class/gpio/gpio462/direction",
    34  		"/sys/class/gpio/gpio432/value",
    35  		"/sys/class/gpio/gpio432/direction",
    36  		"/sys/class/pwm/pwmchip0/export",
    37  		"/sys/class/pwm/pwmchip0/unexport",
    38  		"/sys/class/pwm/pwmchip0/pwm0/enable",
    39  		"/sys/class/pwm/pwmchip0/pwm0/period",
    40  		"/sys/class/pwm/pwmchip0/pwm0/duty_cycle",
    41  		"/sys/class/pwm/pwmchip0/pwm0/polarity",
    42  		"/sys/class/leds/upboard:green:/brightness",
    43  	})
    44  
    45  	sysfs.SetFilesystem(fs)
    46  	return a, fs
    47  }
    48  
    49  func TestUP2AdaptorName(t *testing.T) {
    50  	a := NewAdaptor()
    51  	gobottest.Assert(t, strings.HasPrefix(a.Name(), "UP2"), true)
    52  	a.SetName("NewName")
    53  	gobottest.Assert(t, a.Name(), "NewName")
    54  }
    55  
    56  func TestUP2AdaptorDigitalIO(t *testing.T) {
    57  	a, fs := initTestUP2Adaptor()
    58  	a.Connect()
    59  
    60  	a.DigitalWrite("7", 1)
    61  	gobottest.Assert(t, fs.Files["/sys/class/gpio/gpio462/value"].Contents, "1")
    62  
    63  	fs.Files["/sys/class/gpio/gpio432/value"].Contents = "1"
    64  	i, _ := a.DigitalRead("13")
    65  	gobottest.Assert(t, i, 1)
    66  
    67  	a.DigitalWrite("green", 1)
    68  	gobottest.Assert(t,
    69  		fs.Files["/sys/class/leds/upboard:green:/brightness"].Contents,
    70  		"1",
    71  	)
    72  
    73  	gobottest.Assert(t, a.DigitalWrite("99", 1), errors.New("Not a valid pin"))
    74  	gobottest.Assert(t, a.Finalize(), nil)
    75  }
    76  
    77  func TestAdaptorDigitalWriteError(t *testing.T) {
    78  	a, fs := initTestUP2Adaptor()
    79  	fs.WithWriteError = true
    80  
    81  	err := a.DigitalWrite("7", 1)
    82  	gobottest.Assert(t, err, errors.New("write error"))
    83  }
    84  
    85  func TestAdaptorDigitalReadWriteError(t *testing.T) {
    86  	a, fs := initTestUP2Adaptor()
    87  	fs.WithWriteError = true
    88  
    89  	_, err := a.DigitalRead("7")
    90  	gobottest.Assert(t, err, errors.New("write error"))
    91  }
    92  
    93  func TestUP2AdaptorI2c(t *testing.T) {
    94  	a := NewAdaptor()
    95  	fs := sysfs.NewMockFilesystem([]string{
    96  		"/dev/i2c-5",
    97  	})
    98  	sysfs.SetFilesystem(fs)
    99  	sysfs.SetSyscall(&sysfs.MockSyscall{})
   100  
   101  	con, err := a.GetConnection(0xff, 5)
   102  	gobottest.Assert(t, err, nil)
   103  
   104  	con.Write([]byte{0x00, 0x01})
   105  	data := []byte{42, 42}
   106  	con.Read(data)
   107  	gobottest.Assert(t, data, []byte{0x00, 0x01})
   108  
   109  	gobottest.Assert(t, a.Finalize(), nil)
   110  }
   111  
   112  func TestAdaptorSPI(t *testing.T) {
   113  	a := NewAdaptor()
   114  	a.Connect()
   115  
   116  	gobottest.Assert(t, a.GetSpiDefaultBus(), 0)
   117  	gobottest.Assert(t, a.GetSpiDefaultMode(), 0)
   118  	gobottest.Assert(t, a.GetSpiDefaultMaxSpeed(), int64(500000))
   119  
   120  	_, err := a.GetSpiConnection(10, 0, 0, 8, 500000)
   121  	gobottest.Assert(t, err.Error(), "Bus number 10 out of range")
   122  
   123  	// TODO: test tx/rx here...
   124  
   125  }
   126  
   127  func TestUP2AdaptorInvalidPWMPin(t *testing.T) {
   128  	a, _ := initTestUP2Adaptor()
   129  	a.Connect()
   130  
   131  	err := a.PwmWrite("666", 42)
   132  	gobottest.Refute(t, err, nil)
   133  
   134  	err = a.ServoWrite("666", 120)
   135  	gobottest.Refute(t, err, nil)
   136  
   137  	err = a.PwmWrite("3", 42)
   138  	gobottest.Refute(t, err, nil)
   139  
   140  	err = a.ServoWrite("3", 120)
   141  	gobottest.Refute(t, err, nil)
   142  }
   143  
   144  func TestUP2AdaptorPWM(t *testing.T) {
   145  	a, fs := initTestUP2Adaptor()
   146  
   147  	err := a.PwmWrite("32", 100)
   148  	gobottest.Assert(t, err, nil)
   149  
   150  	gobottest.Assert(t, fs.Files["/sys/class/pwm/pwmchip0/export"].Contents, "0")
   151  	gobottest.Assert(t, fs.Files["/sys/class/pwm/pwmchip0/pwm0/enable"].Contents, "1")
   152  	gobottest.Assert(t, fs.Files["/sys/class/pwm/pwmchip0/pwm0/duty_cycle"].Contents, "3921568")
   153  	gobottest.Assert(t, fs.Files["/sys/class/pwm/pwmchip0/pwm0/polarity"].Contents, "normal")
   154  
   155  	err = a.ServoWrite("32", 0)
   156  	gobottest.Assert(t, err, nil)
   157  
   158  	gobottest.Assert(t, fs.Files["/sys/class/pwm/pwmchip0/pwm0/duty_cycle"].Contents, "500000")
   159  
   160  	err = a.ServoWrite("32", 180)
   161  	gobottest.Assert(t, err, nil)
   162  
   163  	gobottest.Assert(t, fs.Files["/sys/class/pwm/pwmchip0/pwm0/duty_cycle"].Contents, "2000000")
   164  	gobottest.Assert(t, a.Finalize(), nil)
   165  }
   166  
   167  func TestUP2AdaptorPwmWriteError(t *testing.T) {
   168  	a, fs := initTestUP2Adaptor()
   169  	fs.WithWriteError = true
   170  
   171  	err := a.PwmWrite("32", 100)
   172  	gobottest.Assert(t, err, errors.New("write error"))
   173  }
   174  
   175  func TestUP2AdaptorPwmReadError(t *testing.T) {
   176  	a, fs := initTestUP2Adaptor()
   177  	fs.WithReadError = true
   178  
   179  	err := a.PwmWrite("32", 100)
   180  	gobottest.Assert(t, err, errors.New("read error"))
   181  }
   182  
   183  func TestUP2I2CDefaultBus(t *testing.T) {
   184  	a, _ := initTestUP2Adaptor()
   185  	gobottest.Assert(t, a.GetDefaultBus(), 5)
   186  }
   187  
   188  func TestUP2GetConnectionInvalidBus(t *testing.T) {
   189  	a, _ := initTestUP2Adaptor()
   190  	_, err := a.GetConnection(0x01, 99)
   191  	gobottest.Assert(t, err, errors.New("Bus number 99 out of range"))
   192  }
   193  
   194  func TestUP2FinalizeErrorAfterGPIO(t *testing.T) {
   195  	a, fs := initTestUP2Adaptor()
   196  
   197  	gobottest.Assert(t, a.Connect(), nil)
   198  	gobottest.Assert(t, a.DigitalWrite("7", 1), nil)
   199  
   200  	fs.WithWriteError = true
   201  
   202  	err := a.Finalize()
   203  	gobottest.Assert(t, strings.Contains(err.Error(), "write error"), true)
   204  }
   205  
   206  func TestUP2FinalizeErrorAfterPWM(t *testing.T) {
   207  	a, fs := initTestUP2Adaptor()
   208  
   209  	gobottest.Assert(t, a.Connect(), nil)
   210  	gobottest.Assert(t, a.PwmWrite("32", 1), nil)
   211  
   212  	fs.WithWriteError = true
   213  
   214  	err := a.Finalize()
   215  	gobottest.Assert(t, strings.Contains(err.Error(), "write error"), true)
   216  }