blob: c5097a83710a384498faf87deac3e8cbcf39159f [file] [log] [blame]
package sensors
import (
"go.skia.org/infra/go/serial"
"go.skia.org/infra/go/skerr"
)
// fakeSerialPort implements a serial.Port interface for test purposes. It
// returns the given read data when Read() is called, and keeps a copy
// of all writtten data when Write() is used.
//
// It tracks port state to detect (and fail) functions called after the
// port has been closed.
type fakeSerialPort struct {
readData []byte
nextReadPos int
writtenData []byte
closed bool
}
func (p *fakeSerialPort) Close() error {
if p.closed {
return skerr.Fmt("port already closed")
}
p.closed = true
return nil
}
func (p *fakeSerialPort) Flush() error {
if p.closed {
return skerr.Fmt("port is closed")
}
return nil
}
func (p *fakeSerialPort) Read(b []byte) (int, error) {
if p.closed {
return 0, skerr.Fmt("port is closed")
}
bytesRemaining := len(p.readData) - p.nextReadPos
if bytesRemaining == 0 {
return 0, skerr.Fmt("no more data")
}
toRead := len(b)
if toRead > bytesRemaining {
toRead = bytesRemaining
}
for i := 0; i < toRead; i++ {
b[i] = p.readData[p.nextReadPos]
p.nextReadPos++
}
return toRead, nil
}
func (p *fakeSerialPort) Write(b []byte) (n int, err error) {
if p.closed {
return 0, skerr.Fmt("port is closed")
}
p.writtenData = append(p.writtenData, b...)
return len(b), nil
}
func (p *fakeSerialPort) setReadData(bytes ...byte) *fakeSerialPort {
p.nextReadPos = 0
p.readData = bytes
return p
}
func (p *fakeSerialPort) getWrittenData() []byte {
return p.writtenData
}
// Make sure fakeSerialPort fulfills the serial.Port interface.
var _ serial.Port = (*fakeSerialPort)(nil)