58 lines
1.7 KiB
Go
58 lines
1.7 KiB
Go
package ultrabeam
|
|
|
|
import (
|
|
"errors"
|
|
"io"
|
|
"net"
|
|
"testing"
|
|
"time"
|
|
)
|
|
|
|
// The two transports report a slow reply differently, and neither means the
|
|
// link is gone: a remote TCP hop and a controller busy moving its motors both
|
|
// look like silence. Getting this wrong tears the connection down on every poll.
|
|
func TestTransientRead(t *testing.T) {
|
|
if !transientRead(timeoutErr{}) {
|
|
t.Errorf("a TCP read timeout must be transient")
|
|
}
|
|
// A serial port that stays silent returns (0, nil) forever; bufio gives up
|
|
// after a hundred empty reads with ErrNoProgress.
|
|
if !transientRead(io.ErrNoProgress) {
|
|
t.Errorf("a silent serial port must be transient")
|
|
}
|
|
if transientRead(io.EOF) {
|
|
t.Errorf("EOF is the link closing, not a slow reply")
|
|
}
|
|
if transientRead(errors.New("access denied")) {
|
|
t.Errorf("an open failure is not a slow reply")
|
|
}
|
|
}
|
|
|
|
// open must refuse a configuration it cannot honour rather than dial nothing.
|
|
func TestOpenRejectsEmptyConfig(t *testing.T) {
|
|
if _, err := New(Transport{Mode: "serial"}).open(); err == nil {
|
|
t.Errorf("serial with no COM port must fail")
|
|
}
|
|
if _, err := New(Transport{Mode: "tcp"}).open(); err == nil {
|
|
t.Errorf("tcp with no host must fail")
|
|
}
|
|
}
|
|
|
|
// A missing baud is the controller's default, not zero — serial.Open would
|
|
// reject 0 and the operator would see "invalid speed" for a field they never
|
|
// knew existed.
|
|
func TestDefaultBaud(t *testing.T) {
|
|
if got := New(Transport{Mode: "serial", COM: "COM3"}).tr.Baud; got != 9600 {
|
|
t.Errorf("default baud = %d, want 9600", got)
|
|
}
|
|
}
|
|
|
|
type timeoutErr struct{}
|
|
|
|
func (timeoutErr) Error() string { return "i/o timeout" }
|
|
func (timeoutErr) Timeout() bool { return true }
|
|
func (timeoutErr) Temporary() bool { return true }
|
|
|
|
var _ net.Error = timeoutErr{}
|
|
var _ = time.Second
|