github.com/nsqio/nsq@v1.3.0/nsqlookupd/lookup_protocol_v1_test.go (about) 1 package nsqlookupd 2 3 import ( 4 "errors" 5 "testing" 6 "time" 7 8 "github.com/nsqio/nsq/internal/protocol" 9 "github.com/nsqio/nsq/internal/test" 10 ) 11 12 func TestIOLoopReturnsClientErrWhenSendFails(t *testing.T) { 13 fakeConn := test.NewFakeNetConn() 14 fakeConn.WriteFunc = func(b []byte) (int, error) { 15 return 0, errors.New("write error") 16 } 17 18 testIOLoopReturnsClientErr(t, fakeConn) 19 } 20 21 func TestIOLoopReturnsClientErrWhenSendSucceeds(t *testing.T) { 22 fakeConn := test.NewFakeNetConn() 23 fakeConn.WriteFunc = func(b []byte) (int, error) { 24 return len(b), nil 25 } 26 27 testIOLoopReturnsClientErr(t, fakeConn) 28 } 29 30 func testIOLoopReturnsClientErr(t *testing.T, fakeConn test.FakeNetConn) { 31 fakeConn.ReadFunc = func(b []byte) (int, error) { 32 return copy(b, []byte("INVALID_COMMAND\n")), nil 33 } 34 35 opts := NewOptions() 36 opts.Logger = test.NewTestLogger(t) 37 opts.LogLevel = LOG_DEBUG 38 opts.TCPAddress = "127.0.0.1:0" 39 opts.HTTPAddress = "127.0.0.1:0" 40 41 nsqlookupd, err := New(opts) 42 test.Nil(t, err) 43 prot := &LookupProtocolV1{nsqlookupd: nsqlookupd} 44 45 nsqlookupd.tcpServer = &tcpServer{nsqlookupd: prot.nsqlookupd} 46 47 errChan := make(chan error) 48 testIOLoop := func() { 49 client := prot.NewClient(fakeConn) 50 errChan <- prot.IOLoop(client) 51 defer prot.nsqlookupd.Exit() 52 } 53 go testIOLoop() 54 55 var timeout bool 56 57 select { 58 case err = <-errChan: 59 case <-time.After(2 * time.Second): 60 timeout = true 61 } 62 63 test.Equal(t, false, timeout) 64 65 test.NotNil(t, err) 66 test.Equal(t, "E_INVALID invalid command INVALID_COMMAND", err.Error()) 67 test.NotNil(t, err.(*protocol.FatalClientErr)) 68 }