src.dualinventive.com/go/influxdb-logger/internal/device/cache_test.go

113 lines
4.0 KiB
Go

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")
}