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