From 5341563668df96f0d4e1d9d1fdd9761a55a57d76 Mon Sep 17 00:00:00 2001 From: Sasha Koshka Date: Wed, 19 Nov 2025 14:42:29 -0500 Subject: [PATCH] Test that METADAPT-A can tx/rx different messages consecutively --- metadapta_test.go | 148 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 148 insertions(+) diff --git a/metadapta_test.go b/metadapta_test.go index f4f48aa..7bffe08 100644 --- a/metadapta_test.go +++ b/metadapta_test.go @@ -1,11 +1,14 @@ package hopp import "io" +import "net" +import "sync" import "bytes" import "errors" import "slices" import "testing" import "context" +import tu "git.tebibyte.media/sashakoshka/hopp/internal/testutil" // some of these tests spawn goroutines that can signal a failure. // 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)) { network := "tcp" addr := "localhost:7959"