func (s *TestSuite) TestApiDisconnect(t *C) { /** * If using direct interface, Recv() should return error if API disconnects. */ ws, err := client.NewWebsocketClient(s.logger, s.api, "agent", nil) t.Assert(err, IsNil) ws.Connect() c := <-mock.ClientConnectChan <-ws.ConnectChan() // No error yet. got := test.WaitErr(ws.ErrorChan()) t.Assert(len(got), Equals, 0) mock.DisconnectClient(c) /** * I cannot provoke an error on websocket.Send(), only Receive(). * Perhaps errors (e.g. ws closed) are only reported on recv? * This only affect the logger since it's ws send-only: it will * need a goroutine blocking on Recieve() that, upon error, notifies * the sending goroutine to reconnect. */ var data interface{} err = ws.Recv(data, 5) t.Assert(err, NotNil) // EOF due to disconnect. }
func (s *TestSuite) TestErrorChan(t *C) { /** * When client disconnects due to send or recv error, * it should send the error on its ErrorChan(). */ ws, err := client.NewWebsocketClient(s.logger, s.api, "agent") t.Assert(err, IsNil) ws.Start() defer ws.Stop() ws.Connect() c := <-mock.ClientConnectChan <-ws.ConnectChan() // No error yet. got := test.WaitErr(ws.ErrorChan()) t.Assert(len(got), Equals, 0) // API sends Cmd to client. cmd := &proto.Cmd{ User: "******", Ts: time.Now(), Cmd: "Status", } c.SendChan <- cmd // No error yet. got = test.WaitErr(ws.ErrorChan()) t.Assert(len(got), Equals, 0) // Disconnect the client. mock.DisconnectClient(c) // Client should send error from disconnect. got = test.WaitErr(ws.ErrorChan()) t.Assert(len(got), Equals, 1) t.Assert(got[0], NotNil) err = ws.Disconnect() t.Assert(err, IsNil) }