gobot.io/x/gobot@v1.16.0/platforms/intel-iot/joule/joule_adaptor_test.go (about) 1 package joule 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/gobottest" 12 "gobot.io/x/gobot/sysfs" 13 ) 14 15 // make sure that this Adaptor fullfills all the required interfaces 16 var _ gobot.Adaptor = (*Adaptor)(nil) 17 var _ gpio.DigitalReader = (*Adaptor)(nil) 18 var _ gpio.DigitalWriter = (*Adaptor)(nil) 19 var _ gpio.PwmWriter = (*Adaptor)(nil) 20 var _ sysfs.DigitalPinnerProvider = (*Adaptor)(nil) 21 var _ sysfs.PWMPinnerProvider = (*Adaptor)(nil) 22 var _ i2c.Connector = (*Adaptor)(nil) 23 24 func initTestAdaptor() (*Adaptor, *sysfs.MockFilesystem) { 25 a := NewAdaptor() 26 fs := sysfs.NewMockFilesystem([]string{ 27 "/sys/class/pwm/pwmchip0/export", 28 "/sys/class/pwm/pwmchip0/unexport", 29 "/sys/class/pwm/pwmchip0/pwm0/duty_cycle", 30 "/sys/class/pwm/pwmchip0/pwm0/period", 31 "/sys/class/pwm/pwmchip0/pwm0/enable", 32 "/sys/class/gpio/export", 33 "/sys/class/gpio/unexport", 34 "/sys/class/gpio/gpio13/value", 35 "/sys/class/gpio/gpio13/direction", 36 "/sys/class/gpio/gpio40/value", 37 "/sys/class/gpio/gpio40/direction", 38 "/sys/class/gpio/gpio446/value", 39 "/sys/class/gpio/gpio446/direction", 40 "/sys/class/gpio/gpio463/value", 41 "/sys/class/gpio/gpio463/direction", 42 "/sys/class/gpio/gpio421/value", 43 "/sys/class/gpio/gpio421/direction", 44 "/sys/class/gpio/gpio221/value", 45 "/sys/class/gpio/gpio221/direction", 46 "/sys/class/gpio/gpio243/value", 47 "/sys/class/gpio/gpio243/direction", 48 "/sys/class/gpio/gpio229/value", 49 "/sys/class/gpio/gpio229/direction", 50 "/sys/class/gpio/gpio253/value", 51 "/sys/class/gpio/gpio253/direction", 52 "/sys/class/gpio/gpio261/value", 53 "/sys/class/gpio/gpio261/direction", 54 "/sys/class/gpio/gpio214/value", 55 "/sys/class/gpio/gpio214/direction", 56 "/sys/class/gpio/gpio14/direction", 57 "/sys/class/gpio/gpio14/value", 58 "/sys/class/gpio/gpio165/direction", 59 "/sys/class/gpio/gpio165/value", 60 "/sys/class/gpio/gpio212/direction", 61 "/sys/class/gpio/gpio212/value", 62 "/sys/class/gpio/gpio213/direction", 63 "/sys/class/gpio/gpio213/value", 64 "/sys/class/gpio/gpio236/direction", 65 "/sys/class/gpio/gpio236/value", 66 "/sys/class/gpio/gpio237/direction", 67 "/sys/class/gpio/gpio237/value", 68 "/sys/class/gpio/gpio204/direction", 69 "/sys/class/gpio/gpio204/value", 70 "/sys/class/gpio/gpio205/direction", 71 "/sys/class/gpio/gpio205/value", 72 "/sys/class/gpio/gpio263/direction", 73 "/sys/class/gpio/gpio263/value", 74 "/sys/class/gpio/gpio262/direction", 75 "/sys/class/gpio/gpio262/value", 76 "/sys/class/gpio/gpio240/direction", 77 "/sys/class/gpio/gpio240/value", 78 "/sys/class/gpio/gpio241/direction", 79 "/sys/class/gpio/gpio241/value", 80 "/sys/class/gpio/gpio242/direction", 81 "/sys/class/gpio/gpio242/value", 82 "/sys/class/gpio/gpio218/direction", 83 "/sys/class/gpio/gpio218/value", 84 "/sys/class/gpio/gpio250/direction", 85 "/sys/class/gpio/gpio250/value", 86 "/sys/class/gpio/gpio451/direction", 87 "/sys/class/gpio/gpio451/value", 88 "/dev/i2c-0", 89 }) 90 sysfs.SetFilesystem(fs) 91 fs.Files["/sys/class/pwm/pwmchip0/pwm0/period"].Contents = "5000" 92 a.Connect() 93 return a, fs 94 } 95 96 func TestJouleAdaptorName(t *testing.T) { 97 a, _ := initTestAdaptor() 98 gobottest.Assert(t, strings.HasPrefix(a.Name(), "Joule"), true) 99 a.SetName("NewName") 100 gobottest.Assert(t, a.Name(), "NewName") 101 } 102 103 func TestAdaptorConnect(t *testing.T) { 104 a, _ := initTestAdaptor() 105 gobottest.Assert(t, a.Connect(), nil) 106 gobottest.Assert(t, a.GetDefaultBus(), 0) 107 } 108 109 func TestAdaptorInvalidBus(t *testing.T) { 110 a, _ := initTestAdaptor() 111 gobottest.Assert(t, a.Connect(), nil) 112 113 _, err := a.GetConnection(0xff, 10) 114 gobottest.Assert(t, err, errors.New("Bus number 10 out of range")) 115 } 116 117 func TestAdaptorFinalize(t *testing.T) { 118 a, _ := initTestAdaptor() 119 a.DigitalWrite("J12_1", 1) 120 a.PwmWrite("J12_26", 100) 121 122 sysfs.SetSyscall(&sysfs.MockSyscall{}) 123 gobottest.Assert(t, a.Finalize(), nil) 124 _, err := a.GetConnection(0xff, 0) 125 gobottest.Assert(t, err, nil) 126 gobottest.Assert(t, a.Finalize(), nil) 127 128 sysfs.SetFilesystem(sysfs.NewMockFilesystem([]string{})) 129 gobottest.Refute(t, a.Finalize(), nil) 130 } 131 132 func TestAdaptorDigitalIO(t *testing.T) { 133 a, fs := initTestAdaptor() 134 135 a.DigitalWrite("J12_1", 1) 136 gobottest.Assert(t, fs.Files["/sys/class/gpio/gpio451/value"].Contents, "1") 137 138 a.DigitalWrite("J12_1", 0) 139 i, err := a.DigitalRead("J12_1") 140 gobottest.Assert(t, err, nil) 141 gobottest.Assert(t, i, 0) 142 } 143 144 func TestAdaptorDigitalWriteError(t *testing.T) { 145 a, fs := initTestAdaptor() 146 fs.WithWriteError = true 147 148 err := a.DigitalWrite("13", 1) 149 gobottest.Assert(t, err, errors.New("write error")) 150 } 151 152 func TestAdaptorDigitalReadWriteError(t *testing.T) { 153 a, fs := initTestAdaptor() 154 fs.WithWriteError = true 155 156 _, err := a.DigitalRead("13") 157 gobottest.Assert(t, err, errors.New("write error")) 158 } 159 160 func TestAdaptorI2c(t *testing.T) { 161 a, _ := initTestAdaptor() 162 163 sysfs.SetSyscall(&sysfs.MockSyscall{}) 164 con, err := a.GetConnection(0xff, 0) 165 gobottest.Assert(t, err, nil) 166 167 con.Write([]byte{0x00, 0x01}) 168 data := []byte{42, 42} 169 con.Read(data) 170 gobottest.Assert(t, data, []byte{0x00, 0x01}) 171 172 gobottest.Assert(t, a.Finalize(), nil) 173 } 174 175 func TestAdaptorPwm(t *testing.T) { 176 a, fs := initTestAdaptor() 177 178 err := a.PwmWrite("J12_26", 100) 179 gobottest.Assert(t, err, nil) 180 gobottest.Assert(t, fs.Files["/sys/class/pwm/pwmchip0/pwm0/duty_cycle"].Contents, "3921568") 181 182 err = a.PwmWrite("4", 100) 183 gobottest.Assert(t, err, errors.New("Not a valid pin")) 184 185 err = a.PwmWrite("J12_1", 100) 186 gobottest.Assert(t, err, errors.New("Not a PWM pin")) 187 } 188 189 func TestAdaptorPwmPinExportError(t *testing.T) { 190 a, fs := initTestAdaptor() 191 192 delete(fs.Files, "/sys/class/pwm/pwmchip0/export") 193 194 err := a.PwmWrite("J12_26", 100) 195 gobottest.Assert(t, strings.Contains(err.Error(), "/sys/class/pwm/pwmchip0/export: No such file"), true) 196 } 197 198 func TestAdaptorPwmPinEnableError(t *testing.T) { 199 a, fs := initTestAdaptor() 200 201 delete(fs.Files, "/sys/class/pwm/pwmchip0/pwm0/enable") 202 203 err := a.PwmWrite("J12_26", 100) 204 gobottest.Assert(t, strings.Contains(err.Error(), "/sys/class/pwm/pwmchip0/pwm0/enable: No such file"), true) 205 }