gobot.io/x/gobot@v1.16.0/sysfs/pwm_pin_test.go (about) 1 package sysfs 2 3 import ( 4 "os" 5 "syscall" 6 "testing" 7 8 "gobot.io/x/gobot/gobottest" 9 ) 10 11 var _ PWMPinner = (*PWMPin)(nil) 12 13 func TestPwmPin(t *testing.T) { 14 fs := NewMockFilesystem([]string{ 15 "/sys/class/pwm/pwmchip0/export", 16 "/sys/class/pwm/pwmchip0/unexport", 17 "/sys/class/pwm/pwmchip0/pwm10/enable", 18 "/sys/class/pwm/pwmchip0/pwm10/period", 19 "/sys/class/pwm/pwmchip0/pwm10/duty_cycle", 20 "/sys/class/pwm/pwmchip0/pwm10/polarity", 21 }) 22 23 SetFilesystem(fs) 24 25 pin := NewPWMPin(10) 26 gobottest.Assert(t, pin.pin, "10") 27 28 err := pin.Unexport() 29 gobottest.Assert(t, err, nil) 30 gobottest.Assert(t, fs.Files["/sys/class/pwm/pwmchip0/unexport"].Contents, "10") 31 32 err = pin.Export() 33 gobottest.Assert(t, err, nil) 34 gobottest.Assert(t, fs.Files["/sys/class/pwm/pwmchip0/export"].Contents, "10") 35 36 gobottest.Assert(t, pin.InvertPolarity(true), nil) 37 gobottest.Assert(t, fs.Files["/sys/class/pwm/pwmchip0/pwm10/polarity"].Contents, "inverted") 38 pol, _ := pin.Polarity() 39 gobottest.Assert(t, pol, "inverted") 40 gobottest.Assert(t, pin.InvertPolarity(false), nil) 41 gobottest.Assert(t, fs.Files["/sys/class/pwm/pwmchip0/pwm10/polarity"].Contents, "normal") 42 pol, _ = pin.Polarity() 43 gobottest.Assert(t, pol, "normal") 44 45 gobottest.Refute(t, fs.Files["/sys/class/pwm/pwmchip0/pwm10/enable"].Contents, "1") 46 err = pin.Enable(true) 47 gobottest.Assert(t, err, nil) 48 gobottest.Assert(t, fs.Files["/sys/class/pwm/pwmchip0/pwm10/enable"].Contents, "1") 49 gobottest.Refute(t, pin.InvertPolarity(false), nil) 50 51 fs.Files["/sys/class/pwm/pwmchip0/pwm10/period"].Contents = "6" 52 data, _ := pin.Period() 53 gobottest.Assert(t, data, uint32(6)) 54 gobottest.Assert(t, pin.SetPeriod(100000), nil) 55 data, _ = pin.Period() 56 gobottest.Assert(t, data, uint32(100000)) 57 58 gobottest.Refute(t, fs.Files["/sys/class/pwm/pwmchip0/pwm10/duty_cycle"].Contents, "1") 59 err = pin.SetDutyCycle(100) 60 gobottest.Assert(t, err, nil) 61 gobottest.Assert(t, fs.Files["/sys/class/pwm/pwmchip0/pwm10/duty_cycle"].Contents, "100") 62 data, _ = pin.DutyCycle() 63 gobottest.Assert(t, data, uint32(100)) 64 } 65 66 func TestPwmPinAlreadyExported(t *testing.T) { 67 fs := NewMockFilesystem([]string{ 68 "/sys/class/pwm/pwmchip0/export", 69 "/sys/class/pwm/pwmchip0/unexport", 70 "/sys/class/pwm/pwmchip0/pwm10/enable", 71 "/sys/class/pwm/pwmchip0/pwm10/period", 72 "/sys/class/pwm/pwmchip0/pwm10/duty_cycle", 73 }) 74 75 SetFilesystem(fs) 76 77 pin := NewPWMPin(10) 78 pin.write = func(string, []byte) (int, error) { 79 return 0, &os.PathError{Err: syscall.EBUSY} 80 } 81 82 // no error indicates that the pin was already exported 83 gobottest.Assert(t, pin.Export(), nil) 84 } 85 86 func TestPwmPinExportError(t *testing.T) { 87 fs := NewMockFilesystem([]string{ 88 "/sys/class/pwm/pwmchip0/export", 89 "/sys/class/pwm/pwmchip0/unexport", 90 "/sys/class/pwm/pwmchip0/pwm10/enable", 91 "/sys/class/pwm/pwmchip0/pwm10/period", 92 "/sys/class/pwm/pwmchip0/pwm10/duty_cycle", 93 }) 94 95 SetFilesystem(fs) 96 97 pin := NewPWMPin(10) 98 pin.write = func(string, []byte) (int, error) { 99 return 0, &os.PathError{Err: syscall.EFAULT} 100 } 101 102 // no error indicates that the pin was already exported 103 gobottest.Refute(t, pin.Export(), nil) 104 } 105 106 func TestPwmPinUnxportError(t *testing.T) { 107 fs := NewMockFilesystem([]string{ 108 "/sys/class/pwm/pwmchip0/export", 109 "/sys/class/pwm/pwmchip0/unexport", 110 "/sys/class/pwm/pwmchip0/pwm10/enable", 111 "/sys/class/pwm/pwmchip0/pwm10/period", 112 "/sys/class/pwm/pwmchip0/pwm10/duty_cycle", 113 }) 114 115 SetFilesystem(fs) 116 117 pin := NewPWMPin(10) 118 pin.write = func(string, []byte) (int, error) { 119 return 0, &os.PathError{Err: syscall.EBUSY} 120 } 121 122 gobottest.Refute(t, pin.Unexport(), nil) 123 } 124 125 func TestPwmPinPeriodError(t *testing.T) { 126 fs := NewMockFilesystem([]string{ 127 "/sys/class/pwm/pwmchip0/export", 128 "/sys/class/pwm/pwmchip0/unexport", 129 "/sys/class/pwm/pwmchip0/pwm10/enable", 130 "/sys/class/pwm/pwmchip0/pwm10/period", 131 "/sys/class/pwm/pwmchip0/pwm10/duty_cycle", 132 }) 133 134 SetFilesystem(fs) 135 136 pin := NewPWMPin(10) 137 pin.read = func(string) ([]byte, error) { 138 return nil, &os.PathError{Err: syscall.EBUSY} 139 } 140 141 _, err := pin.Period() 142 gobottest.Refute(t, err, nil) 143 } 144 145 func TestPwmPinPolarityError(t *testing.T) { 146 fs := NewMockFilesystem([]string{ 147 "/sys/class/pwm/pwmchip0/export", 148 "/sys/class/pwm/pwmchip0/unexport", 149 "/sys/class/pwm/pwmchip0/pwm10/enable", 150 "/sys/class/pwm/pwmchip0/pwm10/period", 151 "/sys/class/pwm/pwmchip0/pwm10/duty_cycle", 152 }) 153 154 SetFilesystem(fs) 155 156 pin := NewPWMPin(10) 157 pin.read = func(string) ([]byte, error) { 158 return nil, &os.PathError{Err: syscall.EBUSY} 159 } 160 161 _, err := pin.Polarity() 162 gobottest.Refute(t, err, nil) 163 } 164 165 func TestPwmPinDutyCycleError(t *testing.T) { 166 fs := NewMockFilesystem([]string{ 167 "/sys/class/pwm/pwmchip0/export", 168 "/sys/class/pwm/pwmchip0/unexport", 169 "/sys/class/pwm/pwmchip0/pwm10/enable", 170 "/sys/class/pwm/pwmchip0/pwm10/period", 171 "/sys/class/pwm/pwmchip0/pwm10/duty_cycle", 172 }) 173 174 SetFilesystem(fs) 175 176 pin := NewPWMPin(10) 177 pin.read = func(string) ([]byte, error) { 178 return nil, &os.PathError{Err: syscall.EBUSY} 179 } 180 181 _, err := pin.DutyCycle() 182 gobottest.Refute(t, err, nil) 183 }