File: parse_test.go

package info (click to toggle)
golang-collectd 0.3.0%2Bgit20181025.f80706d-1
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 312 kB
  • sloc: makefile: 3
file content (244 lines) | stat: -rw-r--r-- 18,712 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
package network // import "collectd.org/network"

import (
	"bytes"
	"context"
	"encoding/hex"
	"fmt"
	"io/ioutil"
	"reflect"
	"strings"
	"testing"

	"collectd.org/api"
)

func TestParse(t *testing.T) {
	for i, raw := range rawPacketData {
		vl, err := Parse(raw, ParseOpts{})
		if err != nil {
			t.Errorf("%d: got (%v, %v), want nil", i, vl, err)
		}
	}
}

func BenchmarkPackets(b *testing.B) {
	for i := 0; i < b.N; i++ {
		_, err := Parse(rawPacketData[i%len(rawPacketData)], ParseOpts{})
		if err != nil {
			b.Error(err)
		}
	}
}

// Collectd packets captured using Wireshark
var rawPacketData = func() [][]byte {
	strs := []string{
		"0000000e6c6f63616c686f7374000008000c1513676ac3a6e0970009000c00000002800000000002000973776170000004000973776170000005000966726565000006000f00010100000080ff610f420008000c1513676ac3a8fc120004000c737761705f696f0000050007696e000006000f00010200000000000000000008000c1513676ac3a9077d000500086f7574000006000f00010200000000000000000008000c1513676ac3bd2a8c0002000e696e74657266616365000003000965746830000004000e69665f6f63746574730000050005000006001800020202000000000000000000000000000000000008000c1513676ac3bd5a970004000e69665f6572726f7273000006001800020202000000000000000000000000000000000008000c1513676ac3bd7fea000300076c6f000004000e69665f6f6374657473000006001800020202000000000009e79c000000000009e79c0008000c1513676ac3bdaae60003000a776c616e30000006001800020202000000001009fa5400000000011cf6670008000c1513676ac3bdb0e00004000e69665f6572726f7273000006001800020202000000000000000000000000000000000008000c1513676ac3bd3d6d0003000965746830000004000f69665f7061636b657473000006001800020202000000000000000000000000000000000008000c1513676ac3bdae290003000a776c616e300000060018000202020000000000032f8f00000000000205e50008000c1513676ac3bdbb7b0003000c646f636b657230000006001800020202000000000000000000000000000000000008000c1513676ac3bda0db000300076c6f000004000e69665f6572726f7273000006001800020202000000000000000000000000000000000008000c1513676ac3bdbde80003000c646f636b657230000006001800020202000000000000000000000000000000000008000c1513676ac3bd8d8e000300076c6f000004000f69665f7061636b6574730000060018000202020000000000000c9c0000000000000c9c0008000c1513676ac3bdb90b0003000c646f636b657230000004000e69665f6f6374657473000006001800020202000000000000000000000000000000000008000c1513676ac469b10f0002000e70726f6365737365730000030005000004000d70735f7374617465000005000c7a6f6d62696573000006000f00010100000000000000000008000c1513676ac469a4a30005000d736c656570696e67000006000f0001010000000000006e400008000c1513676ac469c6320005000b706167696e67000006000f00010100000000000000000008000c1513676ac469f06e0005000c626c6f636b6564000006000f00010100000000000000000008000c1513676ac4698af40005000c72756e6e696e67000006000f00010100000000000000000008000c1513676ac469bbe10005000c73746f70706564000006000f00010100000000000000000008000c1513676ac46b8e710004000e666f726b5f726174650000050005000006000f0001020000000000001bcf0008000c1513676d437f1296000200086370750000030006300000040008637075000005000b73797374656d000006000f00010200000000000021870008000c1513676d437f36020005000969646c65000006000f000102000000000005847a0008000c1513676d437f979b0005000977616974000006000f00010200000000000005210008000c1513676d43802ff60005000c736f6674697271000006000f000102000000000000001f0008000c1513676d43803b3a0005000a737465616c000006000f0001020000000000000000",
		"0000000e6c6f63616c686f7374000008000c1513676d4380551f0009000c0000000280000000000200086370750000030006310000040008637075000005000975736572000006000f0001020000000000007cad0008000c1513676d43805dbe000500096e696365000006000f00010200000000000001de0008000c1513676d4380697d0005000b73797374656d000006000f0001020000000000001ce80008000c1513676d438072bd0005000969646c65000006000f000102000000000005931c0008000c1513676d43807c430005000977616974000006000f000102000000000000094b0008000c1513676d43808cee0005000c736f6674697271000006000f00010200000000000000120008000c1513676d4380843a0005000e696e74657272757074000006000f00010200000000000000000008000c1513676d438096230005000a737465616c000006000f00010200000000000000000008000c1513676d4380aa9c0003000632000005000975736572000006000f00010200000000000089580008000c1513676d4380b29f000500096e696365000006000f00010200000000000003610008000c1513676d4380c44c0005000969646c65000006000f000102000000000005873d0008000c1513676d4380bc0f0005000b73797374656d000006000f000102000000000000201d0008000c1513676d4380cea40005000977616974000006000f00010200000000000005810008000c1513676d4380d7370005000e696e74657272757074000006000f00010200000000000000000008000c1513676d4380ea830005000a737465616c000006000f00010200000000000000000008000c1513676d437eef62000300063000000500096e696365000006000f00010200000000000003920008000c1513676d4380e0260003000632000005000c736f6674697271000006000f00010200000000000000160008000c1513676d438101410003000633000005000975736572000006000f0001020000000000007d8a0008000c1513676d438109f5000500096e696365000006000f00010200000000000004350008000c1513676d4380244b0003000630000005000e696e74657272757074000006000f00010200000000000000000008000c1513676d438122070003000633000005000969646c65000006000f0001020000000000058eb60008000c1513676d43812e830005000977616974000006000f0001020000000000000ca80008000c1513676d438141480005000c736f6674697271000006000f000102000000000000001e0008000c1513676d43814a5d0005000a737465616c000006000f00010200000000000000000008000c1513676d4381149e0005000b73797374656d000006000f0001020000000000001b9a0008000c1513676d437ea8600003000630000005000975736572000006000f00010200000000000089a80008000c1513676d438138190003000633000005000e696e74657272757074000006000f00010200000000000000000008000c1513676d438a9ca00002000e696e74657266616365000003000965746830000004000e69665f6f63746574730000050005000006001800020202000000000000000000000000000000000008000c1513676d438aea760004000f69665f7061636b657473000006001800020202000000000000000000000000000000000008000c1513676d438b214d0004000e69665f6572726f727300000600180002020200000000000000000000000000000000",
		"0000000e6c6f63616c686f7374000008000c1513676d438aac590009000c00000002800000000002000764660000030009726f6f74000004000f64665f636f6d706c6578000005000966726565000006000f0001010000004c077e57420008000c1513676d438b6ada0005000d7265736572766564000006000f00010100000000338116420008000c1513676d438b7a170002000e696e7465726661636500000300076c6f000004000e69665f6f63746574730000050005000006001800020202000000000009ecf5000000000009ecf50008000c1513676d438b75780002000764660000030009726f6f74000004000f64665f636f6d706c6578000005000975736564000006000f000101000000e0a41b26420008000c1513676d438b8ed20002000e696e7465726661636500000300076c6f000004000e69665f6572726f72730000050005000006001800020202000000000000000000000000000000000008000c1513676d438b86bf0004000f69665f7061636b6574730000060018000202020000000000000c9d0000000000000c9d0008000c1513676d438bb3e60003000a776c616e300000060018000202020000000000032fab00000000000205ed0008000c1513676d438bd62e0003000c646f636b657230000004000e69665f6f6374657473000006001800020202000000000000000000000000000000000008000c1513676d438bbc8f0003000a776c616e30000004000e69665f6572726f7273000006001800020202000000000000000000000000000000000008000c1513676d438bdf030003000c646f636b657230000004000f69665f7061636b657473000006001800020202000000000000000000000000000000000008000c1513676d438baaf10003000a776c616e30000004000e69665f6f637465747300000600180002020200000000100a042300000000011cfa460008000c1513676d438c5f100002000764660000030009626f6f74000004000f64665f636f6d706c6578000005000966726565000006000f0001010000000010e198410008000c1513676d438c689c0005000d7265736572766564000006000f00010100000000804c68410008000c1513676d438c70ce0005000975736564000006000f0001010000000020ea9e410008000c1513676d438be7bc0002000e696e74657266616365000003000c646f636b657230000004000e69665f6572726f72730000050005000006001800020202000000000000000000000000000000000008000c1513676d43beca8c0002000c656e74726f70790000030005000004000c656e74726f7079000006000f0001010000000000088f400008000c1513676d43bf1d13000200096c6f616400000400096c6f6164000006002100030101019a9999999999a93f666666666666d63f5c8fc2f5285cdf3f0008000c1513676d43c02b85000200096469736b000003000873646100000400106469736b5f6f63746574730000060018000202020000000075887800000000005b6f3c000008000c1513676d43c06d1f0004000d6469736b5f6f7073000006001800020202000000000003cbbd000000000001c0510008000c1513676d43c08b6a0004000e6469736b5f74696d65000006001800020202000000000000003f00000000000001720008000c1513676d43c0a5fb000400106469736b5f6d65726765640000060018000202020000000000001285000000000000f8010008000c1513676d43c0c8b4000300097364613100000400106469736b5f6f63746574730000060018000202020000000001107c000000000000003c00",
		"0000000e6c6f63616c686f7374000008000c1513676d43c0d00a0009000c0000000280000000000200096469736b000003000973646131000004000d6469736b5f6f7073000006001800020202000000000000029b00000000000000080008000c1513676d43c0d7b20004000e6469736b5f74696d650000060018000202020000000000000004000000000000000f0008000c1513676d43c0df73000400106469736b5f6d65726765640000060018000202020000000000000fb400000000000000010008000c1513676d43c0f87c000300097364613200000400106469736b5f6f6374657473000006001800020202000000000000080000000000000000000008000c1513676d43c1003e0004000d6469736b5f6f7073000006001800020202000000000000000200000000000000000008000c1513676d43c107bf000400106469736b5f6d6572676564000006001800020202000000000000000000000000000000000008000c1513676d43c12fa40003000973646135000004000d6469736b5f6f7073000006001800020202000000000003c867000000000001aef20008000c1513676d43c13d5e000400106469736b5f6d657267656400000600180002020200000000000002d1000000000000f8000008000c1513676d43c136a90004000e6469736b5f74696d65000006001800020202000000000000003f000000000000011c0008000c1513676d43c1740500030009646d2d3000000400106469736b5f6f63746574730000060018000202020000000074596400000000005b6f00000008000c1513676d43c179c70004000d6469736b5f6f7073000006001800020202000000000003cae4000000000002b0f30008000c1513676d43c18abe000400106469736b5f6d6572676564000006001800020202000000000000000000000000000000000008000c1513676d43c181b90004000e6469736b5f74696d650000060018000202020000000000000040000000000000013e0008000c1513676d43c1a95e00030009646d2d3100000400106469736b5f6f637465747300000600180002020200000000000e000000000000000000000008000c1513676d43c1b7ea0004000e6469736b5f74696d65000006001800020202000000000000000200000000000000000008000c1513676d43c1b03e0004000d6469736b5f6f707300000600180002020200000000000000e000000000000000000008000c1513676d43c1c00d000400106469736b5f6d6572676564000006001800020202000000000000000000000000000000000008000c1513676d43c12818000300097364613500000400106469736b5f6f637465747300000600180002020200000000746c6400000000005b6f00000008000c1513676d43d320a80002000c62617474657279000003000630000004000b636861726765000006000f0001018fc2f5285c2f58400008000c1513676d43d36fd60004000c63757272656e74000006000f00010100000000000000800008000c1513676d43d3cdb60004000c766f6c74616765000006000f000101736891ed7cbf28400008000c1513676d43d59dd60002000869727100000300050000040008697271000005000630000006000f00010200000000000000110008000c1513676d43d5d2cf0005000631000006000f00010200000000000000100008000c1513676d43d5fe820005000638000006000f00010200000000000000010008000c1513676d43d635440005000639000006000f00010200000000000035210008000c1513676d43d66265000500073132000006000f0001020000000000000790",
		"0000000e6c6f63616c686f7374000008000c1513676d43d68e940009000c000000028000000000020008697271000004000869727100000500073136000006000f00010200000000000000210008000c1513676d43d69be20002000a7573657273000004000a75736572730000050005000006000f00010100000000000010400008000c1513676d43d6aa5d00020008697271000004000869727100000500073233000006000f00010200000000000000250008000c1513676d43d6c7dc000500073431000006000f000102000000000000ff7d0008000c1513676d43d6e23d000500073432000006000f00010200000000000008070008000c1513676d43d9aa3a000500073437000006000f0001020000000000079a260008000c1513676d43d9cca9000500073438000006000f00010200000000000000c70008000c1513676d43d9ea5d000500073439000006000f00010200000000000004c20008000c1513676d43da050e000500073530000006000f000102000000000000001c0008000c1513676d43da1efa000500084e4d49000006000f00010200000000000000000008000c1513676d43da3c82000500084c4f43000006000f000102000000000018d3080008000c1513676d43da544e00050008535055000006000f00010200000000000000000008000c1513676d43da6cca00050008504d49000006000f00010200000000000000000008000c1513676d43da885400050008495749000006000f000102000000000000a9da0008000c1513676d43daa23a00050008525452000006000f00010200000000000000030008000c1513676d43dabaed00050008524553000006000f00010200000000000ac8360008000c1513676d43dad4150005000843414c000006000f000102000000000000191f0008000c1513676d43daeef300050008544c42000006000f000102000000000003dbdc0008000c1513676d43db11410005000854524d000006000f00010200000000000000000008000c1513676d43db292c00050008544852000006000f00010200000000000000000008000c1513676d43db411d000500084d4345000006000f00010200000000000000000008000c1513676d43db5b59000500084d4350000006000f000102000000000000003c0008000c1513676d43db680100050008455252000006000f00010200000000000000000008000c1513676d43db758a000500084d4953000006000f00010200000000000000000008000c1513676d43dd2e800002000b6d656d6f7279000004000b6d656d6f7279000005000975736564000006000f00010100000000febbe0410008000c1513676d43dd3f4b0005000d6275666665726564000006000f0001010000000070fbc8410008000c1513676d43dd48700005000b636163686564000006000f00010100000000c008df410008000c1513676d43dd51c60005000966726565000006000f00010100000080481d05420008000c1513676d43dec7e30002000973776170000004000973776170000005000975736564000006000f00010100000000000000000008000c1513676d43ded4490005000966726565000006000f00010100000080ff610f420008000c1513676d43dedcfd0005000b636163686564000006000f00010100000000000000000008000c1513676d43d715e300020008697271000004000869727100000500073434000006000f0001020000000000031b610008000c1513676d43d73116000500073435000006000f00010200000000000000180008000c1513676d43ee00150002000973776170000004000c737761705f696f0000050007696e000006000f0001020000000000000000",
	}
	var rawData [][]byte
	for _, str := range strs {
		buf, err := hex.DecodeString(str)
		if err != nil {
			panic(err)
		}
		rawData = append(rawData, buf)
	}
	return rawData
}()

