package dinet import ( "sync" "testing" "time" "src.dualinventive.com/go/dinet/ditime" "src.dualinventive.com/go/dinet/rpc" "github.com/stretchr/testify/require" ) const tstUID = "DEADBEEFCAFEBABEDEADBEEFCAFEBABE" func TestNotSupportedOrStubFuncs(t *testing.T) { conn, err := NewDeviceConn(TransportTest) require.Nil(t, err) require.Nil(t, conn.Reconnect()) require.Nil(t, conn.DeviceHandshake("boem")) require.Nil(t, conn.DeviceRegister("boem")) err = conn.SetTimeout(time.Minute) require.NotNil(t, err) require.Equal(t, ErrNotSupported, err) } func TestSend(t *testing.T) { conn, err := NewDeviceConn(TransportTest) require.Nil(t, err) tt := conn.(*TestTransport) msg := rpc.Msg{Type: rpc.MsgTypeRequest, ClassMethod: rpc.ClassMethodSensorData, DeviceUID: tstUID} erro := conn.Send(&msg) require.NotNil(t, erro) require.Equal(t, ErrDisconnected, erro) err = conn.Connect("dont care") require.Nil(t, err) wg := &sync.WaitGroup{} wg.Add(1) go func() { defer wg.Done() err := conn.Send(&msg) require.Nil(t, err) }() rx := <-tt.Read require.Equal(t, msg.Dinetrpc, rx.Dinetrpc) require.Equal(t, msg.ID, rx.ID) require.Equal(t, msg.Time, rx.Time) require.Equal(t, msg.Type, rx.Type) require.Equal(t, msg.ClassMethod, rx.ClassMethod) require.Equal(t, msg.DeviceUID, rx.DeviceUID) wg.Wait() require.Nil(t, conn.Close()) } func TestRecv(t *testing.T) { conn, err := NewDeviceConn(TransportTest) require.Nil(t, err) tt := conn.(*TestTransport) msg := rpc.Msg{ Dinetrpc: rpc.CurrentDinetrpc, ID: 1, Time: ditime.Now(), Type: rpc.MsgTypeRequest, ClassMethod: rpc.ClassMethodSensorData, DeviceUID: tstUID, } _, erro := conn.Recv() require.NotNil(t, erro) require.Equal(t, ErrDisconnected, erro) err = conn.Connect("dont care") require.Nil(t, err) wg := &sync.WaitGroup{} wg.Add(1) go func() { defer wg.Done() rxmsg, err := conn.Recv() require.Nil(t, err) require.Equal(t, msg.Dinetrpc, rxmsg.Dinetrpc) require.Equal(t, msg.ID, rxmsg.ID) require.Equal(t, msg.Time, rxmsg.Time) require.Equal(t, msg.Type, rxmsg.Type) require.Equal(t, msg.ClassMethod, rxmsg.ClassMethod) require.Equal(t, msg.DeviceUID, rxmsg.DeviceUID) }() tt.Write <- &msg wg.Wait() require.Nil(t, conn.Close()) }