xref: /aosp_15_r20/external/flatbuffers/grpc/tests/go_test.go (revision 890232f25432b36107d06881e0a25aaa6b473652)
1package testing
2
3import (
4	flatbuffers "github.com/google/flatbuffers/go"
5	"github.com/google/flatbuffers/tests/MyGame/Example"
6
7	"context"
8	"net"
9	"testing"
10
11	"google.golang.org/grpc"
12	"google.golang.org/grpc/encoding"
13)
14
15type server struct {
16	Example.UnimplementedMonsterStorageServer
17}
18
19// test used to send and receive in grpc methods
20var test = "Flatbuffers"
21var addr = "0.0.0.0:50051"
22
23// gRPC server store method
24func (s *server) Store(context context.Context, in *Example.Monster) (*flatbuffers.Builder, error) {
25	b := flatbuffers.NewBuilder(0)
26	i := b.CreateString(test)
27	Example.StatStart(b)
28	Example.StatAddId(b, i)
29	b.Finish(Example.StatEnd(b))
30	return b, nil
31
32}
33
34// gRPC server retrieve method
35func (s *server) Retrieve(context context.Context, in *Example.Stat) (*flatbuffers.Builder, error) {
36	b := flatbuffers.NewBuilder(0)
37	i := b.CreateString(test)
38	Example.MonsterStart(b)
39	Example.MonsterAddName(b, i)
40	b.Finish(Example.MonsterEnd(b))
41	return b, nil
42}
43
44func StoreClient(c Example.MonsterStorageClient, t *testing.T) {
45	b := flatbuffers.NewBuilder(0)
46	i := b.CreateString(test)
47	Example.MonsterStart(b)
48	Example.MonsterAddName(b, i)
49	b.Finish(Example.MonsterEnd(b))
50	out, err := c.Store(context.Background(), b)
51	if err != nil {
52		t.Fatalf("Store client failed: %v", err)
53	}
54	if string(out.Id()) != test {
55		t.Errorf("StoreClient failed: expected=%s, got=%s\n", test, out.Id())
56		t.Fail()
57	}
58}
59
60func RetrieveClient(c Example.MonsterStorageClient, t *testing.T) {
61	b := flatbuffers.NewBuilder(0)
62	i := b.CreateString(test)
63	Example.StatStart(b)
64	Example.StatAddId(b, i)
65	b.Finish(Example.StatEnd(b))
66	out, err := c.Retrieve(context.Background(), b)
67	if err != nil {
68		t.Fatalf("Retrieve client failed: %v", err)
69	}
70	monster, err := out.Recv()
71	if err != nil {
72		t.Fatalf("Recv failed: %v", err)
73	}
74	if string(monster.Name()) != test {
75		t.Errorf("RetrieveClient failed: expected=%s, got=%s\n", test, monster.Name())
76		t.Fail()
77	}
78}
79
80func TestGRPC(t *testing.T) {
81	lis, err := net.Listen("tcp", addr)
82	if err != nil {
83		t.Fatalf("Failed to listen: %v", err)
84	}
85	ser := grpc.NewServer()
86	encoding.RegisterCodec(flatbuffers.FlatbuffersCodec{})
87	Example.RegisterMonsterStorageServer(ser, &server{})
88	go func() {
89		if err := ser.Serve(lis); err != nil {
90			t.Fatalf("Failed to serve: %v", err)
91			t.FailNow()
92		}
93	}()
94	conn, err := grpc.Dial(addr, grpc.WithInsecure(), grpc.WithCodec(flatbuffers.FlatbuffersCodec{}))
95	if err != nil {
96		t.Fatalf("Failed to connect: %v", err)
97	}
98	defer conn.Close()
99	client := Example.NewMonsterStorageClient(conn)
100	StoreClient(client, t)
101	RetrieveClient(client, t)
102}
103