github.com/line/ostracon@v1.0.10-0.20230328032236-7f20145f065d/abci/example/example_test.go (about) 1 package example 2 3 import ( 4 "fmt" 5 "math/rand" 6 "net" 7 "os" 8 "reflect" 9 "testing" 10 "time" 11 12 "github.com/stretchr/testify/require" 13 14 "google.golang.org/grpc" 15 16 "golang.org/x/net/context" 17 18 "github.com/tendermint/tendermint/abci/types" 19 20 abcicli "github.com/line/ostracon/abci/client" 21 "github.com/line/ostracon/abci/example/code" 22 "github.com/line/ostracon/abci/example/kvstore" 23 abciserver "github.com/line/ostracon/abci/server" 24 ocabci "github.com/line/ostracon/abci/types" 25 "github.com/line/ostracon/libs/log" 26 tmnet "github.com/line/ostracon/libs/net" 27 ) 28 29 func init() { 30 rand.Seed(time.Now().UnixNano()) 31 } 32 33 func TestKVStore(t *testing.T) { 34 fmt.Println("### Testing KVStore") 35 testStream(t, kvstore.NewApplication()) 36 } 37 38 func TestBaseApp(t *testing.T) { 39 fmt.Println("### Testing BaseApp") 40 testStream(t, ocabci.NewBaseApplication()) 41 } 42 43 func TestGRPC(t *testing.T) { 44 fmt.Println("### Testing GRPC") 45 testGRPCSync(t, ocabci.NewGRPCApplication(ocabci.NewBaseApplication())) 46 } 47 48 func testStream(t *testing.T, app ocabci.Application) { 49 numDeliverTxs := 20000 50 socketFile := fmt.Sprintf("test-%08x.sock", rand.Int31n(1<<30)) 51 defer os.Remove(socketFile) 52 socket := fmt.Sprintf("unix://%v", socketFile) 53 54 // Start the listener 55 server := abciserver.NewSocketServer(socket, app) 56 server.SetLogger(log.TestingLogger().With("module", "abci-server")) 57 if err := server.Start(); err != nil { 58 require.NoError(t, err, "Error starting socket server") 59 } 60 t.Cleanup(func() { 61 if err := server.Stop(); err != nil { 62 t.Error(err) 63 } 64 }) 65 66 // Connect to the socket 67 client := abcicli.NewSocketClient(socket, false) 68 client.SetLogger(log.TestingLogger().With("module", "abci-client")) 69 if err := client.Start(); err != nil { 70 t.Fatalf("Error starting socket client: %v", err.Error()) 71 } 72 t.Cleanup(func() { 73 if err := client.Stop(); err != nil { 74 t.Error(err) 75 } 76 }) 77 78 done := make(chan struct{}) 79 counter := 0 80 client.SetGlobalCallback(func(req *ocabci.Request, res *ocabci.Response) { 81 // Process response 82 switch r := res.Value.(type) { 83 case *ocabci.Response_DeliverTx: 84 counter++ 85 if r.DeliverTx.Code != code.CodeTypeOK { 86 t.Error("DeliverTx failed with ret_code", r.DeliverTx.Code) 87 } 88 if counter > numDeliverTxs { 89 t.Fatalf("Too many DeliverTx responses. Got %d, expected %d", counter, numDeliverTxs) 90 } 91 if counter == numDeliverTxs { 92 go func() { 93 time.Sleep(time.Second * 1) // Wait for a bit to allow counter overflow 94 close(done) 95 }() 96 return 97 } 98 case *ocabci.Response_Flush: 99 // ignore 100 default: 101 t.Error("Unexpected response type", reflect.TypeOf(res.Value)) 102 } 103 }) 104 105 // Write requests 106 for counter := 0; counter < numDeliverTxs; counter++ { 107 // Send request 108 reqRes := client.DeliverTxAsync(types.RequestDeliverTx{Tx: []byte("test")}, nil) 109 _ = reqRes 110 // check err ? 111 112 // Sometimes send flush messages 113 if counter%123 == 0 { 114 client.FlushAsync(nil) 115 // check err ? 116 } 117 } 118 119 // Send final flush message 120 client.FlushAsync(nil) 121 122 <-done 123 } 124 125 //------------------------- 126 // test grpc 127 128 func dialerFunc(ctx context.Context, addr string) (net.Conn, error) { 129 return tmnet.Connect(addr) 130 } 131 132 func testGRPCSync(t *testing.T, app ocabci.ABCIApplicationServer) { 133 numDeliverTxs := 2000 134 socketFile := fmt.Sprintf("/tmp/test-%08x.sock", rand.Int31n(1<<30)) 135 defer os.Remove(socketFile) 136 socket := fmt.Sprintf("unix://%v", socketFile) 137 138 // Start the listener 139 server := abciserver.NewGRPCServer(socket, app) 140 server.SetLogger(log.TestingLogger().With("module", "abci-server")) 141 if err := server.Start(); err != nil { 142 t.Fatalf("Error starting GRPC server: %v", err.Error()) 143 } 144 145 t.Cleanup(func() { 146 if err := server.Stop(); err != nil { 147 t.Error(err) 148 } 149 }) 150 151 // Connect to the socket 152 //nolint:staticcheck // SA1019 Existing use of deprecated but supported dial option. 153 conn, err := grpc.Dial(socket, grpc.WithInsecure(), grpc.WithContextDialer(dialerFunc)) 154 if err != nil { 155 t.Fatalf("Error dialing GRPC server: %v", err.Error()) 156 } 157 158 t.Cleanup(func() { 159 if err := conn.Close(); err != nil { 160 t.Error(err) 161 } 162 }) 163 164 client := ocabci.NewABCIApplicationClient(conn) 165 166 // Write requests 167 for counter := 0; counter < numDeliverTxs; counter++ { 168 // Send request 169 response, err := client.DeliverTx(context.Background(), &types.RequestDeliverTx{Tx: []byte("test")}) 170 if err != nil { 171 t.Fatalf("Error in GRPC DeliverTx: %v", err.Error()) 172 } 173 counter++ 174 if response.Code != code.CodeTypeOK { 175 t.Error("DeliverTx failed with ret_code", response.Code) 176 } 177 if counter > numDeliverTxs { 178 t.Fatal("Too many DeliverTx responses") 179 } 180 t.Log("response", counter) 181 if counter == numDeliverTxs { 182 go func() { 183 time.Sleep(time.Second * 1) // Wait for a bit to allow counter overflow 184 }() 185 } 186 187 } 188 }