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