Test that METADAPT-A can tx/rx different messages consecutively

This commit is contained in:
Sasha Koshka 2025-11-19 14:42:29 -05:00
parent d2187cb953
commit 5341563668

View File

@ -1,11 +1,14 @@
package hopp package hopp
import "io" import "io"
import "net"
import "sync"
import "bytes" import "bytes"
import "errors" import "errors"
import "slices" import "slices"
import "testing" import "testing"
import "context" import "context"
import tu "git.tebibyte.media/sashakoshka/hopp/internal/testutil"
// some of these tests spawn goroutines that can signal a failure. // some of these tests spawn goroutines that can signal a failure.
// abide by the documentation for testing.T (https://pkg.go.dev/testing#T): // abide by the documentation for testing.T (https://pkg.go.dev/testing#T):
@ -271,6 +274,151 @@ func TestEncodeDecodeMessageA(test *testing.T) {
} }
} }
func TestConsecutiveWrite(test *testing.T) {
packets := [][]byte {
[]byte {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05,
0x43, 0x00, 0x00, 0x00, 0x07 },
[]byte {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05,
0x43, 0x00, 0x00, 0x00, 0x08 },
}
payloads := [][]byte {
[]byte { 0x43, 0x00, 0x00, 0x00, 0x07 },
[]byte { 0x43, 0x00, 0x00, 0x00, 0x08 },
}
var group sync.WaitGroup
group.Add(2)
// server
listener, err := net.Listen("tcp", "localhost:9999")
if err != nil { test.Fatal("SERVER", err) }
go func() {
defer group.Done()
defer listener.Close()
conn, err := listener.Accept()
if err != nil { test.Fatal("SERVER", err) }
defer conn.Close()
buf := [16]byte { }
for {
_, err := conn.Read(buf[:])
if err != nil { break }
}
}()
// client
go func() {
defer group.Done()
conn, err := net.Dial("tcp", "localhost:9999")
if err != nil { test.Fatal("CLIENT", err) }
defer conn.Close()
recorder := tu.RecordConn(conn)
a := AdaptA(recorder, ClientSide)
trans, err := a.OpenTrans()
if err != nil { test.Fatal("CLIENT", err) }
for _, payload := range payloads {
err := trans.Send(0x0000, payload)
if err != nil { test.Fatal("CLIENT", err) }
}
test.Log("CLIENT recorded output:\n" + recorder.Dump())
if len(recorder.Log) != 2 { test.Fatal("wrong length") }
if !slices.Equal(recorder.Log[0].([]byte), packets[0]) {
test.Fatal("not equal")
}
if !slices.Equal(recorder.Log[1].([]byte), packets[1]) {
test.Fatal("not equal")
}
}()
group.Wait()
}
func TestConsecutiveRead(test *testing.T) {
stream := []byte {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05,
0x43, 0x00, 0x00, 0x00, 0x07,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05,
0x43, 0x00, 0x00, 0x00, 0x08,
}
payloads := [][]byte {
[]byte { 0x43, 0x00, 0x00, 0x00, 0x07 },
[]byte { 0x43, 0x00, 0x00, 0x00, 0x08 },
}
var group sync.WaitGroup
group.Add(2)
// server
listener, err := net.Listen("tcp", "localhost:9999")
if err != nil { test.Fatal("SERVER", err) }
go func() {
defer group.Done()
defer listener.Close()
conn, err := listener.Accept()
if err != nil { test.Fatal("SERVER", err) }
defer conn.Close()
a := AdaptA(conn, ServerSide)
trans, err := a.AcceptTrans()
if err != nil { test.Fatal("SERVER", err) }
index := 0
for {
method, data, err := trans.Receive()
if err != nil {
if !errors.Is(err, io.EOF) {
test.Fatal("SERVER", err)
}
break
}
test.Logf("SERVER GOT: M%04X %s", method, tu.HexBytes(data))
if index >= len(payloads) {
test.Fatalf(
"SERVER we weren't supposed to receive %d messages",
index + 1)
}
if method != 0 {
test.Fatal("SERVER", "method not equal")
}
if !slices.Equal(data, payloads[index]) {
test.Fatal("SERVER", "data not equal")
}
index ++
}
if index != len(payloads) {
test.Fatalf(
"SERVER we weren't supposed to receive %d messages",
index + 1)
}
}()
// client
go func() {
defer group.Done()
conn, err := net.Dial("tcp", "localhost:9999")
if err != nil { test.Fatal("CLIENT", err) }
defer conn.Close()
_, err = conn.Write(stream)
if err != nil { test.Fatal("CLIENT", err) }
}()
group.Wait()
}
func clientServerEnvironment(test *testing.T, clientFunc func(conn Conn), serverFunc func(conn Conn)) { func clientServerEnvironment(test *testing.T, clientFunc func(conn Conn), serverFunc func(conn Conn)) {
network := "tcp" network := "tcp"
addr := "localhost:7959" addr := "localhost:7959"