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