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