164 lines
3.7 KiB
Go
164 lines
3.7 KiB
Go
package transport_test
|
|
|
|
import (
|
|
"bufio"
|
|
"bytes"
|
|
"io"
|
|
"strings"
|
|
"testing"
|
|
|
|
"git.lang-dieter.de/rs2322tcp/internal/transport"
|
|
)
|
|
|
|
func TestWriteAndReadMessage(t *testing.T) {
|
|
original := transport.NewHello()
|
|
|
|
var buffer bytes.Buffer
|
|
|
|
if err := transport.WriteMessage(&buffer, original); err != nil {
|
|
t.Fatalf("WriteMessage() failed: %v", err)
|
|
}
|
|
|
|
reader := bufio.NewReader(&buffer)
|
|
|
|
var decoded transport.HelloMessage
|
|
|
|
if err := transport.ReadMessage(reader, &decoded); err != nil {
|
|
t.Fatalf("ReadMessage() failed: %v", err)
|
|
}
|
|
|
|
if decoded.Version != original.Version {
|
|
t.Errorf("Version = %d, want %d",
|
|
decoded.Version, original.Version)
|
|
}
|
|
|
|
if decoded.Type != original.Type {
|
|
t.Errorf("Type = %q, want %q",
|
|
decoded.Type, original.Type)
|
|
}
|
|
}
|
|
|
|
func TestMultipleMessages(t *testing.T) {
|
|
var buffer bytes.Buffer
|
|
|
|
if err := transport.WriteMessage(&buffer, transport.NewHello()); err != nil {
|
|
t.Fatalf("WriteMessage(hello) failed: %v", err)
|
|
}
|
|
|
|
if err := transport.WriteMessage(&buffer, transport.NewGetDevices()); err != nil {
|
|
t.Fatalf("WriteMessage(get_devices) failed: %v", err)
|
|
}
|
|
|
|
reader := bufio.NewReader(&buffer)
|
|
|
|
var hello transport.HelloMessage
|
|
|
|
if err := transport.ReadMessage(reader, &hello); err != nil {
|
|
t.Fatalf("ReadMessage(hello) failed: %v", err)
|
|
}
|
|
|
|
if hello.Type != transport.MessageHello {
|
|
t.Errorf("first Type = %q, want %q",
|
|
hello.Type, transport.MessageHello)
|
|
}
|
|
|
|
var getDevices transport.GetDevicesMessage
|
|
|
|
if err := transport.ReadMessage(reader, &getDevices); err != nil {
|
|
t.Fatalf("ReadMessage(get_devices) failed: %v", err)
|
|
}
|
|
|
|
if getDevices.Type != transport.MessageGetDevices {
|
|
t.Errorf("second Type = %q, want %q",
|
|
getDevices.Type, transport.MessageGetDevices)
|
|
}
|
|
}
|
|
|
|
func TestMessageFraming(t *testing.T) {
|
|
var buffer bytes.Buffer
|
|
|
|
if err := transport.WriteMessage(&buffer, transport.NewHello()); err != nil {
|
|
t.Fatalf("WriteMessage() failed: %v", err)
|
|
}
|
|
|
|
text := buffer.String()
|
|
|
|
if !strings.HasSuffix(text, "\n") {
|
|
t.Fatalf("message does not end with newline: %q", text)
|
|
}
|
|
|
|
if strings.Count(text, "\n") != 1 {
|
|
t.Fatalf("newline count = %d, want 1",
|
|
strings.Count(text, "\n"))
|
|
}
|
|
}
|
|
|
|
func TestReadMessageEOF(t *testing.T) {
|
|
reader := bufio.NewReader(strings.NewReader(""))
|
|
|
|
var message transport.HelloMessage
|
|
|
|
err := transport.ReadMessage(reader, &message)
|
|
|
|
if err != io.EOF {
|
|
t.Fatalf("ReadMessage() error = %v, want io.EOF", err)
|
|
}
|
|
}
|
|
|
|
func TestReadMessageInvalidJSON(t *testing.T) {
|
|
reader := bufio.NewReader(
|
|
strings.NewReader(`{"version":1,"type":invalid}` + "\n"),
|
|
)
|
|
|
|
var message transport.HelloMessage
|
|
|
|
if err := transport.ReadMessage(reader, &message); err == nil {
|
|
t.Fatal("ReadMessage() succeeded, want JSON error")
|
|
}
|
|
}
|
|
|
|
func TestReadMessageIncomplete(t *testing.T) {
|
|
reader := bufio.NewReader(
|
|
strings.NewReader(`{"version":1,"type":"hello"}`),
|
|
)
|
|
|
|
var message transport.HelloMessage
|
|
|
|
err := transport.ReadMessage(reader, &message)
|
|
|
|
if err == nil {
|
|
t.Fatal("ReadMessage() succeeded, want incomplete message error")
|
|
}
|
|
}
|
|
|
|
func TestNilWriter(t *testing.T) {
|
|
if err := transport.WriteMessage(nil, transport.NewHello()); err == nil {
|
|
t.Fatal("WriteMessage() succeeded, want error")
|
|
}
|
|
}
|
|
|
|
func TestNilMessage(t *testing.T) {
|
|
var buffer bytes.Buffer
|
|
|
|
if err := transport.WriteMessage(&buffer, nil); err == nil {
|
|
t.Fatal("WriteMessage() succeeded, want error")
|
|
}
|
|
}
|
|
|
|
func TestNilReader(t *testing.T) {
|
|
var message transport.HelloMessage
|
|
|
|
if err := transport.ReadMessage(nil, &message); err == nil {
|
|
t.Fatal("ReadMessage() succeeded, want error")
|
|
}
|
|
}
|
|
|
|
func TestNilTarget(t *testing.T) {
|
|
reader := bufio.NewReader(strings.NewReader(
|
|
`{"version":1,"type":"hello"}` + "\n",
|
|
))
|
|
|
|
if err := transport.ReadMessage(reader, nil); err == nil {
|
|
t.Fatal("ReadMessage() succeeded, want error")
|
|
}
|
|
}
|