gobot.io/x/gobot@v1.16.0/sysfs/digital_pin_test.go (about)

     1  package sysfs
     2  
     3  import (
     4  	"errors"
     5  	"os"
     6  	"syscall"
     7  	"testing"
     8  
     9  	"gobot.io/x/gobot/gobottest"
    10  )
    11  
    12  func TestDigitalPin(t *testing.T) {
    13  	fs := NewMockFilesystem([]string{
    14  		"/sys/class/gpio/export",
    15  		"/sys/class/gpio/unexport",
    16  		"/sys/class/gpio/gpio10/value",
    17  		"/sys/class/gpio/gpio10/direction",
    18  	})
    19  
    20  	SetFilesystem(fs)
    21  
    22  	pin := NewDigitalPin(10, "custom")
    23  	gobottest.Assert(t, pin.pin, "10")
    24  	gobottest.Assert(t, pin.label, "custom")
    25  
    26  	pin = NewDigitalPin(10)
    27  	gobottest.Assert(t, pin.pin, "10")
    28  	gobottest.Assert(t, pin.label, "gpio10")
    29  	gobottest.Assert(t, pin.value, nil)
    30  
    31  	err := pin.Unexport()
    32  	gobottest.Assert(t, err, nil)
    33  	gobottest.Assert(t, fs.Files["/sys/class/gpio/unexport"].Contents, "10")
    34  
    35  	err = pin.Export()
    36  	gobottest.Assert(t, err, nil)
    37  	gobottest.Assert(t, fs.Files["/sys/class/gpio/export"].Contents, "10")
    38  	gobottest.Refute(t, pin.value, nil)
    39  
    40  	err = pin.Write(1)
    41  	gobottest.Assert(t, err, nil)
    42  	gobottest.Assert(t, fs.Files["/sys/class/gpio/gpio10/value"].Contents, "1")
    43  
    44  	err = pin.Direction(IN)
    45  	gobottest.Assert(t, err, nil)
    46  	gobottest.Assert(t, fs.Files["/sys/class/gpio/gpio10/direction"].Contents, "in")
    47  
    48  	data, _ := pin.Read()
    49  	gobottest.Assert(t, 1, data)
    50  
    51  	pin2 := NewDigitalPin(30, "custom")
    52  	err = pin2.Write(1)
    53  	gobottest.Refute(t, err, nil)
    54  
    55  	data, err = pin2.Read()
    56  	gobottest.Refute(t, err, nil)
    57  	gobottest.Assert(t, data, 0)
    58  
    59  	writeFile = func(File, []byte) (int, error) {
    60  		return 0, &os.PathError{Err: syscall.EINVAL}
    61  	}
    62  
    63  	err = pin.Unexport()
    64  	gobottest.Assert(t, err, nil)
    65  
    66  	writeFile = func(File, []byte) (int, error) {
    67  		return 0, &os.PathError{Err: errors.New("write error")}
    68  	}
    69  
    70  	err = pin.Unexport()
    71  	gobottest.Assert(t, err.(*os.PathError).Err, errors.New("write error"))
    72  
    73  	writeFile = func(File, []byte) (int, error) {
    74  		return 0, &os.PathError{Err: syscall.EBUSY}
    75  	}
    76  
    77  	err = pin.Export()
    78  	gobottest.Assert(t, err, nil)
    79  
    80  	writeFile = func(File, []byte) (int, error) {
    81  		return 0, &os.PathError{Err: errors.New("write error")}
    82  	}
    83  
    84  	err = pin.Export()
    85  	gobottest.Assert(t, err.(*os.PathError).Err, errors.New("write error"))
    86  }
    87  
    88  func TestDigitalPinExportError(t *testing.T) {
    89  	fs := NewMockFilesystem([]string{
    90  		"/sys/class/gpio/export",
    91  		"/sys/class/gpio/unexport",
    92  		"/sys/class/gpio/gpio10/value",
    93  		"/sys/class/gpio/gpio10/direction",
    94  	})
    95  
    96  	SetFilesystem(fs)
    97  
    98  	pin := NewDigitalPin(10, "custom")
    99  	writeFile = func(File, []byte) (int, error) {
   100  		return 0, &os.PathError{Err: syscall.EBUSY}
   101  	}
   102  
   103  	err := pin.Export()
   104  	gobottest.Refute(t, err, nil)
   105  }
   106  
   107  func TestDigitalPinUnexportError(t *testing.T) {
   108  	fs := NewMockFilesystem([]string{
   109  		"/sys/class/gpio/export",
   110  		"/sys/class/gpio/unexport",
   111  		"/sys/class/gpio/gpio10/value",
   112  		"/sys/class/gpio/gpio10/direction",
   113  	})
   114  
   115  	SetFilesystem(fs)
   116  
   117  	pin := NewDigitalPin(10, "custom")
   118  	writeFile = func(File, []byte) (int, error) {
   119  		return 0, &os.PathError{Err: syscall.EBUSY}
   120  	}
   121  
   122  	err := pin.Unexport()
   123  	gobottest.Refute(t, err, nil)
   124  }