136 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			Go
		
	
	
	
			
		
		
	
	
			136 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			Go
		
	
	
	
| 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{
 | |
| 				{"set": "myset", "rule": "1.2.3.4"},
 | |
| 				{"set": "myset", "rule": "3.4.5.6"},
 | |
| 			},
 | |
| 			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{
 | |
| 				{"set": "myset", "rule": "1.2.3.4"},
 | |
| 				{"set": "myset", "rule": "3.4.5.6"},
 | |
| 			},
 | |
| 			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)
 | |
| 	}
 | |
| }
 |