func TestParseInt(t *testing.T) {
	want := uint64(8231)
	got, err := parseInt([]byte{0, 0, 0, 0, 0, 0, 0x20, 0x27})
	if err != nil {
		t.Error(err)
	} else if got != want {
		t.Errorf("got %d, want %d", got, want)
	}

	got, err = parseInt([]byte{0, 0, 0, 0, 0, 0x20, 0x27})
	if err == nil {
		t.Errorf("got (%d, nil), want (0, ErrorInvalid)", got)
	}

	got, err = parseInt([]byte{0, 0, 0, 0, 0, 0, 0, 0x20, 0x27})
	if err == nil {
		t.Errorf("got (%d, nil), want (0, ErrorInvalid)", got)
	}
}

func TestParseString(t *testing.T) {
	want := "test"
	got, err := parseString([]byte{'t', 'e', 's', 't', 0})
	if err != nil {
		t.Error(err)
	} else if got != want {
		t.Errorf("got %q, want %q", got, want)
	}

	got, err = parseString([]byte{'t', 'e', 's', 't'})
	if err == nil {
		t.Errorf("got (%q, nil), want (\"\", ErrorInvalid)", got)
	}

}

func TestRoundtrip(t *testing.T) {
	for _, file := range []string{"testdata/packet1.bin", "testdata/packet2.bin"} {
		testRoundTrip(t, file)
	}
}

