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  }