hybridgroup.gobot/system/analogpin_sysfs_test.go

122 lines
2.6 KiB
Go
Raw Normal View History

package system
import (
"fmt"
"testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
func Test_newAnalogPinSysfs(t *testing.T) {
// arrange
m := &MockFilesystem{}
sfa := sysfsFileAccess{fs: m, readBufLen: 2}
const path = "/sys/whatever"
// act
pin := newAnalogPinSysfs(&sfa, path, true, false)
// assert
assert.Equal(t, path, pin.sysfsPath)
assert.Equal(t, &sfa, pin.sfa)
assert.True(t, pin.r)
assert.False(t, pin.w)
}
func TestRead(t *testing.T) {
const (
sysfsPath = "/sys/testread"
value = "32"
)
tests := map[string]struct {
readable bool
simErr bool
wantVal int
wantErr string
}{
"read_ok": {
readable: true,
wantVal: 32,
},
"error_not_readable": {
readable: false,
wantErr: "the pin '/sys/testread' is not allowed to read",
},
"error_on_read": {
readable: true,
simErr: true,
wantErr: "read error",
},
}
for name, tc := range tests {
t.Run(name, func(t *testing.T) {
// arrange
fs := newMockFilesystem([]string{sysfsPath})
sfa := sysfsFileAccess{fs: fs, readBufLen: 2}
pin := newAnalogPinSysfs(&sfa, sysfsPath, tc.readable, false)
fs.Files[sysfsPath].Contents = value
if tc.simErr {
fs.Files[sysfsPath].simulateReadError = fmt.Errorf("read error")
}
// act
got, err := pin.Read()
// assert
if tc.wantErr != "" {
require.EqualError(t, err, tc.wantErr)
} else {
require.NoError(t, err)
}
assert.Equal(t, tc.wantVal, got)
})
}
}
func TestWrite(t *testing.T) {
const (
sysfsPath = "/sys/testwrite"
oldVal = "old_value"
)
tests := map[string]struct {
writeable bool
simErr bool
wantVal string
wantErr string
}{
"write_ok": {
writeable: true,
wantVal: "23",
},
"error_not_writeable": {
writeable: false,
wantErr: "the pin '/sys/testwrite' is not allowed to write (val: 23)",
wantVal: oldVal,
},
"error_on_write": {
writeable: true,
simErr: true,
wantErr: "write error",
wantVal: "23", // the mock is implemented in this way
},
}
for name, tc := range tests {
t.Run(name, func(t *testing.T) {
// arrange
fs := newMockFilesystem([]string{sysfsPath})
sfa := sysfsFileAccess{fs: fs, readBufLen: 10}
pin := newAnalogPinSysfs(&sfa, sysfsPath, false, tc.writeable)
fs.Files[sysfsPath].Contents = oldVal
if tc.simErr {
fs.Files[sysfsPath].simulateWriteError = fmt.Errorf("write error")
}
// act
err := pin.Write(23)
// assert
if tc.wantErr != "" {
require.EqualError(t, err, tc.wantErr)
} else {
require.NoError(t, err)
}
assert.Equal(t, tc.wantVal, fs.Files[sysfsPath].Contents)
})
}
}