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 }