From ad930144cf3bb97d95271c872429f3b5624783eb Mon Sep 17 00:00:00 2001 From: Sasha Koshka Date: Mon, 17 Nov 2025 16:50:43 -0500 Subject: [PATCH] generate: Test send, receive functions --- generate/generate_test.go | 110 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 110 insertions(+) diff --git a/generate/generate_test.go b/generate/generate_test.go index 147ebdc..40e46dc 100644 --- a/generate/generate_test.go +++ b/generate/generate_test.go @@ -7,8 +7,10 @@ import "testing" // generator is equal to something specific var exampleProtocol = defaultProtocol() +var pingProtocol = defaultProtocol() func init() { + // example protocol exampleProtocol.Messages[0x0000] = Message { Name: "Connect", Type: TypeTableDefined { @@ -121,6 +123,16 @@ func init() { }, }, } + + // ping protocol + pingProtocol.Messages[0x0000] = Message { + Name: "Ping", + Type: TypeInt { Bits: 32, Signed: true }, + } + pingProtocol.Messages[0x0001] = Message { + Name: "Pong", + Type: TypeInt { Bits: 32, Signed: true }, + } } func TestGenerateRunEncodeDecode(test *testing.T) { @@ -485,3 +497,101 @@ func TestGenerateRunDecodeWrongType(test *testing.T) { } `) } + +func TestGenerateRunSendReceive(test *testing.T) { + testGenerateRun(test, &pingProtocol, "send-receive", ` + // imports + import "git.tebibyte.media/sashakoshka/hopp/internal/mock" + `, ` + log.Println("Send"); { + message := MessagePing(77) + trans := mock.Trans { } + _, err := Send(&trans, &message) + if err != nil { log.Fatal(err) } + gotMethod, gotPayload := trans.Methods[0], trans.Messages[0] + log.Printf("method M%04X", gotMethod) + log.Println("payload", tu.HexBytes(gotPayload)) + if gotMethod != 0x0000 { + log.Fatalln("wrong method") + } + if ok, n := snake.L(0x43, 0x00, 0x00, 0x00, 0x4D).Check(gotPayload); !ok { + log.Fatalln("not equal at:", n) + } + } + + log.Println("Receive"); { + trans := mock.Trans { + Methods: []uint16 { 1 }, + Messages: [][]byte { []byte { 0x43, 0x00, 0x00, 0x00, 0x4E } }, + } + gotMessage, n, err := Receive(&trans) + if err != nil { log.Fatal(err) } + log.Println("message", gotMessage) + log.Println("n", n) + casted, ok := gotMessage.(MessagePong) + if !ok { log.Fatalln("expected MessagePong") } + if casted != 78 { log.Fatalln("wrong message value") } + if n != 5 { log.Fatalln("wrong n value") } + } + `) +} + +func TestGenerateRunConn(test *testing.T) { + testGenerateRun(test, &pingProtocol, "send-receive", ` + // imports + import "sync" + import "context" + import "git.tebibyte.media/sashakoshka/hopp" + `, ` + group := sync.WaitGroup { } + group.Add(2) + + // server + listener, err := hopp.Listen("tcp", "localhost:9999", nil) + if err != nil { log.Fatalln("SERVER listen:", err) } + go func() { + defer listener.Close() + defer group.Done() + + conn, err := listener.Accept() + if err != nil { log.Fatalln("SERVER accept:", err) } + trans, err := conn.AcceptTrans() + if err != nil { log.Fatalln("SERVER accept trans:", err) } + message, n, err := Receive(trans) + if err != nil { log.Fatalln("SERVER receive:", err) } + log.Println("SERVER got message", message) + log.Println("SERVER got n", n) + casted, ok := message.(MessagePing) + if !ok { log.Fatalln("SERVER expected MessagePong") } + if casted != 77 { log.Fatalln("SERVER wrong message value") } + if n != 5 { log.Fatalln("SERVER wrong n value") } + }() + + // client + go func() { + defer group.Done() + + log.Println("CLIENT dialing") + conn, err := hopp.Dial( + context.Background(), + "tcp", "localhost:9999", + nil) + if err != nil { log.Fatalln("CLIENT dial:", err) } + defer conn.Close() + log.Println("CLIENT connected") + + log.Println("CLIENT opening trans") + trans, err := conn.OpenTrans() + if err != nil { log.Fatalln("CLIENT open trans:", err) } + message := MessagePing(77) + log.Println("CLIENT sending message") + n, err := Send(trans, &message) + if err != nil { log.Fatalln("CLIENT send:", err) } + log.Println("CLIENT sent n", n) + if n != 5 { log.Fatalln("CLIENT wrong n value") } + }() + + group.Wait() + `) + +}