204 lines
6.3 KiB
Go
204 lines
6.3 KiB
Go
package cachev2_test
|
|
|
|
import (
|
|
"encoding/json"
|
|
"sort"
|
|
"testing"
|
|
|
|
cache "fiskerinc.com/modules/cachev2"
|
|
"fiskerinc.com/modules/common"
|
|
"fiskerinc.com/modules/mongo"
|
|
"fiskerinc.com/modules/redis"
|
|
"fiskerinc.com/modules/testhelper"
|
|
"fiskerinc.com/modules/utils/elptr"
|
|
redigo "github.com/gomodule/redigo/redis"
|
|
"github.com/stretchr/testify/assert"
|
|
)
|
|
|
|
func TestRetrieveVehicleConfig(t *testing.T) {
|
|
setupRedisMock()
|
|
id := "TESTVIN1234567"
|
|
|
|
mockRedis = &mockRedisVehicleConfig{}
|
|
config, err := cache.RetrieveVehicleConfig(mockRedis, mongo.NewMockClient(), id)
|
|
if err != nil {
|
|
t.Errorf(testhelper.TestErrorTemplate, "TestRetrieveVehicleConfig", nil, err)
|
|
}
|
|
data, err := json.Marshal(&config)
|
|
if err != nil {
|
|
t.Errorf(testhelper.TestErrorTemplate, "TestRetrieveVehicleConfig", nil, err)
|
|
}
|
|
assert.Equal(t, `{"canbus":{"enabled":false,"data_logger_enabled":false,"dtc_enabled":false},"log_level":"trace"}`, string(data))
|
|
|
|
mockRedis = &mockRedisNoVehicleConfig{}
|
|
config, err = cache.RetrieveVehicleConfig(mockRedis, mongo.NewMockClient(), id)
|
|
if err != nil {
|
|
t.Errorf(testhelper.TestErrorTemplate, "TestRetrieveVehicleConfig", nil, err)
|
|
}
|
|
data, err = json.Marshal(&config)
|
|
if err != nil {
|
|
t.Errorf(testhelper.TestErrorTemplate, "TestRetrieveVehicleConfig", nil, err)
|
|
}
|
|
assert.Equal(t, `{"canbus":{"enabled":false,"data_logger_enabled":false,"dtc_enabled":false},"log_level":"trace","log":{"matches":[{"channel":"cmd","level":"trace"}]}}`, string(data))
|
|
}
|
|
|
|
func TestRetrieveVehicleConfigDbgMask(t *testing.T) {
|
|
setupRedisMock()
|
|
id := "TESTVIN1234567"
|
|
mockVehicle := mongo.Vehicle{VIN: id}
|
|
mockRedis = &mockRedisNoVehicleConfig{}
|
|
|
|
// validate that by default, retrieved debug value IS NOT passed to trxCfg
|
|
trxCfg, err := cache.RetrieveVehicleConfig(mockRedis, mongo.NewMockClient(), id)
|
|
existingValue := trxCfg.DebugMask
|
|
assert.Nil(t, err)
|
|
assert.NotNil(t, trxCfg)
|
|
// assert that trxCfg value is unchanged
|
|
assert.Equal(t, trxCfg.DebugMask, existingValue)
|
|
|
|
// let us try to enable
|
|
// the mock for redis is with no data so that code will fall through to the DB part
|
|
// we ensure that what we get from DB has speific debug mask which should be
|
|
// passed to Trex when the flag is true
|
|
t.Setenv(cache.ENABLE_DBG_MASK_EV_NAME, cache.ENABLE_DBG_MASK_VAL_TRUE)
|
|
cache.ENABLE_DEBUG_MASK = cache.DbgMaskEnabled()
|
|
mmc := mongo.NewMockMongoClient()
|
|
mockVehicle.DebugMask = "test"
|
|
mmc.GetVehicles().AddVehicle(&mockVehicle)
|
|
trxCfg, _ = cache.RetrieveVehicleConfig(mockRedis, mmc, id)
|
|
// now validate that Trex config got the value as set in the mocked vehicle
|
|
// (presumed as retrieved)
|
|
assert.Equal(t, trxCfg.DebugMask, mockVehicle.DebugMask)
|
|
|
|
// now set back the env variable so new values don't flow to trex
|
|
t.Setenv(cache.ENABLE_DBG_MASK_EV_NAME, cache.ENABLE_DBG_MASK_VAL_FALSE)
|
|
cache.ENABLE_DEBUG_MASK = cache.DbgMaskEnabled()
|
|
oldMask := mockVehicle.DebugMask
|
|
mockVehicle.DebugMask = "new-value"
|
|
// skipping adding to the cache/DB as we still had the valid reference
|
|
trxCfg, _ = cache.RetrieveVehicleConfig(mockRedis, mmc, id)
|
|
// assert that trex does not have new value
|
|
assert.NotEqual(t, trxCfg.DebugMask, oldMask)
|
|
}
|
|
|
|
func TestFiltersMap(t *testing.T) {
|
|
filters := make(cache.FiltersMap)
|
|
|
|
if len(filters) != 0 {
|
|
t.Errorf(testhelper.TestErrorTemplate, "TestFiltersMap", 0, len(filters))
|
|
return
|
|
}
|
|
|
|
emptyHex := common.NewBinaryHex([]byte{})
|
|
bhex := common.BinaryHex("123")
|
|
filters.AppendFilters(
|
|
[]common.CANFilter{
|
|
{CANID: "123", Interval: elptr.ElPtr(123)},
|
|
{CANID: "456", Interval: elptr.ElPtr(456)},
|
|
{CANID: "789", EdgeMask: &emptyHex},
|
|
{CANID: "901", EdgeMask: &bhex},
|
|
{CANID: "222", Interval: elptr.ElPtr(123), EdgeMask: &bhex},
|
|
{CANID: "333", Interval: elptr.ElPtr(0)},
|
|
},
|
|
)
|
|
if len(filters) != 5 {
|
|
t.Errorf(testhelper.TestErrorTemplate, "TestFiltersMap", 5, len(filters))
|
|
return
|
|
}
|
|
|
|
interval, ok := filters["123"]
|
|
if !ok || *interval.Interval != 123 && interval.EdgeMask != nil {
|
|
t.Errorf(testhelper.TestErrorTemplate, "TestFiltersMap", 123, "error")
|
|
return
|
|
}
|
|
|
|
interval, ok = filters["456"]
|
|
|
|
if !ok || *interval.Interval != 456 && interval.EdgeMask != nil {
|
|
t.Errorf(testhelper.TestErrorTemplate, "TestFiltersMap", 456, "error")
|
|
return
|
|
}
|
|
|
|
interval, ok = filters["789"]
|
|
if ok || interval.EdgeMask != nil || interval.Interval != nil {
|
|
t.Errorf(testhelper.TestErrorTemplate, "TestFiltersMap", emptyHex, "error")
|
|
return
|
|
}
|
|
|
|
interval, ok = filters["901"]
|
|
if !ok || interval.EdgeMask.String() != bhex.String() && interval.Interval != nil {
|
|
t.Errorf(testhelper.TestErrorTemplate, "TestFiltersMap", bhex, "error")
|
|
return
|
|
}
|
|
|
|
interval, ok = filters["222"]
|
|
if !ok || interval.EdgeMask.String() != bhex.String() && interval.Interval != nil {
|
|
t.Errorf(testhelper.TestErrorTemplate, "TestFiltersMap", bhex, "error")
|
|
return
|
|
}
|
|
|
|
interval, ok = filters["333"]
|
|
if !ok || interval.EdgeMask != nil && *interval.Interval != 0 {
|
|
t.Errorf(testhelper.TestErrorTemplate, "TestFiltersMap", nil, "error")
|
|
return
|
|
}
|
|
|
|
slice := filters.ToSlice()
|
|
if len(slice) != 5 {
|
|
t.Errorf(testhelper.TestErrorTemplate, "TestFiltersMap", 5, len(slice))
|
|
return
|
|
}
|
|
|
|
sort.Slice(slice, func(i, j int) bool {
|
|
return slice[i].CANID < slice[j].CANID
|
|
})
|
|
|
|
if slice[0].CANID != "123" {
|
|
t.Errorf(testhelper.TestErrorTemplate, "TestFiltersMap", "123", slice[0].CANID)
|
|
return
|
|
}
|
|
|
|
if slice[1].CANID != "222" {
|
|
t.Errorf(testhelper.TestErrorTemplate, "TestFiltersMap", "222", slice[1].CANID)
|
|
return
|
|
}
|
|
|
|
if slice[2].CANID != "333" {
|
|
t.Errorf(testhelper.TestErrorTemplate, "TestFiltersMap", "333", slice[2].CANID)
|
|
return
|
|
}
|
|
|
|
if slice[3].CANID != "456" {
|
|
t.Errorf(testhelper.TestErrorTemplate, "TestFiltersMap", "456", slice[0].CANID)
|
|
return
|
|
}
|
|
|
|
if slice[4].CANID != "901" {
|
|
t.Errorf(testhelper.TestErrorTemplate, "TestFiltersMap", "901", slice[0].CANID)
|
|
return
|
|
}
|
|
|
|
}
|
|
|
|
type mockRedisVehicleConfig struct {
|
|
redis.Connection
|
|
}
|
|
|
|
func (c *mockRedisVehicleConfig) Execute(command ...interface{}) (interface{}, error) {
|
|
config := common.TRexConfigResponse{}
|
|
data, _ := json.Marshal(config)
|
|
return data, nil
|
|
}
|
|
|
|
type mockRedisNoVehicleConfig struct {
|
|
redis.Connection
|
|
}
|
|
|
|
func (c *mockRedisNoVehicleConfig) Execute(command ...interface{}) (interface{}, error) {
|
|
return nil, redigo.ErrNil
|
|
}
|
|
|
|
func (c *mockRedisNoVehicleConfig) ExecuteBatch(batch *redis.RedisBatchCommands) (interface{}, error) {
|
|
return nil, nil
|
|
}
|