Clang-format a few files to make CI happy
[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,
249               "lcc_network_parse(raw_packet_data[%" PRIsz "]):"
250               " decoding string failed\n",
251               i);
252       return -1;
253     }
254
255     int status = lcc_network_parse(buffer, buffer_size,
256                                    (lcc_network_parse_options_t){
257                                        .writer = nop_writer,
258                                    });
259     if (status != 0) {
260       fprintf(stderr,
261               "lcc_network_parse(raw_packet_data[%" PRIsz "]) = %d, want 0\n",
262               i, status);
263       ret = status;
264     }
265
266     printf("ok - lcc_network_parse(raw_packet_data[%" PRIsz "])\n", i);
267   }
268
269   return ret;
270 }
271
272 static int test_parse_time() {
273   int ret = 0;
274
275   struct {
276     uint64_t in;
277     double want;
278   } cases[] = {
279       {1439980823, 1439980823.0},
280       {1439981005, 1439981005.0},
281       {1439981150, 1439981150.0},
282   };
283
284   for (size_t i = 0; i < sizeof(cases) / sizeof(cases[0]); i++) {
285     lcc_value_list_t vl = LCC_VALUE_LIST_INIT;
286
287     uint64_t be = htobe64(cases[i].in);
288     int status = parse_time(TYPE_TIME, &be, sizeof(be), &vl);
289     if ((status != 0) || (vl.time != cases[i].want)) {
290       fprintf(stderr, "parse_time(%" PRIu64 ") = (%.0f, %d), want (%.0f, 0)\n",
291               cases[i].in, vl.time, status, cases[i].want);
292       ret = -1;
293     }
294   }
295
296   struct {
297     uint64_t in;
298     double want;
299   } cases_hr[] = {
300       {1546167635576736987, 1439980823.152453627},
301       {1546167831554815222, 1439981005.671262017},
302       {1546167986577716567, 1439981150.047589622},
303   };
304
305   for (size_t i = 0; i < sizeof(cases_hr) / sizeof(cases_hr[0]); i++) {
306     lcc_value_list_t vl = LCC_VALUE_LIST_INIT;
307
308     uint64_t be = htobe64(cases_hr[i].in);
309     int status = parse_time(TYPE_TIME_HR, &be, sizeof(be), &vl);
310     if ((status != 0) || (vl.time != cases_hr[i].want)) {
311       fprintf(stderr, "parse_time(%" PRIu64 ") = (%.9f, %d), want (%.9f, 0)\n",
312               cases_hr[i].in, vl.time, status, cases_hr[i].want);
313       ret = -1;
314     }
315   }
316
317   return ret;
318 }
319
320 static int test_parse_string() {
321   int ret = 0;
322
323   struct {
324     uint8_t *in;
325     size_t in_len;
326     char *want;
327   } cases[] = {
328       {(uint8_t[]){0}, 1, ""},
329       {(uint8_t[]){'t', 'e', 's', 't', 0}, 5, "test"},
330       {(uint8_t[]){'t', 'e', 's', 't'}, 4, NULL}, // null byte missing
331       {(uint8_t[]){'t', 'e', 's', 't', 'x', 0}, 6,
332        NULL}, // output buffer too small
333   };
334
335   for (size_t i = 0; i < sizeof(cases) / sizeof(cases[0]); i++) {
336     char got[5] = {0};
337
338     int status = parse_string(cases[i].in, cases[i].in_len, got, sizeof(got));
339     if (cases[i].want == NULL) {
340       if (status == 0) {
341         fprintf(stderr, "parse_string() = (\"%s\", 0), want error\n", got);
342         ret = -1;
343       }
344     } else /* if cases[i].want != NULL */ {
345       if (status != 0) {
346         fprintf(stderr, "parse_string() = %d, want 0\n", status);
347         ret = -1;
348       } else if (strcmp(got, cases[i].want) != 0) {
349         fprintf(stderr, "parse_string() = (\"%s\", 0), want (\"%s\", 0)\n", got,
350                 cases[i].want);
351         ret = -1;
352       }
353     }
354   }
355
356   return ret;
357 }
358
359 static int test_parse_values() {
360   int ret = 0;
361
362   uint8_t testcase[] = {
363       // 0, 6,                          // pkg type
364       // 0, 33,                         // pkg len
365       0, 3,                         // num values
366       1, 2, 1,                      // gauge, derive, gauge
367       0, 0, 0, 0, 0, 0, 0x45, 0x40, // 42.0
368       0, 0, 0, 0, 0, 0, 0x7a, 0x69, // 31337
369       0, 0, 0, 0, 0, 0, 0xf8, 0x7f, // NaN
370   };
371
372   lcc_value_list_t vl = LCC_VALUE_LIST_INIT;
373   int status = parse_values(testcase, sizeof(testcase), &vl);
374   if (status != 0) {
375     fprintf(stderr, "parse_values() = %d, want 0\n", status);
376     return -1;
377   }
378
379   if (vl.values_len != 3) {
380     fprintf(stderr, "parse_values(): vl.values_len = %" PRIsz ", want 3\n",
381             vl.values_len);
382     return -1;
383   }
384
385   int want_types[] = {LCC_TYPE_GAUGE, LCC_TYPE_DERIVE, LCC_TYPE_GAUGE};
386   for (size_t i = 0; i < sizeof(want_types) / sizeof(want_types[0]); i++) {
387     if (vl.values_types[i] != want_types[i]) {
388       fprintf(stderr,
389               "parse_values(): vl.values_types[%" PRIsz "] = %d, want %d\n", i,
390               vl.values_types[i], want_types[i]);
391       ret = -1;
392     }
393   }
394
395   if (vl.values[0].gauge != 42.0) {
396     fprintf(stderr, "parse_values(): vl.values[0] = %g, want 42\n",
397             vl.values[0].gauge);
398     ret = -1;
399   }
400   if (vl.values[1].derive != 31337) {
401     fprintf(stderr, "parse_values(): vl.values[1] = %" PRIu64 ", want 31337\n",
402             vl.values[1].derive);
403     ret = -1;
404   }
405   if (!isnan(vl.values[2].gauge)) {
406     fprintf(stderr, "parse_values(): vl.values[2] = %g, want NaN\n",
407             vl.values[2].gauge);
408     ret = -1;
409   }
410
411   free(vl.values);
412   free(vl.values_types);
413
414   return ret;
415 }
416
417 #if HAVE_GCRYPT_H
418 static int test_verify_sha256() {
419   int ret = 0;
420
421   int status = verify_sha256(
422       (char[]){'c', 'o', 'l', 'l', 'e', 'c', 't', 'd'}, 8, "admin", "admin",
423       (uint8_t[]){
424           0xcd, 0xa5, 0x9a, 0x37, 0xb0, 0x81, 0xc2, 0x31, 0x24, 0x2a, 0x6d,
425           0xbd, 0xfb, 0x44, 0xdb, 0xd7, 0x41, 0x2a, 0xf4, 0x29, 0x83, 0xde,
426           0xa5, 0x11, 0x96, 0xd2, 0xe9, 0x30, 0x21, 0xae, 0xc5, 0x45,
427       });
428   if (status != 0) {
429     fprintf(stderr, "verify_sha256() = %d, want 0\n", status);
430     ret = -1;
431   }
432
433   status = verify_sha256(
434       (char[]){'c', 'o', 'l', 'l', 'E', 'c', 't', 'd'}, 8, "admin", "admin",
435       (uint8_t[]){
436           0xcd, 0xa5, 0x9a, 0x37, 0xb0, 0x81, 0xc2, 0x31, 0x24, 0x2a, 0x6d,
437           0xbd, 0xfb, 0x44, 0xdb, 0xd7, 0x41, 0x2a, 0xf4, 0x29, 0x83, 0xde,
438           0xa5, 0x11, 0x96, 0xd2, 0xe9, 0x30, 0x21, 0xae, 0xc5, 0x45,
439       });
440   if (status != 1) {
441     fprintf(stderr, "verify_sha256() = %d, want 1\n", status);
442     ret = -1;
443   }
444
445   return ret;
446 }
447 #endif
448
449 #if HAVE_GCRYPT_H
450 static int test_decrypt_aes256() {
451   char const *iv_str = "4cbe2a747c9f9dcfa0e66f0c2fa74875";
452   uint8_t iv[16] = {0};
453   size_t iv_len = sizeof(iv);
454
455   char const *ciphertext_str =
456       "8f023b0b15178f8428da1221a5f653e840f065db4aff032c22e5a3df";
457   uint8_t ciphertext[28] = {0};
458   size_t ciphertext_len = sizeof(ciphertext);
459
460   if (decode_string(iv_str, iv, &iv_len) ||
461       decode_string(ciphertext_str, ciphertext, &ciphertext_len)) {
462     fprintf(stderr, "test_decrypt_aes256: decode_string failed.\n");
463     return -1;
464   }
465   assert(iv_len == sizeof(iv));
466   assert(ciphertext_len == sizeof(ciphertext));
467
468   int status = decrypt_aes256(
469       &(buffer_t){
470           .data = ciphertext,
471           .len = ciphertext_len,
472       },
473       iv, iv_len, "admin");
474   if (status != 0) {
475     fprintf(stderr, "decrypt_aes256() = %d, want 0\n", status);
476     return -1;
477   }
478
479   char const *want = "collectd";
480   char got[9] = {0};
481   memmove(got, &ciphertext[20], sizeof(got) - 1);
482   if (strcmp(got, want) != 0) {
483     fprintf(stderr, "decrypt_aes256() = \"%s\", want \"%s\"\n", got, want);
484     return -1;
485   }
486
487   return 0;
488 }
489 #endif
490
491 int main(void) {
492   int ret = 0;
493
494   int status;
495   if ((status = test_network_parse())) {
496     ret = status;
497   }
498   if ((status = test_parse_time())) {
499     ret = status;
500   }
501   if ((status = test_parse_string())) {
502     ret = status;
503   }
504   if ((status = test_parse_values())) {
505     ret = status;
506   }
507
508 #if HAVE_GCRYPT_H
509   if ((status = test_verify_sha256())) {
510     ret = status;
511   }
512   if ((status = test_decrypt_aes256())) {
513     ret = status;
514   }
515 #endif
516
517   return ret;
518 }