Skip to content

Commit

Permalink
Fix nil pointer error in knx_listener (#9444)
Browse files Browse the repository at this point in the history
(cherry picked from commit 9b22161)
  • Loading branch information
pheew authored and reimda committed Jul 7, 2021
1 parent c0365e6 commit 6056217
Show file tree
Hide file tree
Showing 2 changed files with 78 additions and 21 deletions.
8 changes: 5 additions & 3 deletions plugins/inputs/knx_listener/knx_listener.go
Original file line number Diff line number Diff line change
Expand Up @@ -148,9 +148,11 @@ func (kl *KNXListener) listen() {
// Match GA to DataPointType and measurement name
ga := msg.Destination.String()
target, ok := kl.gaTargetMap[ga]
if !ok && !kl.gaLogbook[ga] {
kl.Log.Infof("Ignoring message %+v for unknown GA %q", msg, ga)
kl.gaLogbook[ga] = true
if !ok {
if !kl.gaLogbook[ga] {
kl.Log.Infof("Ignoring message %+v for unknown GA %q", msg, ga)
kl.gaLogbook[ga] = true
}
continue
}

Expand Down
91 changes: 73 additions & 18 deletions plugins/inputs/knx_listener/knx_listener_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -38,13 +38,31 @@ func setValue(data dpt.DatapointValue, value interface{}) error {
return nil
}

type TestMessage struct {
address string
dpt string
value interface{}
}

func ProduceKnxEvent(t *testing.T, address string, datapoint string, value interface{}) *knx.GroupEvent {
addr, err := cemi.NewGroupAddrString(address)
require.NoError(t, err)

data, ok := dpt.Produce(datapoint)
require.True(t, ok)
err = setValue(data, value)
require.NoError(t, err)

return &knx.GroupEvent{
Command: knx.GroupWrite,
Destination: addr,
Data: data.Pack(),
}
}

func TestRegularReceives_DPT(t *testing.T) {
// Define the test-cases
var testcases = []struct {
address string
dpt string
value interface{}
}{
var testcases = []TestMessage{
{"1/0/1", "1.001", true},
{"1/0/2", "1.002", false},
{"1/0/3", "1.003", true},
Expand Down Expand Up @@ -95,19 +113,8 @@ func TestRegularReceives_DPT(t *testing.T) {

// Send the defined test data
for _, testcase := range testcases {
addr, err := cemi.NewGroupAddrString(testcase.address)
require.NoError(t, err)

data, ok := dpt.Produce(testcase.dpt)
require.True(t, ok)
err = setValue(data, testcase.value)
require.NoError(t, err)

client.Send(knx.GroupEvent{
Command: knx.GroupWrite,
Destination: addr,
Data: data.Pack(),
})
event := ProduceKnxEvent(t, testcase.address, testcase.dpt, testcase.value)
client.Send(*event)
}

// Give the accumulator some time to collect the data
Expand All @@ -133,3 +140,51 @@ func TestRegularReceives_DPT(t *testing.T) {
assert.True(t, !tstart.After(m.Time))
}
}

func TestRegularReceives_MultipleMessages(t *testing.T) {
listener := KNXListener{
ServiceType: "dummy",
Measurements: []Measurement{
{"temperature", "1.001", []string{"1/1/1"}},
},
Log: testutil.Logger{Name: "knx_listener"},
}

acc := &testutil.Accumulator{}

// Setup the listener to test
err := listener.Start(acc)
require.NoError(t, err)
client := listener.client.(*KNXDummyInterface)

testMessages := []TestMessage{
{"1/1/1", "1.001", true},
{"1/1/1", "1.001", false},
{"1/1/2", "1.001", false},
{"1/1/2", "1.001", true},
}

for _, testcase := range testMessages {
event := ProduceKnxEvent(t, testcase.address, testcase.dpt, testcase.value)
client.Send(*event)
}

// Give the accumulator some time to collect the data
acc.Wait(2)

// Stop the listener
listener.Stop()

// Check if we got what we expected
require.Len(t, acc.Metrics, 2)

assert.Equal(t, "temperature", acc.Metrics[0].Measurement)
assert.Equal(t, "1/1/1", acc.Metrics[0].Tags["groupaddress"])
assert.Len(t, acc.Metrics[0].Fields, 1)
assert.Equal(t, true, acc.Metrics[0].Fields["value"])

assert.Equal(t, "temperature", acc.Metrics[1].Measurement)
assert.Equal(t, "1/1/1", acc.Metrics[1].Tags["groupaddress"])
assert.Len(t, acc.Metrics[1].Fields, 1)
assert.Equal(t, false, acc.Metrics[1].Fields["value"])
}

0 comments on commit 6056217

Please sign in to comment.