2018-01-31 20:25:27 +00:00
|
|
|
package ipset
|
|
|
|
|
|
|
|
import (
|
|
|
|
"bytes"
|
|
|
|
"errors"
|
|
|
|
"fmt"
|
|
|
|
"reflect"
|
|
|
|
"testing"
|
|
|
|
|
|
|
|
"github.com/influxdata/telegraf/internal"
|
|
|
|
"github.com/influxdata/telegraf/testutil"
|
|
|
|
)
|
|
|
|
|
|
|
|
func TestIpset(t *testing.T) {
|
|
|
|
tests := []struct {
|
|
|
|
name string
|
|
|
|
value string
|
|
|
|
tags []map[string]string
|
|
|
|
fields [][]map[string]interface{}
|
|
|
|
err error
|
|
|
|
}{
|
|
|
|
{
|
|
|
|
name: "0 sets, no results",
|
|
|
|
value: "",
|
|
|
|
},
|
|
|
|
{
|
|
|
|
name: "Empty sets, no values",
|
|
|
|
value: `create myset hash:net family inet hashsize 1024 maxelem 65536
|
|
|
|
create myset2 hash:net,port family inet hashsize 16384 maxelem 524288 counters comment
|
|
|
|
`,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
name: "Non-empty sets, but no counters, no results",
|
|
|
|
value: `create myset hash:net family inet hashsize 1024 maxelem 65536
|
|
|
|
add myset 1.2.3.4
|
|
|
|
`,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
name: "Line with data but not enough fields",
|
|
|
|
value: `create hash:net family inet hashsize 1024 maxelem 65536 counters
|
|
|
|
add myset 4.5.6.7 packets 123 bytes
|
|
|
|
`,
|
|
|
|
err: fmt.Errorf("Error parsing line (expected at least 7 fields): \t\t\t\tadd myset 4.5.6.7 packets 123 bytes"),
|
|
|
|
},
|
|
|
|
{
|
|
|
|
name: "Non-empty sets, counters, no comment",
|
|
|
|
value: `create myset hash:net family inet hashsize 1024 maxelem 65536 counters
|
|
|
|
add myset 1.2.3.4 packets 1328 bytes 79680
|
|
|
|
add myset 2.3.4.5 packets 0 bytes 0
|
|
|
|
add myset 3.4.5.6 packets 3 bytes 222
|
|
|
|
`,
|
|
|
|
tags: []map[string]string{
|
2018-10-19 20:32:54 +00:00
|
|
|
{"set": "myset", "rule": "1.2.3.4"},
|
|
|
|
{"set": "myset", "rule": "3.4.5.6"},
|
2018-01-31 20:25:27 +00:00
|
|
|
},
|
|
|
|
fields: [][]map[string]interface{}{
|
|
|
|
{map[string]interface{}{"packets_total": uint64(1328), "bytes_total": uint64(79680)}},
|
|
|
|
{map[string]interface{}{"packets_total": uint64(3), "bytes_total": uint64(222)}},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
name: "Sets with counters and comment",
|
|
|
|
value: `create myset hash:net family inet hashsize 1024 maxelem 65536 counters comment
|
|
|
|
add myset 1.2.3.4 packets 1328 bytes 79680 comment "first IP"
|
|
|
|
add myset 2.3.4.5 packets 0 bytes 0 comment "2nd IP"
|
|
|
|
add myset 3.4.5.6 packets 3 bytes 222 "3rd IP"
|
|
|
|
`,
|
|
|
|
tags: []map[string]string{
|
2018-10-19 20:32:54 +00:00
|
|
|
{"set": "myset", "rule": "1.2.3.4"},
|
|
|
|
{"set": "myset", "rule": "3.4.5.6"},
|
2018-01-31 20:25:27 +00:00
|
|
|
},
|
|
|
|
fields: [][]map[string]interface{}{
|
|
|
|
{map[string]interface{}{"packets_total": uint64(1328), "bytes_total": uint64(79680)}},
|
|
|
|
{map[string]interface{}{"packets_total": uint64(3), "bytes_total": uint64(222)}},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
}
|
|
|
|
|
|
|
|
for i, tt := range tests {
|
|
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
|
|
i++
|
|
|
|
ips := &Ipset{
|
|
|
|
lister: func(Timeout internal.Duration, UseSudo bool) (*bytes.Buffer, error) {
|
|
|
|
return bytes.NewBufferString(tt.value), nil
|
|
|
|
},
|
|
|
|
}
|
|
|
|
acc := new(testutil.Accumulator)
|
|
|
|
err := acc.GatherError(ips.Gather)
|
|
|
|
if !reflect.DeepEqual(tt.err, err) {
|
|
|
|
t.Errorf("%d: expected error '%#v' got '%#v'", i, tt.err, err)
|
|
|
|
}
|
|
|
|
if len(tt.tags) == 0 {
|
|
|
|
n := acc.NFields()
|
|
|
|
if n != 0 {
|
|
|
|
t.Errorf("%d: expected 0 values got %d", i, n)
|
|
|
|
}
|
|
|
|
return
|
|
|
|
}
|
|
|
|
n := 0
|
|
|
|
for j, tags := range tt.tags {
|
|
|
|
for k, fields := range tt.fields[j] {
|
|
|
|
if len(acc.Metrics) < n+1 {
|
|
|
|
t.Errorf("%d: expected at least %d values got %d", i, n+1, len(acc.Metrics))
|
|
|
|
break
|
|
|
|
}
|
|
|
|
m := acc.Metrics[n]
|
|
|
|
if !reflect.DeepEqual(m.Measurement, measurement) {
|
|
|
|
t.Errorf("%d %d %d: expected measurement '%#v' got '%#v'\n", i, j, k, measurement, m.Measurement)
|
|
|
|
}
|
|
|
|
if !reflect.DeepEqual(m.Tags, tags) {
|
|
|
|
t.Errorf("%d %d %d: expected tags\n%#v got\n%#v\n", i, j, k, tags, m.Tags)
|
|
|
|
}
|
|
|
|
if !reflect.DeepEqual(m.Fields, fields) {
|
|
|
|
t.Errorf("%d %d %d: expected fields\n%#v got\n%#v\n", i, j, k, fields, m.Fields)
|
|
|
|
}
|
|
|
|
n++
|
|
|
|
}
|
|
|
|
}
|
|
|
|
})
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestIpset_Gather_listerError(t *testing.T) {
|
|
|
|
errFoo := errors.New("error foobar")
|
|
|
|
ips := &Ipset{
|
|
|
|
lister: func(Timeout internal.Duration, UseSudo bool) (*bytes.Buffer, error) {
|
|
|
|
return new(bytes.Buffer), errFoo
|
|
|
|
},
|
|
|
|
}
|
|
|
|
acc := new(testutil.Accumulator)
|
|
|
|
err := acc.GatherError(ips.Gather)
|
|
|
|
if !reflect.DeepEqual(err, errFoo) {
|
|
|
|
t.Errorf("Expected error %#v got\n%#v\n", errFoo, err)
|
|
|
|
}
|
|
|
|
}
|