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  }