func testRoundTrip(t *testing.T, file string) {
	ctx := context.Background()

	data, err := ioutil.ReadFile(file)
	if err != nil {
		panic(err)
	}

	vl, err := Parse(data, ParseOpts{})
	if err != nil {
		if vl != nil {
			panic("vl != nil on error")
		}
	}

	b := NewBuffer(0)
	if err := b.Write(ctx, vl[0]); err != nil {
		panic(err)
	}

	redone := b.buffer.Bytes()
	if bytes.Compare(redone, data) != 0 {
		panic(fmt.Sprintf("Failed to re-encode parsed packet: re-encoded [%v] original [%v]. Parsed [%v]", redone, data, vl[0].String()))
	}
}

func TestOneByte(t *testing.T) {
	_, err := Parse([]byte{0}, ParseOpts{})
	if err == nil {
		t.Errorf("Parsing byte stream containing single zero byte should return an error")
	}
}

func TestParseOpts_TypesDB(t *testing.T) {
	ctx := context.Background()

	cases := []struct {
		Type        string
		Values      []api.Value
		WantDSNames []string
		WantValues  []api.Value
		WantErr     bool
	}{
		{ // DERIVE, successful
			Type:        "derive",
			Values:      []api.Value{api.Derive(42)},
			WantValues:  []api.Value{api.Derive(42)},
			WantDSNames: []string{"value"},
		},
		{ // convert GAUGE to DERIVE
			Type:        "derive",
			Values:      []api.Value{api.Gauge(42.0)},
			WantValues:  []api.Value{api.Derive(42)},
			WantDSNames: []string{"value"},
		},
		{ // GAUGE, successful
			Type:        "gauge",
			Values:      []api.Value{api.Gauge(42.0)},
			WantValues:  []api.Value{api.Gauge(42.0)},
			WantDSNames: []string{"value"},
		},
		{ // convert DERIVE to GAUGE
			Type:        "gauge",
			Values:      []api.Value{api.Derive(42)},
			WantValues:  []api.Value{api.Gauge(42.0)},
			WantDSNames: []string{"value"},
		},
		{ // two data sources
			Type:        "if_octets",
			Values:      []api.Value{api.Derive(1), api.Derive(2)},
			WantValues:  []api.Value{api.Derive(1), api.Derive(2)},
			WantDSNames: []string{"rx", "tx"},
		},
		{ // convert to DERIVE
			Type:        "if_octets",
			Values:      []api.Value{api.Gauge(3.0), api.Gauge(4.0)},
			WantValues:  []api.Value{api.Derive(3), api.Derive(4)},
			WantDSNames: []string{"rx", "tx"},
		},
		{ // too few values
			Type:    "if_octets",
			Values:  []api.Value{api.Derive(42)},
			WantErr: true,
		},
		{ // too many values
			Type:    "derive",
			Values:  []api.Value{api.Derive(1), api.Derive(2)},
			WantErr: true,
		},
	}

	typesDB, err := api.NewTypesDB(strings.NewReader(`
derive		value:DERIVE:0:U
gauge		value:GAUGE:0:U
if_octets	rx:DERIVE:0:U, tx:DERIVE:0:U
`))
	if err != nil {
		t.Fatalf("NewTypesDB failed: %v", err)
	}

	for _, c := range cases {
		netBuf := NewBuffer(0)
		inVL := &api.ValueList{
			Identifier: api.Identifier{
				Host:   "example.com",
				Plugin: "golang",
				Type:   c.Type,
			},
			Values: c.Values,
		}

		if err := netBuf.Write(ctx, inVL); err != nil {
			t.Errorf("Write(%#v): %v", inVL, err)
			continue
		}

		wireBuf, err := netBuf.Bytes()
		if err != nil {
			t.Errorf("Buffer.Bytes(): %v", err)
			continue
		}

		vls, err := Parse(wireBuf, ParseOpts{TypesDB: typesDB})
		if err != nil {
			t.Errorf("Parse(%#v) = (%v, %v), want (%v, %v)", c, vls, err, "[]*api.ValueList", nil)
			continue
		}
		if c.WantErr {
			if len(vls) != 0 {
				t.Errorf("Parse(%#v) = (%v, %v), want (%v, %v)", c, vls, err, nil, nil)
			}
			continue
		}

		if len(vls) != 1 {
			t.Errorf("len(vls) = %d, want %d", len(vls), 1)
			continue
		}
		vl := vls[0]

		if !reflect.DeepEqual(vl.Values, c.WantValues) {
			t.Errorf("vl.Values = %#v, want %#v", vl.Values, c.Values)
		}

		if !reflect.DeepEqual(vl.DSNames, c.WantDSNames) {
			t.Errorf("vl.DSNames = %v, want %v", vl.DSNames, c.WantDSNames)
		}
	}
}