github.com/awesome-flow/flow@v0.0.3-0.20190918184116-508d75d68a2c/pkg/corev1alpha1/actor/receiver_tcp_test.go (about)

     1  package actor
     2  
     3  import (
     4  	"fmt"
     5  	"reflect"
     6  	"testing"
     7  
     8  	core "github.com/awesome-flow/flow/pkg/corev1alpha1"
     9  	coretest "github.com/awesome-flow/flow/pkg/corev1alpha1/test"
    10  	testutil "github.com/awesome-flow/flow/pkg/util/test"
    11  	flowtest "github.com/awesome-flow/flow/pkg/util/test/corev1alpha1"
    12  )
    13  
    14  func TestTCPHandleConn(t *testing.T) {
    15  	nthreads := 4
    16  	ctx, err := coretest.NewContextWithConfig(map[string]interface{}{})
    17  	if err != nil {
    18  		t.Fatalf("failed to create context: %s", err)
    19  	}
    20  	if err := ctx.Start(); err != nil {
    21  		t.Fatalf("failed to start context: %s", err)
    22  	}
    23  
    24  	type testStruct struct {
    25  		name    string
    26  		status  core.MsgStatus
    27  		sync    bool
    28  		expresp []byte
    29  	}
    30  
    31  	tests := make([]testStruct, 0, len(MsgStatusToTcpResp))
    32  	for status, resp := range MsgStatusToTcpResp {
    33  		tests = append(tests, testStruct{
    34  			name:    fmt.Sprintf("response with %s", sts2name(status)),
    35  			status:  status,
    36  			sync:    true,
    37  			expresp: resp,
    38  		})
    39  	}
    40  
    41  	t.Parallel()
    42  
    43  	for _, testCase := range tests {
    44  		t.Run(testCase.name, func(t *testing.T) {
    45  			conn := newTestConn(
    46  				newTestAddr("tcp", "127.0.0.1:12345"),
    47  				newTestAddr("tcp", "127.0.0.1:23456"),
    48  			)
    49  			params := core.Params{
    50  				"bind":     "127.0.0.1:12345",
    51  				"sync":     testCase.sync,
    52  				"buf_size": 8 * 1024,
    53  			}
    54  			rcv, err := NewReceiverTCP("receiver", ctx, params)
    55  			if err != nil {
    56  				t.Fatalf("failed to create receiver: %s", err)
    57  			}
    58  
    59  			peer, err := flowtest.NewTestActor("test-actor", ctx, core.Params{})
    60  			if err != nil {
    61  				t.Fatalf("failed to create test actor: %s", err)
    62  			}
    63  			if err := rcv.Connect(nthreads, peer); err != nil {
    64  				t.Fatalf("failed to connect test receiver: %s", err)
    65  			}
    66  
    67  			mailbox := make(chan *core.Message, 1)
    68  			defer close(mailbox)
    69  
    70  			peer.(*flowtest.TestActor).OnReceive(func(msg *core.Message) {
    71  				mailbox <- msg
    72  				msg.Complete(testCase.status)
    73  				peer.(*flowtest.TestActor).Flush()
    74  			})
    75  
    76  			body := testutil.RandBytes(8 * 1024)
    77  			if _, err := conn.Write(body); err != nil {
    78  				t.Fatalf("failed to write body data to test conn: %s", err)
    79  			}
    80  
    81  			rcv.(*ReceiverTCP).handleConn(conn)
    82  			if !reflect.DeepEqual(conn.buf, testCase.expresp) {
    83  				t.Fatalf("unexpected conn buf: got: %s, want: %s", string(conn.buf), testCase.expresp)
    84  			}
    85  
    86  			msg := <-mailbox
    87  			if !reflect.DeepEqual(msg.Body(), body) {
    88  				t.Fatalf("unexpected message body: got: %s, want: %s", string(msg.Body()), string(body))
    89  			}
    90  		})
    91  	}
    92  
    93  }