| 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) |