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  }