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  }