package device import ( "testing" "time" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "src.dualinventive.com/go/dinet/rpc" "src.dualinventive.com/go/dinet/rts" "src.dualinventive.com/go/lib/kv" ) func TestNew(t *testing.T) { ramKV, err := kv.New(kv.TypeRAM, "") require.Nil(t, err) c := New(ramKV, 10, 2*time.Second) require.NotNil(t, c) assert.Equal(t, ramKV, c.r) deviceUID := "01552211552266995588774455226622" // Fill the ram kv require.Nil(t, ramKV.HSet(rts.KeyPrefixDevice+deviceUID, "sensor:1:info", `{"label":"bat1-voltage","last_update":1517914855147,"time":1517914854889,"type":"number","uid":1}`)) require.Nil(t, ramKV.HSet(rts.KeyPrefixDevice+deviceUID, "sensor:10:info", `{"enum":{"charging":2,"connected":1,"disconnected":0,"error":3},"label":"charger1-state","last_update" :1517914855150,"time":1517914854889,"type":"enum","uid":10}`)) require.Nil(t, ramKV.HSet(rts.KeyPrefixDevice+deviceUID, "notify:100:info", `{"label":"du-detection","last_update":1517914855553,"time":1517914855337,"type":"bool","uid":100}`)) // Invalid uid require.Nil(t, ramKV.HSet(rts.KeyPrefixDevice+deviceUID, "notify:bots:info", `{"label":"du-bots","last_update":1517914855553,"time":1517914855337,"type":"bool","uid":"bots"}`)) // Invalid JSON require.Nil(t, ramKV.HSet(rts.KeyPrefixDevice+deviceUID, "notify:101:info", `bla`)) // No label require.Nil(t, ramKV.HSet(rts.KeyPrefixDevice+deviceUID, "notify:102:info", `{"last_update":1517914855553,"time":1517914855337,"type":"bool","uid":102}`)) // Empty label require.Nil(t, ramKV.HSet(rts.KeyPrefixDevice+deviceUID, "notify:103:info", `{"label":"", "last_update":1517914855553,"time":1517914855337,"type":"bool","uid":103}`)) // No type require.Nil(t, ramKV.HSet(rts.KeyPrefixDevice+deviceUID, "notify:104:info", `{"label":"type", "last_update":1517914855553,"time":1517914855337,"uid":104}`)) require.Nil(t, ramKV.HSet(rts.KeyPrefixDevice+deviceUID, "sensor:1:data", `{"uid":1,"time":1519141031661,"value":12.107519149780273,"last_update":1519141031326}`)) require.Nil(t, ramKV.HSet(rts.KeyPrefixDevice+deviceUID, string(rpc.ClassMethodDeviceInfo), `{"last_update":1519137369375,"revision":3,"time":1519137368544,"type":"tws-3000-duu","version":"0.8.0"}`)) rd, err := c.Device(deviceUID) require.Nil(t, err) assert.Equal(t, "tws-3000-duu", rd.Type) require.Equal(t, 2, len(rd.SensorFields)) require.Equal(t, 1, len(rd.NotifyFields)) s, ok := rd.SensorFields[1] require.True(t, ok) assert.Equal(t, "bat1-voltage", s.Label) assert.Equal(t, "number", s.Type) s, ok = rd.SensorFields[10] require.True(t, ok) assert.Equal(t, "charger1-state", s.Label) assert.Equal(t, "enum", s.Type) s, ok = rd.NotifyFields[100] require.True(t, ok) assert.Equal(t, "du-detection", s.Label) assert.Equal(t, "bool", s.Type) // Update cache require.Nil(t, ramKV.HSet(rts.KeyPrefixDevice+deviceUID, string(rpc.ClassMethodDeviceInfo), `{"last_update":1519137369375,"revision":3,"time":1519137368544,"type":"tws-3000-wum","version":"0.8.0"}`)) // Cache is not updated rd, err = c.Device(deviceUID) require.Nil(t, err) assert.Equal(t, "tws-3000-duu", rd.Type) time.Sleep(2 * time.Second) // Cache is updated rd, err = c.Device(deviceUID) require.Nil(t, err) assert.Equal(t, "tws-3000-wum", rd.Type) } func TestGetDeviceTypeFromRedis(t *testing.T) { ramKV, err := kv.New(kv.TypeRAM, "") require.Nil(t, err) c := New(ramKV, 10, 2*time.Second) require.NotNil(t, c) deviceUID := "01552211552266995588774455226622" // No json require.Nil(t, ramKV.HSet(rts.KeyPrefixDevice+deviceUID, string(rpc.ClassMethodDeviceInfo), `info`)) s, err := c.getDeviceTypeFromRedis(deviceUID) assert.Equal(t, "", s) assert.Error(t, err, "invalid character 'i' looking for beginning of value") // No type require.Nil(t, ramKV.HSet(rts.KeyPrefixDevice+deviceUID, string(rpc.ClassMethodDeviceInfo), `{"last_update":1519137369375,"revision":3,"time":1519137368544,"version":"0.8.0"}`)) s, err = c.getDeviceTypeFromRedis(deviceUID) assert.Equal(t, "", s) assert.Error(t, err, "no type in device:info") }