Merge pull request #2512 from Stackdriver/pri
[collectd.git] / src / libcollectdclient / network_parse_test.c
1 /**
2  * Copyright 2017 Florian Forster
3  *
4  * Permission is hereby granted, free of charge, to any person obtaining a copy
5  * of this software and associated documentation files (the "Software"), to deal
6  * in the Software without restriction, including without limitation the rights
7  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8  * copies of the Software, and to permit persons to whom the Software is
9  * furnished to do so, subject to the following conditions:
10  *
11  * The above copyright notice and this permission notice shall be included in
12  * all copies or substantial portions of the Software.
13  *
14  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
20  * SOFTWARE.
21  *
22  * Authors:
23  *   Florian octo Forster <octo at collectd.org>
24  **/
25
26 #include "collectd/lcc_features.h"
27
28 #include "collectd/network_buffer.h" /* for LCC_NETWORK_BUFFER_SIZE_DEFAULT */
29
30 #include <assert.h>
31
32 #include "network_parse.c" /* sic */
33
34 char *raw_packet_data[] = {
35     "0000000e6c6f63616c686f7374000008000c1513676ac3a6e0970009000c00000002800000"
36     "000002000973776170000004000973776170000005000966726565000006000f0001010000"
37     "0080ff610f420008000c1513676ac3a8fc120004000c737761705f696f0000050007696e00"
38     "0006000f00010200000000000000000008000c1513676ac3a9077d000500086f7574000006"
39     "000f00010200000000000000000008000c1513676ac3bd2a8c0002000e696e746572666163"
40     "65000003000965746830000004000e69665f6f637465747300000500050000060018000202"
41     "02000000000000000000000000000000000008000c1513676ac3bd5a970004000e69665f65"
42     "72726f7273000006001800020202000000000000000000000000000000000008000c151367"
43     "6ac3bd7fea000300076c6f000004000e69665f6f6374657473000006001800020202000000"
44     "000009e79c000000000009e79c0008000c1513676ac3bdaae60003000a776c616e30000006"
45     "001800020202000000001009fa5400000000011cf6670008000c1513676ac3bdb0e0000400"
46     "0e69665f6572726f7273000006001800020202000000000000000000000000000000000008"
47     "000c1513676ac3bd3d6d0003000965746830000004000f69665f7061636b65747300000600"
48     "1800020202000000000000000000000000000000000008000c1513676ac3bdae290003000a"
49     "776c616e300000060018000202020000000000032f8f00000000000205e50008000c151367"
50     "6ac3bdbb7b0003000c646f636b657230000006001800020202000000000000000000000000"
51     "000000000008000c1513676ac3bda0db000300076c6f000004000e69665f6572726f727300"
52     "0006001800020202000000000000000000000000000000000008000c1513676ac3bdbde800"
53     "03000c646f636b657230000006001800020202000000000000000000000000000000000008"
54     "000c1513676ac3bd8d8e000300076c6f000004000f69665f7061636b657473000006001800"
55     "0202020000000000000c9c0000000000000c9c0008000c1513676ac3bdb90b0003000c646f"
56     "636b657230000004000e69665f6f6374657473000006001800020202000000000000000000"
57     "000000000000000008000c1513676ac469b10f0002000e70726f6365737365730000030005"
58     "000004000d70735f7374617465000005000c7a6f6d62696573000006000f00010100000000"
59     "000000000008000c1513676ac469a4a30005000d736c656570696e67000006000f00010100"
60     "00000000006e400008000c1513676ac469c6320005000b706167696e67000006000f000101"
61     "00000000000000000008000c1513676ac469f06e0005000c626c6f636b6564000006000f00"
62     "010100000000000000000008000c1513676ac4698af40005000c72756e6e696e6700000600"
63     "0f00010100000000000000000008000c1513676ac469bbe10005000c73746f707065640000"
64     "06000f00010100000000000000000008000c1513676ac46b8e710004000e666f726b5f7261"
65     "74650000050005000006000f0001020000000000001bcf0008000c1513676d437f12960002"
66     "00086370750000030006300000040008637075000005000b73797374656d000006000f0001"
67     "0200000000000021870008000c1513676d437f36020005000969646c65000006000f000102"
68     "000000000005847a0008000c1513676d437f979b0005000977616974000006000f00010200"
69     "000000000005210008000c1513676d43802ff60005000c736f6674697271000006000f0001"
70     "02000000000000001f0008000c1513676d43803b3a0005000a737465616c000006000f0001"
71     "020000000000000000",
72     "0000000e6c6f63616c686f7374000008000c1513676d4380551f0009000c00000002800000"
73     "00000200086370750000030006310000040008637075000005000975736572000006000f00"
74     "01020000000000007cad0008000c1513676d43805dbe000500096e696365000006000f0001"
75     "0200000000000001de0008000c1513676d4380697d0005000b73797374656d000006000f00"
76     "01020000000000001ce80008000c1513676d438072bd0005000969646c65000006000f0001"
77     "02000000000005931c0008000c1513676d43807c430005000977616974000006000f000102"
78     "000000000000094b0008000c1513676d43808cee0005000c736f6674697271000006000f00"
79     "010200000000000000120008000c1513676d4380843a0005000e696e746572727570740000"
80     "06000f00010200000000000000000008000c1513676d438096230005000a737465616c0000"
81     "06000f00010200000000000000000008000c1513676d4380aa9c0003000632000005000975"
82     "736572000006000f00010200000000000089580008000c1513676d4380b29f000500096e69"
83     "6365000006000f00010200000000000003610008000c1513676d4380c44c0005000969646c"
84     "65000006000f000102000000000005873d0008000c1513676d4380bc0f0005000b73797374"
85     "656d000006000f000102000000000000201d0008000c1513676d4380cea400050009776169"
86     "74000006000f00010200000000000005810008000c1513676d4380d7370005000e696e7465"
87     "7272757074000006000f00010200000000000000000008000c1513676d4380ea830005000a"
88     "737465616c000006000f00010200000000000000000008000c1513676d437eef6200030006"
89     "3000000500096e696365000006000f00010200000000000003920008000c1513676d4380e0"
90     "260003000632000005000c736f6674697271000006000f0001020000000000000016000800"
91     "0c1513676d438101410003000633000005000975736572000006000f000102000000000000"
92     "7d8a0008000c1513676d438109f5000500096e696365000006000f00010200000000000004"
93     "350008000c1513676d4380244b0003000630000005000e696e74657272757074000006000f"
94     "00010200000000000000000008000c1513676d438122070003000633000005000969646c65"
95     "000006000f0001020000000000058eb60008000c1513676d43812e83000500097761697400"
96     "0006000f0001020000000000000ca80008000c1513676d438141480005000c736f66746972"
97     "71000006000f000102000000000000001e0008000c1513676d43814a5d0005000a73746561"
98     "6c000006000f00010200000000000000000008000c1513676d4381149e0005000b73797374"
99     "656d000006000f0001020000000000001b9a0008000c1513676d437ea86000030006300000"
100     "05000975736572000006000f00010200000000000089a80008000c1513676d438138190003"
101     "000633000005000e696e74657272757074000006000f00010200000000000000000008000c"
102     "1513676d438a9ca00002000e696e74657266616365000003000965746830000004000e6966"
103     "5f6f6374657473000005000500000600180002020200000000000000000000000000000000"
104     "0008000c1513676d438aea760004000f69665f7061636b6574730000060018000202020000"
105     "00000000000000000000000000000008000c1513676d438b214d0004000e69665f6572726f"
106     "727300000600180002020200000000000000000000000000000000",
107     "0000000e6c6f63616c686f7374000008000c1513676d438aac590009000c00000002800000"
108     "000002000764660000030009726f6f74000004000f64665f636f6d706c6578000005000966"
109     "726565000006000f0001010000004c077e57420008000c1513676d438b6ada0005000d7265"
110     "736572766564000006000f00010100000000338116420008000c1513676d438b7a17000200"
111     "0e696e7465726661636500000300076c6f000004000e69665f6f6374657473000005000500"
112     "0006001800020202000000000009ecf5000000000009ecf50008000c1513676d438b757800"
113     "02000764660000030009726f6f74000004000f64665f636f6d706c65780000050009757365"
114     "64000006000f000101000000e0a41b26420008000c1513676d438b8ed20002000e696e7465"
115     "726661636500000300076c6f000004000e69665f6572726f72730000050005000006001800"
116     "020202000000000000000000000000000000000008000c1513676d438b86bf0004000f6966"
117     "5f7061636b6574730000060018000202020000000000000c9d0000000000000c9d0008000c"
118     "1513676d438bb3e60003000a776c616e300000060018000202020000000000032fab000000"
119     "00000205ed0008000c1513676d438bd62e0003000c646f636b657230000004000e69665f6f"
120     "6374657473000006001800020202000000000000000000000000000000000008000c151367"
121     "6d438bbc8f0003000a776c616e30000004000e69665f6572726f7273000006001800020202"
122     "000000000000000000000000000000000008000c1513676d438bdf030003000c646f636b65"
123     "7230000004000f69665f7061636b6574730000060018000202020000000000000000000000"
124     "00000000000008000c1513676d438baaf10003000a776c616e30000004000e69665f6f6374"
125     "65747300000600180002020200000000100a042300000000011cfa460008000c1513676d43"
126     "8c5f100002000764660000030009626f6f74000004000f64665f636f6d706c657800000500"
127     "0966726565000006000f0001010000000010e198410008000c1513676d438c689c0005000d"
128     "7265736572766564000006000f00010100000000804c68410008000c1513676d438c70ce00"
129     "05000975736564000006000f0001010000000020ea9e410008000c1513676d438be7bc0002"
130     "000e696e74657266616365000003000c646f636b657230000004000e69665f6572726f7273"
131     "0000050005000006001800020202000000000000000000000000000000000008000c151367"
132     "6d43beca8c0002000c656e74726f70790000030005000004000c656e74726f707900000600"
133     "0f0001010000000000088f400008000c1513676d43bf1d13000200096c6f61640000040009"
134     "6c6f6164000006002100030101019a9999999999a93f666666666666d63f5c8fc2f5285cdf"
135     "3f0008000c1513676d43c02b85000200096469736b00000300087364610000040010646973"
136     "6b5f6f63746574730000060018000202020000000075887800000000005b6f3c000008000c"
137     "1513676d43c06d1f0004000d6469736b5f6f7073000006001800020202000000000003cbbd"
138     "000000000001c0510008000c1513676d43c08b6a0004000e6469736b5f74696d6500000600"
139     "1800020202000000000000003f00000000000001720008000c1513676d43c0a5fb00040010"
140     "6469736b5f6d65726765640000060018000202020000000000001285000000000000f80100"
141     "08000c1513676d43c0c8b4000300097364613100000400106469736b5f6f63746574730000"
142     "060018000202020000000001107c000000000000003c00",
143     "0000000e6c6f63616c686f7374000008000c1513676d43c0d00a0009000c00000002800000"
144     "00000200096469736b000003000973646131000004000d6469736b5f6f7073000006001800"
145     "020202000000000000029b00000000000000080008000c1513676d43c0d7b20004000e6469"
146     "736b5f74696d650000060018000202020000000000000004000000000000000f0008000c15"
147     "13676d43c0df73000400106469736b5f6d6572676564000006001800020202000000000000"
148     "0fb400000000000000010008000c1513676d43c0f87c000300097364613200000400106469"
149     "736b5f6f637465747300000600180002020200000000000008000000000000000000000800"
150     "0c1513676d43c1003e0004000d6469736b5f6f707300000600180002020200000000000000"
151     "0200000000000000000008000c1513676d43c107bf000400106469736b5f6d657267656400"
152     "0006001800020202000000000000000000000000000000000008000c1513676d43c12fa400"
153     "03000973646135000004000d6469736b5f6f7073000006001800020202000000000003c867"
154     "000000000001aef20008000c1513676d43c13d5e000400106469736b5f6d65726765640000"
155     "0600180002020200000000000002d1000000000000f8000008000c1513676d43c136a90004"
156     "000e6469736b5f74696d65000006001800020202000000000000003f000000000000011c00"
157     "08000c1513676d43c1740500030009646d2d3000000400106469736b5f6f63746574730000"
158     "060018000202020000000074596400000000005b6f00000008000c1513676d43c179c70004"
159     "000d6469736b5f6f7073000006001800020202000000000003cae4000000000002b0f30008"
160     "000c1513676d43c18abe000400106469736b5f6d6572676564000006001800020202000000"
161     "000000000000000000000000000008000c1513676d43c181b90004000e6469736b5f74696d"
162     "650000060018000202020000000000000040000000000000013e0008000c1513676d43c1a9"
163     "5e00030009646d2d3100000400106469736b5f6f6374657473000006001800020202000000"
164     "00000e000000000000000000000008000c1513676d43c1b7ea0004000e6469736b5f74696d"
165     "65000006001800020202000000000000000200000000000000000008000c1513676d43c1b0"
166     "3e0004000d6469736b5f6f707300000600180002020200000000000000e000000000000000"
167     "000008000c1513676d43c1c00d000400106469736b5f6d6572676564000006001800020202"
168     "000000000000000000000000000000000008000c1513676d43c12818000300097364613500"
169     "000400106469736b5f6f637465747300000600180002020200000000746c6400000000005b"
170     "6f00000008000c1513676d43d320a80002000c62617474657279000003000630000004000b"
171     "636861726765000006000f0001018fc2f5285c2f58400008000c1513676d43d36fd6000400"
172     "0c63757272656e74000006000f00010100000000000000800008000c1513676d43d3cdb600"
173     "04000c766f6c74616765000006000f000101736891ed7cbf28400008000c1513676d43d59d"
174     "d60002000869727100000300050000040008697271000005000630000006000f0001020000"
175     "0000000000110008000c1513676d43d5d2cf0005000631000006000f000102000000000000"
176     "00100008000c1513676d43d5fe820005000638000006000f00010200000000000000010008"
177     "000c1513676d43d635440005000639000006000f00010200000000000035210008000c1513"
178     "676d43d66265000500073132000006000f0001020000000000000790",
179     "0000000e6c6f63616c686f7374000008000c1513676d43d68e940009000c00000002800000"
180     "0000020008697271000004000869727100000500073136000006000f000102000000000000"
181     "00210008000c1513676d43d69be20002000a7573657273000004000a757365727300000500"
182     "05000006000f00010100000000000010400008000c1513676d43d6aa5d0002000869727100"
183     "0004000869727100000500073233000006000f00010200000000000000250008000c151367"
184     "6d43d6c7dc000500073431000006000f000102000000000000ff7d0008000c1513676d43d6"
185     "e23d000500073432000006000f00010200000000000008070008000c1513676d43d9aa3a00"
186     "0500073437000006000f0001020000000000079a260008000c1513676d43d9cca900050007"
187     "3438000006000f00010200000000000000c70008000c1513676d43d9ea5d00050007343900"
188     "0006000f00010200000000000004c20008000c1513676d43da050e00050007353000000600"
189     "0f000102000000000000001c0008000c1513676d43da1efa000500084e4d49000006000f00"
190     "010200000000000000000008000c1513676d43da3c82000500084c4f43000006000f000102"
191     "000000000018d3080008000c1513676d43da544e00050008535055000006000f0001020000"
192     "0000000000000008000c1513676d43da6cca00050008504d49000006000f00010200000000"
193     "000000000008000c1513676d43da885400050008495749000006000f000102000000000000"
194     "a9da0008000c1513676d43daa23a00050008525452000006000f0001020000000000000003"
195     "0008000c1513676d43dabaed00050008524553000006000f00010200000000000ac8360008"
196     "000c1513676d43dad4150005000843414c000006000f000102000000000000191f0008000c"
197     "1513676d43daeef300050008544c42000006000f000102000000000003dbdc0008000c1513"
198     "676d43db11410005000854524d000006000f00010200000000000000000008000c1513676d"
199     "43db292c00050008544852000006000f00010200000000000000000008000c1513676d43db"
200     "411d000500084d4345000006000f00010200000000000000000008000c1513676d43db5b59"
201     "000500084d4350000006000f000102000000000000003c0008000c1513676d43db68010005"
202     "0008455252000006000f00010200000000000000000008000c1513676d43db758a00050008"
203     "4d4953000006000f00010200000000000000000008000c1513676d43dd2e800002000b6d65"
204     "6d6f7279000004000b6d656d6f7279000005000975736564000006000f00010100000000fe"
205     "bbe0410008000c1513676d43dd3f4b0005000d6275666665726564000006000f0001010000"
206     "000070fbc8410008000c1513676d43dd48700005000b636163686564000006000f00010100"
207     "000000c008df410008000c1513676d43dd51c60005000966726565000006000f0001010000"
208     "0080481d05420008000c1513676d43dec7e300020009737761700000040009737761700000"
209     "05000975736564000006000f00010100000000000000000008000c1513676d43ded4490005"
210     "000966726565000006000f00010100000080ff610f420008000c1513676d43dedcfd000500"
211     "0b636163686564000006000f00010100000000000000000008000c1513676d43d715e30002"
212     "0008697271000004000869727100000500073434000006000f0001020000000000031b6100"
213     "08000c1513676d43d73116000500073435000006000f00010200000000000000180008000c"
214     "1513676d43ee00150002000973776170000004000c737761705f696f0000050007696e0000"
215     "06000f0001020000000000000000",
216 };
217
218 static int decode_string(char const *in, uint8_t *out, size_t *out_size) {
219   size_t in_size = strlen(in);
220   if (*out_size < (in_size / 2))
221     return -1;
222   *out_size = in_size / 2;
223
224   for (size_t i = 0; i < *out_size; i++) {
225     char tmp[] = {in[2 * i], in[2 * i + 1], 0};
226     out[i] = (uint8_t)strtoul(tmp, NULL, 16);
227   }
228
229   return 0;
230 }
231
232 static int nop_writer(lcc_value_list_t const *vl) {
233   if (!strlen(vl->identifier.host) || !strlen(vl->identifier.plugin) ||
234       !strlen(vl->identifier.type)) {
235     return EINVAL;
236   }
237   return 0;
238 }
239
240 static int test_network_parse() {
241   int ret = 0;
242
243   for (size_t i = 0; i < sizeof(raw_packet_data) / sizeof(raw_packet_data[0]);
244        i++) {
245     uint8_t buffer[LCC_NETWORK_BUFFER_SIZE_DEFAULT];
246     size_t buffer_size = sizeof(buffer);
247     if (decode_string(raw_packet_data[i], buffer, &buffer_size)) {
248       fprintf(stderr, "lcc_network_parse(raw_packet_data[%" PRIsz "]):"
249                       " decoding string failed\n",
250               i);
251       return -1;
252     }
253
254     int status =
255         lcc_network_parse(buffer, buffer_size, (lcc_network_parse_options_t){
256                                                    .writer = nop_writer,
257                                                });
258     if (status != 0) {
259       fprintf(stderr,
260               "lcc_network_parse(raw_packet_data[%" PRIsz "]) = %d, want 0\n",
261               i, status);
262       ret = status;
263     }
264
265     printf("ok - lcc_network_parse(raw_packet_data[%" PRIsz "])\n", i);
266   }
267
268   return ret;
269 }
270
271 static int test_parse_time() {
272   int ret = 0;
273
274   struct {
275     uint64_t in;
276     double want;
277   } cases[] = {
278       {1439980823, 1439980823.0},
279       {1439981005, 1439981005.0},
280       {1439981150, 1439981150.0},
281   };
282
283   for (size_t i = 0; i < sizeof(cases) / sizeof(cases[0]); i++) {
284     lcc_value_list_t vl = LCC_VALUE_LIST_INIT;
285
286     uint64_t be = htobe64(cases[i].in);
287     int status = parse_time(TYPE_TIME, &be, sizeof(be), &vl);
288     if ((status != 0) || (vl.time != cases[i].want)) {
289       fprintf(stderr, "parse_time(%" PRIu64 ") = (%.0f, %d), want (%.0f, 0)\n",
290               cases[i].in, vl.time, status, cases[i].want);
291       ret = -1;
292     }
293   }
294
295   struct {
296     uint64_t in;
297     double want;
298   } cases_hr[] = {
299       {1546167635576736987, 1439980823.152453627},
300       {1546167831554815222, 1439981005.671262017},
301       {1546167986577716567, 1439981150.047589622},
302   };
303
304   for (size_t i = 0; i < sizeof(cases_hr) / sizeof(cases_hr[0]); i++) {
305     lcc_value_list_t vl = LCC_VALUE_LIST_INIT;
306
307     uint64_t be = htobe64(cases_hr[i].in);
308     int status = parse_time(TYPE_TIME_HR, &be, sizeof(be), &vl);
309     if ((status != 0) || (vl.time != cases_hr[i].want)) {
310       fprintf(stderr, "parse_time(%" PRIu64 ") = (%.9f, %d), want (%.9f, 0)\n",
311               cases_hr[i].in, vl.time, status, cases_hr[i].want);
312       ret = -1;
313     }
314   }
315
316   return ret;
317 }
318
319 static int test_parse_string() {
320   int ret = 0;
321
322   struct {
323     uint8_t *in;
324     size_t in_len;
325     char *want;
326   } cases[] = {
327       {(uint8_t[]){0}, 1, ""},
328       {(uint8_t[]){'t', 'e', 's', 't', 0}, 5, "test"},
329       {(uint8_t[]){'t', 'e', 's', 't'}, 4, NULL}, // null byte missing
330       {(uint8_t[]){'t', 'e', 's', 't', 'x', 0}, 6,
331        NULL}, // output buffer too small
332   };
333
334   for (size_t i = 0; i < sizeof(cases) / sizeof(cases[0]); i++) {
335     char got[5] = {0};
336
337     int status = parse_string(cases[i].in, cases[i].in_len, got, sizeof(got));
338     if (cases[i].want == NULL) {
339       if (status == 0) {
340         fprintf(stderr, "parse_string() = (\"%s\", 0), want error\n", got);
341         ret = -1;
342       }
343     } else /* if cases[i].want != NULL */ {
344       if (status != 0) {
345         fprintf(stderr, "parse_string() = %d, want 0\n", status);
346         ret = -1;
347       } else if (strcmp(got, cases[i].want) != 0) {
348         fprintf(stderr, "parse_string() = (\"%s\", 0), want (\"%s\", 0)\n", got,
349                 cases[i].want);
350         ret = -1;
351       }
352     }
353   }
354
355   return ret;
356 }
357
358 static int test_parse_values() {
359   int ret = 0;
360
361   uint8_t testcase[] = {
362       // 0, 6,                          // pkg type
363       // 0, 33,                         // pkg len
364       0, 3,                         // num values
365       1, 2, 1,                      // gauge, derive, gauge
366       0, 0, 0, 0, 0, 0, 0x45, 0x40, // 42.0
367       0, 0, 0, 0, 0, 0, 0x7a, 0x69, // 31337
368       0, 0, 0, 0, 0, 0, 0xf8, 0x7f, // NaN
369   };
370
371   lcc_value_list_t vl = LCC_VALUE_LIST_INIT;
372   int status = parse_values(testcase, sizeof(testcase), &vl);
373   if (status != 0) {
374     fprintf(stderr, "parse_values() = %d, want 0\n", status);
375     return -1;
376   }
377
378   if (vl.values_len != 3) {
379     fprintf(stderr, "parse_values(): vl.values_len = %" PRIsz ", want 3\n",
380             vl.values_len);
381     return -1;
382   }
383
384   int want_types[] = {LCC_TYPE_GAUGE, LCC_TYPE_DERIVE, LCC_TYPE_GAUGE};
385   for (size_t i = 0; i < sizeof(want_types) / sizeof(want_types[0]); i++) {
386     if (vl.values_types[i] != want_types[i]) {
387       fprintf(stderr,
388               "parse_values(): vl.values_types[%" PRIsz "] = %d, want %d\n", i,
389               vl.values_types[i], want_types[i]);
390       ret = -1;
391     }
392   }
393
394   if (vl.values[0].gauge != 42.0) {
395     fprintf(stderr, "parse_values(): vl.values[0] = %g, want 42\n",
396             vl.values[0].gauge);
397     ret = -1;
398   }
399   if (vl.values[1].derive != 31337) {
400     fprintf(stderr, "parse_values(): vl.values[1] = %" PRIu64 ", want 31337\n",
401             vl.values[1].derive);
402     ret = -1;
403   }
404   if (!isnan(vl.values[2].gauge)) {
405     fprintf(stderr, "parse_values(): vl.values[2] = %g, want NaN\n",
406             vl.values[2].gauge);
407     ret = -1;
408   }
409
410   free(vl.values);
411   free(vl.values_types);
412
413   return ret;
414 }
415
416 #if HAVE_GCRYPT_H
417 static int test_verify_sha256() {
418   int ret = 0;
419
420   int status = verify_sha256(
421       (char[]){'c', 'o', 'l', 'l', 'e', 'c', 't', 'd'}, 8, "admin", "admin",
422       (uint8_t[]){
423           0xcd, 0xa5, 0x9a, 0x37, 0xb0, 0x81, 0xc2, 0x31, 0x24, 0x2a, 0x6d,
424           0xbd, 0xfb, 0x44, 0xdb, 0xd7, 0x41, 0x2a, 0xf4, 0x29, 0x83, 0xde,
425           0xa5, 0x11, 0x96, 0xd2, 0xe9, 0x30, 0x21, 0xae, 0xc5, 0x45,
426       });
427   if (status != 0) {
428     fprintf(stderr, "verify_sha256() = %d, want 0\n", status);
429     ret = -1;
430   }
431
432   status = verify_sha256(
433       (char[]){'c', 'o', 'l', 'l', 'E', 'c', 't', 'd'}, 8, "admin", "admin",
434       (uint8_t[]){
435           0xcd, 0xa5, 0x9a, 0x37, 0xb0, 0x81, 0xc2, 0x31, 0x24, 0x2a, 0x6d,
436           0xbd, 0xfb, 0x44, 0xdb, 0xd7, 0x41, 0x2a, 0xf4, 0x29, 0x83, 0xde,
437           0xa5, 0x11, 0x96, 0xd2, 0xe9, 0x30, 0x21, 0xae, 0xc5, 0x45,
438       });
439   if (status != 1) {
440     fprintf(stderr, "verify_sha256() = %d, want 1\n", status);
441     ret = -1;
442   }
443
444   return ret;
445 }
446 #endif
447
448 #if HAVE_GCRYPT_H
449 static int test_decrypt_aes256() {
450   char const *iv_str = "4cbe2a747c9f9dcfa0e66f0c2fa74875";
451   uint8_t iv[16] = {0};
452   size_t iv_len = sizeof(iv);
453
454   char const *ciphertext_str =
455       "8f023b0b15178f8428da1221a5f653e840f065db4aff032c22e5a3df";
456   uint8_t ciphertext[28] = {0};
457   size_t ciphertext_len = sizeof(ciphertext);
458
459   if (decode_string(iv_str, iv, &iv_len) ||
460       decode_string(ciphertext_str, ciphertext, &ciphertext_len)) {
461     fprintf(stderr, "test_decrypt_aes256: decode_string failed.\n");
462     return -1;
463   }
464   assert(iv_len == sizeof(iv));
465   assert(ciphertext_len == sizeof(ciphertext));
466
467   int status = decrypt_aes256(
468       &(buffer_t){
469           .data = ciphertext, .len = ciphertext_len,
470       },
471       iv, iv_len, "admin");
472   if (status != 0) {
473     fprintf(stderr, "decrypt_aes256() = %d, want 0\n", status);
474     return -1;
475   }
476
477   char const *want = "collectd";
478   char got[9] = {0};
479   memmove(got, &ciphertext[20], sizeof(got) - 1);
480   if (strcmp(got, want) != 0) {
481     fprintf(stderr, "decrypt_aes256() = \"%s\", want \"%s\"\n", got, want);
482     return -1;
483   }
484
485   return 0;
486 }
487 #endif
488
489 int main(void) {
490   int ret = 0;
491
492   int status;
493   if ((status = test_network_parse())) {
494     ret = status;
495   }
496   if ((status = test_parse_time())) {
497     ret = status;
498   }
499   if ((status = test_parse_string())) {
500     ret = status;
501   }
502   if ((status = test_parse_values())) {
503     ret = status;
504   }
505
506 #if HAVE_GCRYPT_H
507   if ((status = test_verify_sha256())) {
508     ret = status;
509   }
510   if ((status = test_decrypt_aes256())) {
511     ret = status;
512   }
513 #endif
514
515   return ret;
516 }