package crm3000 import ( "encoding/hex" "fmt" "io/ioutil" "os" "testing" "time" "github.com/stretchr/testify/assert" "src.dualinventive.com/go/dinet" "src.dualinventive.com/go/dinet/rpc" "src.dualinventive.com/go/lib/dilog" ) //suppressed because these specifically are assigned once and are to be considered constant. //nolint:gochecknoglobals var ( testHexPayloadWithoutImei []byte testHexPayloadWithImei []byte ) func TestMain(m *testing.M) { testHexPayloadWithoutImei = readTestData("testdata/payload_noimei_v1.0.2.hex") testHexPayloadWithImei = readTestData("testdata/payload_imei_v1.0.2.hex") os.Exit(m.Run()) } func readTestData(filepath string) []byte { //nolint:gosec hexBytes, err := ioutil.ReadFile(filepath) if err != nil { fmt.Println("failed to read testdata") os.Exit(1) } data, err := hex.DecodeString(string(hexBytes)) if err != nil { fmt.Println("failed to decode testdata") os.Exit(1) } return data } //nolint:dupl func TestHandle_withImeiInPayload_doesOverwriteImei(t *testing.T) { pd, transport := dinet.NewParentDeviceMock(t) payload := testHexPayloadWithImei h := NewSensorMessageHandler(dilog.NewTestLogger(t), pd) done := make(chan []*rpc.Msg, 1) go listTransport(transport, 2*time.Second, done) h.Handle(payload, "test-imei") rpcs := <-done assert.Len(t, rpcs, 1) assert.Equal(t, rpcs[0].DeviceUID, "04000000000000000863703039106237") } //nolint:dupl func TestHandle_withoutImeiInPayload_doesNotOverwriteImei(t *testing.T) { pd, transport := dinet.NewParentDeviceMock(t) payload := testHexPayloadWithoutImei h := NewSensorMessageHandler(dilog.NewTestLogger(t), pd) done := make(chan []*rpc.Msg, 1) go listTransport(transport, 2*time.Second, done) h.Handle(payload, "test-imei") rpcs := <-done assert.Len(t, rpcs, 1) assert.Equal(t, rpcs[0].DeviceUID, "04000000000000000000000test-imei") } //nolint: dupl func listTransport(transport *dinet.TestTransport, timeout time.Duration, done chan []*rpc.Msg) { var rpcs []*rpc.Msg for { to := false select { case msg := <-transport.Read: rpcs = append(rpcs, msg) case <-time.Tick(timeout): to = true } if to { break } } done <- rpcs }