• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

systemd / systemd / 13935887515

18 Mar 2025 07:10PM UTC coverage: 71.913% (-0.03%) from 71.946%
13935887515

push

github

web-flow
Several fixes and cleanups around sd_listen_fds() (#36788)

15 of 24 new or added lines in 5 files covered. (62.5%)

993 existing lines in 54 files now uncovered.

296157 of 411825 relevant lines covered (71.91%)

710024.94 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

99.07
/src/resolve/test-dns-cache.c
1
/* SPDX-License-Identifier: LGPL-2.1-or-later */
2

3
#include <sys/socket.h>
4

5
#include "dns-type.h"
6
#include "fd-util.h"
7
#include "fileio.h"
8
#include "fs-util.h"
9
#include "log.h"
10
#include "resolve-util.h"
11
#include "resolved-def.h"
12
#include "resolved-dns-answer.h"
13
#include "resolved-dns-cache.h"
14
#include "resolved-dns-dnssec.h"
15
#include "resolved-dns-packet.h"
16
#include "resolved-dns-rr.h"
17
#include "tests.h"
18
#include "tmpfile-util.h"
19

20
static DnsCache new_cache(void) {
42✔
21
        return (DnsCache) {};
42✔
22
}
23

24
typedef struct PutArgs {
25
        DnsCacheMode cache_mode;
26
        DnsProtocol protocol;
27
        DnsResourceKey *key;
28
        int rcode;
29
        DnsAnswer *answer;
30
        DnsPacket *full_packet;
31
        uint64_t query_flags;
32
        DnssecResult dnssec_result;
33
        uint32_t nsec_ttl;
34
        int owner_family;
35
        const union in_addr_union owner_address;
36
        usec_t stale_retention_usec;
37
} PutArgs;
38

39
static PutArgs mk_put_args(void) {
47✔
40
        PutArgs put_args = {
47✔
41
                .cache_mode = DNS_CACHE_MODE_YES,
42
                .protocol = DNS_PROTOCOL_DNS,
43
                .key = NULL,
44
                .rcode = DNS_RCODE_SUCCESS,
45
                .answer = dns_answer_new(0),
47✔
46
                .full_packet = NULL,
47
                .query_flags = SD_RESOLVED_AUTHENTICATED | SD_RESOLVED_CONFIDENTIAL,
48
                .dnssec_result = DNSSEC_UNSIGNED,
49
                .nsec_ttl = 3600,
50
                .owner_family = AF_INET,
51
                .owner_address = { .in.s_addr = htobe32(0x01020304) },
47✔
52
                .stale_retention_usec = 0
53
        };
54

55
        ASSERT_NOT_NULL(put_args.answer);
47✔
56
        return put_args;
47✔
57
}
58

59
static int cache_put(DnsCache *cache, PutArgs *args) {
48✔
60
        ASSERT_NOT_NULL(cache);
48✔
61
        ASSERT_NOT_NULL(args);
48✔
62

63
        return dns_cache_put(cache,
48✔
64
                args->cache_mode,
65
                args->protocol,
66
                args->key,
67
                args->rcode,
68
                args->answer,
69
                args->full_packet,
70
                args->query_flags,
71
                args->dnssec_result,
72
                args->nsec_ttl,
73
                args->owner_family,
74
                &args->owner_address,
75
                args->stale_retention_usec);
76
}
77

78
static void dns_cache_unrefp(DnsCache *cache) {
42✔
79
        dns_cache_flush(cache);
42✔
80
}
42✔
81

82
static void put_args_unrefp(PutArgs *args) {
47✔
83
        ASSERT_NOT_NULL(args);
47✔
84

85
        dns_resource_key_unref(args->key);
47✔
86
        dns_answer_unref(args->answer);
47✔
87
        dns_packet_unref(args->full_packet);
47✔
88
}
47✔
89

90
static char* checked_strdup(const char *str) {
5✔
91
        char *copy = strdup(str);
5✔
92
        ASSERT_NOT_NULL(copy);
5✔
93
        return copy;
5✔
94
}
95

96
static void answer_add_a(PutArgs *args, DnsResourceKey *key, int addr, int ttl, DnsAnswerFlags flags) {
41✔
97
        _cleanup_(dns_resource_record_unrefp) DnsResourceRecord *rr = NULL;
41✔
98

99
        rr = dns_resource_record_new(key);
41✔
100
        ASSERT_NOT_NULL(rr);
41✔
101
        rr->a.in_addr.s_addr = htobe32(addr);
41✔
102
        rr->ttl = ttl;
41✔
103
        dns_answer_add(args->answer, rr, 1, flags, NULL);
41✔
104
}
41✔
105

106
static void answer_add_cname(PutArgs *args, DnsResourceKey *key, const char *alias, int ttl, DnsAnswerFlags flags) {
3✔
107
        _cleanup_(dns_resource_record_unrefp) DnsResourceRecord *rr = NULL;
3✔
108

109
        rr = dns_resource_record_new(key);
3✔
110
        ASSERT_NOT_NULL(rr);
3✔
111
        rr->cname.name = checked_strdup(alias);
3✔
112
        rr->ttl = ttl;
3✔
113
        dns_answer_add(args->answer, rr, 1, flags, NULL);
3✔
114
}
3✔
115

116
static void answer_add_opt(PutArgs *args, DnsResourceKey *key, int ttl, DnsAnswerFlags flags) {
2✔
117
        _cleanup_(dns_resource_record_unrefp) DnsResourceRecord *rr = NULL;
2✔
118

119
        rr = dns_resource_record_new(key);
2✔
120
        ASSERT_NOT_NULL(rr);
2✔
121
        rr->opt.data_size = 0;
2✔
122
        rr->ttl = ttl;
2✔
123
        dns_answer_add(args->answer, rr, 1, flags, NULL);
2✔
124
}
2✔
125

126
#define BY_IDX(json, idx) sd_json_variant_by_index(json, idx)
127
#define BY_KEY(json, key) sd_json_variant_by_key(json, key)
128
#define INTVAL(json) sd_json_variant_integer(json)
129
#define STRVAL(json) sd_json_variant_string(json)
130

131
/* ================================================================
132
 * dns_cache_put()
133
 * ================================================================ */
134

135
TEST(dns_a_success_is_cached) {
1✔
136
        _cleanup_(dns_cache_unrefp) DnsCache cache = new_cache();
1✔
137
        _cleanup_(put_args_unrefp) PutArgs put_args = mk_put_args();
2✔
138

139
        put_args.key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_A, "www.example.com");
1✔
140
        ASSERT_NOT_NULL(put_args.key);
1✔
141
        put_args.rcode = DNS_RCODE_SUCCESS;
1✔
142
        answer_add_a(&put_args, put_args.key, 0xc0a8017f, 3600, DNS_ANSWER_CACHEABLE);
1✔
143

144
        ASSERT_OK(cache_put(&cache, &put_args));
1✔
145
        ASSERT_FALSE(dns_cache_is_empty(&cache));
1✔
146
}
1✔
147

148
TEST(dns_a_success_non_matching_type_is_cached) {
1✔
149
        _cleanup_(dns_cache_unrefp) DnsCache cache = new_cache();
1✔
150
        _cleanup_(put_args_unrefp) PutArgs put_args = mk_put_args();
2✔
151
        _cleanup_(dns_resource_key_unrefp) DnsResourceKey *key = NULL;
1✔
152

153
        put_args.key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_A, "www.example.com");
1✔
154
        ASSERT_NOT_NULL(put_args.key);
1✔
155
        put_args.rcode = DNS_RCODE_SUCCESS;
1✔
156

157
        key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_AAAA, "www.example.com");
1✔
158
        ASSERT_NOT_NULL(key);
1✔
159
        answer_add_a(&put_args, key, 0xc0a8017f, 3600, DNS_ANSWER_CACHEABLE);
1✔
160

161
        ASSERT_OK(cache_put(&cache, &put_args));
1✔
162
        ASSERT_FALSE(dns_cache_is_empty(&cache));
1✔
163
}
1✔
164

165
TEST(dns_a_success_non_matching_name_is_cached) {
1✔
166
        _cleanup_(dns_cache_unrefp) DnsCache cache = new_cache();
1✔
167
        _cleanup_(put_args_unrefp) PutArgs put_args = mk_put_args();
2✔
168
        _cleanup_(dns_resource_key_unrefp) DnsResourceKey *key = NULL;
1✔
169

170
        put_args.key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_A, "www.example.com");
1✔
171
        ASSERT_NOT_NULL(put_args.key);
1✔
172
        put_args.rcode = DNS_RCODE_SUCCESS;
1✔
173

174
        key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_A, "example.com");
1✔
175
        ASSERT_NOT_NULL(key);
1✔
176
        answer_add_a(&put_args, key, 0xc0a8017f, 3600, DNS_ANSWER_CACHEABLE);
1✔
177

178
        ASSERT_OK(cache_put(&cache, &put_args));
1✔
179
        ASSERT_FALSE(dns_cache_is_empty(&cache));
1✔
180
}
1✔
181

182
TEST(dns_a_success_mdns_no_key_is_cached) {
1✔
183
        _cleanup_(dns_cache_unrefp) DnsCache cache = new_cache();
1✔
184
        _cleanup_(put_args_unrefp) PutArgs put_args = mk_put_args();
2✔
185
        _cleanup_(dns_resource_key_unrefp) DnsResourceKey *key = NULL;
1✔
186

187
        put_args.protocol = DNS_PROTOCOL_MDNS;
1✔
188
        put_args.rcode = DNS_RCODE_SUCCESS;
1✔
189

190
        key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_A, "example.com");
1✔
191
        ASSERT_NOT_NULL(key);
1✔
192
        answer_add_a(&put_args, key, 0xc0a8017f, 3600, DNS_ANSWER_CACHEABLE);
1✔
193

194
        ASSERT_OK(cache_put(&cache, &put_args));
1✔
195
        ASSERT_FALSE(dns_cache_is_empty(&cache));
1✔
196
}
1✔
197

198
TEST(dns_a_success_mdns_update_existing) {
1✔
199
        _cleanup_(dns_cache_unrefp) DnsCache cache = new_cache();
1✔
200
        _cleanup_(put_args_unrefp) PutArgs args1 = mk_put_args(), args2 = mk_put_args();
2✔
201
        DnsResourceKey *key = NULL;
1✔
202

203
        args1.protocol = DNS_PROTOCOL_MDNS;
1✔
204
        args1.rcode = DNS_RCODE_SUCCESS;
1✔
205
        key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_A, "example.com");
1✔
206
        ASSERT_NOT_NULL(key);
1✔
207
        answer_add_a(&args1, key, 0xc0a8017f, 3600, DNS_ANSWER_CACHEABLE | DNS_ANSWER_SHARED_OWNER);
1✔
208
        dns_resource_key_unref(key);
1✔
209

210
        ASSERT_OK(cache_put(&cache, &args1));
1✔
211

212
        args2.protocol = DNS_PROTOCOL_MDNS;
1✔
213
        args2.rcode = DNS_RCODE_SUCCESS;
1✔
214
        key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_A, "example.com");
1✔
215
        ASSERT_NOT_NULL(key);
1✔
216
        answer_add_a(&args2, key, 0xc0a8017f, 2400, DNS_ANSWER_CACHEABLE | DNS_ANSWER_SHARED_OWNER);
1✔
217
        dns_resource_key_unref(key);
1✔
218

219
        ASSERT_OK(cache_put(&cache, &args2));
1✔
220

221
        ASSERT_EQ(dns_cache_size(&cache), 1u);
1✔
222
}
1✔
223

224
TEST(dns_a_success_mdns_zero_ttl_removes_existing) {
1✔
225
        _cleanup_(dns_cache_unrefp) DnsCache cache = new_cache();
1✔
226
        _cleanup_(put_args_unrefp) PutArgs args1 = mk_put_args(), args2 = mk_put_args();
2✔
227
        DnsResourceKey *key = NULL;
1✔
228

229
        args1.protocol = DNS_PROTOCOL_MDNS;
1✔
230
        args1.rcode = DNS_RCODE_SUCCESS;
1✔
231
        key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_A, "example.com");
1✔
232
        ASSERT_NOT_NULL(key);
1✔
233
        answer_add_a(&args1, key, 0xc0a8017f, 3600, DNS_ANSWER_CACHEABLE | DNS_ANSWER_SHARED_OWNER);
1✔
234
        dns_resource_key_unref(key);
1✔
235

236
        ASSERT_OK(cache_put(&cache, &args1));
1✔
237

238
        args2.protocol = DNS_PROTOCOL_MDNS;
1✔
239
        args2.rcode = DNS_RCODE_SUCCESS;
1✔
240
        key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_A, "example.com");
1✔
241
        ASSERT_NOT_NULL(key);
1✔
242
        answer_add_a(&args2, key, 0xc0a8017f, 0, DNS_ANSWER_CACHEABLE | DNS_ANSWER_SHARED_OWNER);
1✔
243
        dns_resource_key_unref(key);
1✔
244

245
        ASSERT_OK(cache_put(&cache, &args2));
1✔
246

247
        ASSERT_TRUE(dns_cache_is_empty(&cache));
1✔
248
}
1✔
249

250
TEST(dns_a_success_mdns_same_key_different_payloads) {
1✔
251
        _cleanup_(dns_cache_unrefp) DnsCache cache = new_cache();
1✔
252
        _cleanup_(put_args_unrefp) PutArgs put_args = mk_put_args();
2✔
253
        DnsResourceKey *key = NULL;
1✔
254

255
        put_args.protocol = DNS_PROTOCOL_MDNS;
1✔
256
        put_args.rcode = DNS_RCODE_SUCCESS;
1✔
257

258
        key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_A, "example.com");
1✔
259
        ASSERT_NOT_NULL(key);
1✔
260
        answer_add_a(&put_args, key, 0xc0a8017f, 3600, DNS_ANSWER_CACHEABLE | DNS_ANSWER_SHARED_OWNER);
1✔
261
        dns_resource_key_unref(key);
1✔
262

263
        key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_A, "example.com");
1✔
264
        ASSERT_NOT_NULL(key);
1✔
265
        answer_add_a(&put_args, key, 0x7f01a8cc, 2400, DNS_ANSWER_CACHEABLE | DNS_ANSWER_SHARED_OWNER);
1✔
266
        dns_resource_key_unref(key);
1✔
267

268
        ASSERT_EQ(dns_answer_size(put_args.answer), 2u);
2✔
269

270
        ASSERT_OK(cache_put(&cache, &put_args));
1✔
271
        ASSERT_EQ(dns_cache_size(&cache), 1u);
1✔
272
}
1✔
273

274
TEST(dns_a_success_escaped_key_returns_error) {
1✔
275
        _cleanup_(dns_cache_unrefp) DnsCache cache = new_cache();
1✔
276
        _cleanup_(put_args_unrefp) PutArgs put_args = mk_put_args();
2✔
277
        _cleanup_(dns_resource_key_unrefp) DnsResourceKey *key = NULL;
1✔
278

279
        put_args.key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_A, "www.example.com");
1✔
280
        ASSERT_NOT_NULL(put_args.key);
1✔
281
        put_args.rcode = DNS_RCODE_SUCCESS;
1✔
282

283
        key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_A, "www.\\example.com");
1✔
284
        ASSERT_NOT_NULL(key);
1✔
285
        answer_add_a(&put_args, key, 0xc0a8017f, 3600, DNS_ANSWER_CACHEABLE);
1✔
286

287
        ASSERT_ERROR(cache_put(&cache, &put_args), EINVAL);
1✔
288
        ASSERT_TRUE(dns_cache_is_empty(&cache));
1✔
289
}
1✔
290

291
TEST(dns_a_success_empty_answer_is_not_cached) {
1✔
292
        _cleanup_(dns_cache_unrefp) DnsCache cache = new_cache();
1✔
293
        _cleanup_(put_args_unrefp) PutArgs put_args = mk_put_args();
2✔
294

295
        put_args.key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_A, "www.example.com");
1✔
296
        ASSERT_NOT_NULL(put_args.key);
1✔
297
        put_args.rcode = DNS_RCODE_SUCCESS;
1✔
298

299
        ASSERT_OK(cache_put(&cache, &put_args));
1✔
300
        ASSERT_TRUE(dns_cache_is_empty(&cache));
1✔
301
}
1✔
302

303
TEST(dns_a_success_any_class_is_not_cached) {
1✔
304
        _cleanup_(dns_cache_unrefp) DnsCache cache = new_cache();
1✔
305
        _cleanup_(put_args_unrefp) PutArgs put_args = mk_put_args();
2✔
306

307
        put_args.key = dns_resource_key_new(DNS_CLASS_ANY, DNS_TYPE_A, "www.example.com");
1✔
308
        ASSERT_NOT_NULL(put_args.key);
1✔
309
        put_args.rcode = DNS_RCODE_SUCCESS;
1✔
310
        answer_add_a(&put_args, put_args.key, 0xc0a8017f, 3600, DNS_ANSWER_CACHEABLE);
1✔
311

312
        ASSERT_OK(cache_put(&cache, &put_args));
1✔
313
        ASSERT_TRUE(dns_cache_is_empty(&cache));
1✔
314
}
1✔
315

316
TEST(dns_a_success_any_type_not_cached) {
1✔
317
        _cleanup_(dns_cache_unrefp) DnsCache cache = new_cache();
1✔
318
        _cleanup_(put_args_unrefp) PutArgs put_args = mk_put_args();
2✔
319

320
        put_args.key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_ANY, "www.example.com");
1✔
321
        ASSERT_NOT_NULL(put_args.key);
1✔
322
        put_args.rcode = DNS_RCODE_SUCCESS;
1✔
323
        answer_add_opt(&put_args, put_args.key, 3600, DNS_ANSWER_CACHEABLE);
1✔
324

325
        ASSERT_OK(cache_put(&cache, &put_args));
1✔
326
        ASSERT_TRUE(dns_cache_is_empty(&cache));
1✔
327
}
1✔
328

329
TEST(dns_a_success_opt_not_cached) {
1✔
330
        _cleanup_(dns_cache_unrefp) DnsCache cache = new_cache();
1✔
331
        _cleanup_(put_args_unrefp) PutArgs put_args = mk_put_args();
2✔
332

333
        put_args.key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_OPT, "www.example.com");
1✔
334
        ASSERT_NOT_NULL(put_args.key);
1✔
335
        put_args.rcode = DNS_RCODE_SUCCESS;
1✔
336
        answer_add_opt(&put_args, put_args.key, 3600, DNS_ANSWER_CACHEABLE);
1✔
337

338
        ASSERT_OK(cache_put(&cache, &put_args));
1✔
339
        ASSERT_TRUE(dns_cache_is_empty(&cache));
1✔
340
}
1✔
341

342
TEST(dns_a_nxdomain_is_cached) {
1✔
343
        _cleanup_(dns_cache_unrefp) DnsCache cache = new_cache();
1✔
344
        _cleanup_(put_args_unrefp) PutArgs put_args = mk_put_args();
2✔
345

346
        put_args.key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_A, "www.example.com");
1✔
347
        ASSERT_NOT_NULL(put_args.key);
1✔
348
        put_args.rcode = DNS_RCODE_NXDOMAIN;
1✔
349
        dns_answer_add_soa(put_args.answer, "example.com", 3600, 0);
1✔
350

351
        ASSERT_OK(cache_put(&cache, &put_args));
1✔
352
        ASSERT_FALSE(dns_cache_is_empty(&cache));
1✔
353
}
1✔
354

355
TEST(dns_a_nxdomain_no_soa_not_cached) {
1✔
356
        _cleanup_(dns_cache_unrefp) DnsCache cache = new_cache();
1✔
357
        _cleanup_(put_args_unrefp) PutArgs put_args = mk_put_args();
2✔
358

359
        put_args.key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_A, "www.example.com");
1✔
360
        ASSERT_NOT_NULL(put_args.key);
1✔
361
        put_args.rcode = DNS_RCODE_NXDOMAIN;
1✔
362

363
        ASSERT_OK(cache_put(&cache, &put_args));
1✔
364
        ASSERT_TRUE(dns_cache_is_empty(&cache));
1✔
365
}
1✔
366

367
TEST(dns_a_nxdomain_any_class_is_not_cached) {
1✔
368
        _cleanup_(dns_cache_unrefp) DnsCache cache = new_cache();
1✔
369
        _cleanup_(put_args_unrefp) PutArgs put_args = mk_put_args();
2✔
370

371
        put_args.key = dns_resource_key_new(DNS_CLASS_ANY, DNS_TYPE_A, "www.example.com");
1✔
372
        ASSERT_NOT_NULL(put_args.key);
1✔
373
        put_args.rcode = DNS_RCODE_NXDOMAIN;
1✔
374
        dns_answer_add_soa(put_args.answer, "example.com", 3600, 0);
1✔
375

376
        ASSERT_OK(cache_put(&cache, &put_args));
1✔
377
        ASSERT_TRUE(dns_cache_is_empty(&cache));
1✔
378
}
1✔
379

380
TEST(dns_a_nxdomain_any_type_not_cached) {
1✔
381
        _cleanup_(dns_cache_unrefp) DnsCache cache = new_cache();
1✔
382
        _cleanup_(put_args_unrefp) PutArgs put_args = mk_put_args();
2✔
383

384
        put_args.key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_ANY, "www.example.com");
1✔
385
        ASSERT_NOT_NULL(put_args.key);
1✔
386
        put_args.rcode = DNS_RCODE_NXDOMAIN;
1✔
387
        dns_answer_add_soa(put_args.answer, "example.com", 3600, 0);
1✔
388

389
        ASSERT_OK(cache_put(&cache, &put_args));
1✔
390
        ASSERT_TRUE(dns_cache_is_empty(&cache));
1✔
391
}
1✔
392

393
TEST(dns_a_nxdomain_opt_not_cached) {
1✔
394
        _cleanup_(dns_cache_unrefp) DnsCache cache = new_cache();
1✔
395
        _cleanup_(put_args_unrefp) PutArgs put_args = mk_put_args();
2✔
396

397
        put_args.key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_OPT, "www.example.com");
1✔
398
        ASSERT_NOT_NULL(put_args.key);
1✔
399
        put_args.rcode = DNS_RCODE_NXDOMAIN;
1✔
400
        dns_answer_add_soa(put_args.answer, "example.com", 3600, 0);
1✔
401

402
        ASSERT_OK(cache_put(&cache, &put_args));
1✔
403
        ASSERT_TRUE(dns_cache_is_empty(&cache));
1✔
404
}
1✔
405

406
TEST(dns_a_servfail_is_cached) {
1✔
407
        _cleanup_(dns_cache_unrefp) DnsCache cache = new_cache();
1✔
408
        _cleanup_(put_args_unrefp) PutArgs put_args = mk_put_args();
2✔
409

410
        put_args.key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_A, "www.example.com");
1✔
411
        ASSERT_NOT_NULL(put_args.key);
1✔
412
        put_args.rcode = DNS_RCODE_SERVFAIL;
1✔
413

414
        ASSERT_OK(cache_put(&cache, &put_args));
1✔
415
        ASSERT_FALSE(dns_cache_is_empty(&cache));
1✔
416
}
1✔
417

418
TEST(dns_a_refused_is_not_cached) {
1✔
419
        _cleanup_(dns_cache_unrefp) DnsCache cache = new_cache();
1✔
420
        _cleanup_(put_args_unrefp) PutArgs put_args = mk_put_args();
2✔
421

422
        put_args.key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_A, "www.example.com");
1✔
423
        ASSERT_NOT_NULL(put_args.key);
1✔
424
        put_args.rcode = DNS_RCODE_REFUSED;
1✔
425

426
        ASSERT_OK(cache_put(&cache, &put_args));
1✔
427
        ASSERT_TRUE(dns_cache_is_empty(&cache));
1✔
428
}
1✔
429

430
TEST(dns_a_success_zero_ttl_is_not_cached) {
1✔
431
        _cleanup_(dns_cache_unrefp) DnsCache cache = new_cache();
1✔
432
        _cleanup_(put_args_unrefp) PutArgs put_args = mk_put_args();
2✔
433

434
        put_args.key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_A, "www.example.com");
1✔
435
        ASSERT_NOT_NULL(put_args.key);
1✔
436
        put_args.rcode = DNS_RCODE_SUCCESS;
1✔
437
        answer_add_a(&put_args, put_args.key, 0xc0a8017f, 0, DNS_ANSWER_CACHEABLE);
1✔
438

439
        ASSERT_OK(cache_put(&cache, &put_args));
1✔
440
        ASSERT_TRUE(dns_cache_is_empty(&cache));
1✔
441
}
1✔
442

443
TEST(dns_a_success_zero_ttl_removes_existing_entry) {
1✔
444
        _cleanup_(dns_cache_unrefp) DnsCache cache = new_cache();
1✔
445
        _cleanup_(put_args_unrefp) PutArgs put_args = mk_put_args();
2✔
446

447
        put_args.key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_A, "www.example.com");
1✔
448
        ASSERT_NOT_NULL(put_args.key);
1✔
449
        put_args.rcode = DNS_RCODE_SUCCESS;
1✔
450
        answer_add_a(&put_args, put_args.key, 0xc0a8017f, 3600, DNS_ANSWER_CACHEABLE);
1✔
451

452
        ASSERT_OK(cache_put(&cache, &put_args));
1✔
453
        ASSERT_FALSE(dns_cache_is_empty(&cache));
1✔
454

455
        dns_answer_unref(put_args.answer);
1✔
456
        put_args.answer = dns_answer_new(1);
1✔
457
        ASSERT_NOT_NULL(put_args.answer);
1✔
458
        answer_add_a(&put_args, put_args.key, 0xc0a8017f, 0, DNS_ANSWER_CACHEABLE);
1✔
459

460
        ASSERT_OK(cache_put(&cache, &put_args));
1✔
461
        ASSERT_TRUE(dns_cache_is_empty(&cache));
1✔
462
}
1✔
463

464
TEST(dns_a_success_not_cacheable_is_not_cached) {
1✔
465
        _cleanup_(dns_cache_unrefp) DnsCache cache = new_cache();
1✔
466
        _cleanup_(put_args_unrefp) PutArgs put_args = mk_put_args();
2✔
467

468
        put_args.key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_A, "www.example.com");
1✔
469
        ASSERT_NOT_NULL(put_args.key);
1✔
470
        put_args.rcode = DNS_RCODE_SUCCESS;
1✔
471
        answer_add_a(&put_args, put_args.key, 0xc0a8017f, 3600, 0);
1✔
472

473
        ASSERT_OK(cache_put(&cache, &put_args));
1✔
474
        ASSERT_TRUE(dns_cache_is_empty(&cache));
1✔
475
}
1✔
476

477
TEST(dns_a_to_cname_success_is_cached) {
1✔
478
        _cleanup_(dns_cache_unrefp) DnsCache cache = new_cache();
1✔
479
        _cleanup_(put_args_unrefp) PutArgs put_args = mk_put_args();
2✔
480
        _cleanup_(dns_resource_key_unrefp) DnsResourceKey *key = NULL;
1✔
481

482
        put_args.key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_A, "www.example.com");
1✔
483
        ASSERT_NOT_NULL(put_args.key);
1✔
484
        put_args.rcode = DNS_RCODE_SUCCESS;
1✔
485

486
        key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_CNAME, "www.example.com");
1✔
487
        ASSERT_NOT_NULL(key);
1✔
488
        answer_add_cname(&put_args, key, "example.com", 3600, DNS_ANSWER_CACHEABLE);
1✔
489

490
        ASSERT_OK(cache_put(&cache, &put_args));
1✔
491
        ASSERT_FALSE(dns_cache_is_empty(&cache));
1✔
492
}
1✔
493

494
TEST(dns_a_to_cname_success_escaped_name_returns_error) {
1✔
495
        _cleanup_(dns_cache_unrefp) DnsCache cache = new_cache();
1✔
496
        _cleanup_(put_args_unrefp) PutArgs put_args = mk_put_args();
2✔
497
        _cleanup_(dns_resource_key_unrefp) DnsResourceKey *key = NULL;
1✔
498

499
        put_args.key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_A, "www.example.com");
1✔
500
        ASSERT_NOT_NULL(put_args.key);
1✔
501
        put_args.rcode = DNS_RCODE_SUCCESS;
1✔
502

503
        key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_CNAME, "www.\\example.com");
1✔
504
        ASSERT_NOT_NULL(key);
1✔
505
        answer_add_cname(&put_args, key, "example.com", 3600, DNS_ANSWER_CACHEABLE);
1✔
506

507
        ASSERT_ERROR(cache_put(&cache, &put_args), EINVAL);
1✔
508
        ASSERT_TRUE(dns_cache_is_empty(&cache));
1✔
509
}
1✔
510

511
/* ================================================================
512
 * dns_cache_lookup()
513
 * ================================================================ */
514

515
TEST(dns_cache_lookup_miss) {
1✔
516
        _cleanup_(dns_cache_unrefp) DnsCache cache = new_cache();
1✔
517
        _cleanup_(dns_answer_unrefp) DnsAnswer *ret_answer = NULL;
1✔
518
        _cleanup_(dns_packet_unrefp) DnsPacket *ret_full_packet = NULL;
1✔
519
        _cleanup_(dns_resource_key_unrefp) DnsResourceKey *key = NULL;
×
520
        int query_flags, ret_rcode;
1✔
521
        uint64_t ret_query_flags;
1✔
522

523
        key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_A, "www.example.com");
1✔
524
        ASSERT_NOT_NULL(key);
1✔
525
        query_flags = 0;
1✔
526
        ASSERT_FALSE(dns_cache_lookup(&cache, key, query_flags, &ret_rcode, &ret_answer, &ret_full_packet, &ret_query_flags, NULL));
1✔
527

528
        ASSERT_EQ(cache.n_hit, 0u);
1✔
529
        ASSERT_EQ(cache.n_miss, 1u);
1✔
530

531
        ASSERT_EQ(ret_rcode, DNS_RCODE_SUCCESS);
1✔
532
        ASSERT_EQ(ret_query_flags, 0u);
1✔
533

534
        ASSERT_EQ(dns_answer_size(ret_answer), 0u);
1✔
535
}
1✔
536

537
TEST(dns_cache_lookup_success) {
1✔
538
        _cleanup_(dns_cache_unrefp) DnsCache cache = new_cache();
1✔
539
        _cleanup_(put_args_unrefp) PutArgs put_args = mk_put_args();
2✔
540
        _cleanup_(dns_answer_unrefp) DnsAnswer *ret_answer = NULL;
1✔
541
        _cleanup_(dns_packet_unrefp) DnsPacket *ret_full_packet = NULL;
1✔
542
        _cleanup_(dns_resource_record_unrefp) DnsResourceRecord *rr = NULL;
1✔
543
        _cleanup_(dns_resource_key_unrefp) DnsResourceKey *key = NULL;
1✔
544
        int query_flags, ret_rcode;
1✔
545
        uint64_t ret_query_flags;
1✔
546

547
        put_args.key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_A, "www.example.com");
1✔
548
        ASSERT_NOT_NULL(put_args.key);
1✔
549
        put_args.rcode = DNS_RCODE_SUCCESS;
1✔
550
        answer_add_a(&put_args, put_args.key, 0xc0a8017f, 3600, DNS_ANSWER_CACHEABLE);
1✔
551
        cache_put(&cache, &put_args);
1✔
552

553
        ASSERT_EQ(dns_cache_size(&cache), 1u);
1✔
554

555
        key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_A, "www.example.com");
1✔
556
        ASSERT_NOT_NULL(key);
1✔
557
        query_flags = 0;
1✔
558
        ASSERT_OK_POSITIVE(dns_cache_lookup(&cache, key, query_flags, &ret_rcode, &ret_answer, &ret_full_packet, &ret_query_flags, NULL));
1✔
559

560
        ASSERT_EQ(cache.n_hit, 1u);
1✔
561
        ASSERT_EQ(cache.n_miss, 0u);
1✔
562

563
        ASSERT_EQ(ret_rcode, DNS_RCODE_SUCCESS);
1✔
564
        ASSERT_EQ(ret_query_flags, SD_RESOLVED_CONFIDENTIAL);
1✔
565

566
        ASSERT_EQ(dns_answer_size(ret_answer), 1u);
2✔
567

568
        rr = dns_resource_record_new_full(DNS_CLASS_IN, DNS_TYPE_A, "www.example.com");
1✔
569
        ASSERT_NOT_NULL(rr);
1✔
570
        rr->a.in_addr.s_addr = htobe32(0xc0a8017f);
1✔
571
        ASSERT_TRUE(dns_answer_contains(ret_answer, rr));
1✔
572
}
1✔
573

574
TEST(dns_cache_lookup_clamp_ttl) {
1✔
575
        _cleanup_(dns_cache_unrefp) DnsCache cache = new_cache();
1✔
576
        _cleanup_(put_args_unrefp) PutArgs put_args = mk_put_args();
2✔
577
        _cleanup_(dns_answer_unrefp) DnsAnswer *ret_answer = NULL;
1✔
578
        _cleanup_(dns_packet_unrefp) DnsPacket *ret_full_packet = NULL;
1✔
579
        _cleanup_(dns_resource_record_unrefp) DnsResourceRecord *rr = NULL;
1✔
580
        _cleanup_(dns_resource_key_unrefp) DnsResourceKey *key = NULL;
1✔
581
        int query_flags, ret_rcode;
1✔
582
        uint64_t ret_query_flags;
1✔
583

584
        put_args.key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_A, "www.example.com");
1✔
585
        ASSERT_NOT_NULL(put_args.key);
1✔
586
        put_args.rcode = DNS_RCODE_SUCCESS;
1✔
587
        answer_add_a(&put_args, put_args.key, 0xc0a8017f, 3600, DNS_ANSWER_CACHEABLE);
1✔
588
        cache_put(&cache, &put_args);
1✔
589

590
        ASSERT_EQ(dns_cache_size(&cache), 1u);
1✔
591

592
        key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_A, "www.example.com");
1✔
593
        ASSERT_NOT_NULL(key);
1✔
594
        query_flags = SD_RESOLVED_CLAMP_TTL;
1✔
595
        ASSERT_OK_POSITIVE(dns_cache_lookup(&cache, key, query_flags, &ret_rcode, &ret_answer, &ret_full_packet, &ret_query_flags, NULL));
1✔
596

597
        ASSERT_EQ(cache.n_hit, 1u);
1✔
598
        ASSERT_EQ(cache.n_miss, 0u);
1✔
599

600
        ASSERT_EQ(ret_rcode, DNS_RCODE_SUCCESS);
1✔
601
        ASSERT_EQ(ret_query_flags, SD_RESOLVED_CONFIDENTIAL);
1✔
602

603
        ASSERT_EQ(dns_answer_size(ret_answer), 1u);
2✔
604

605
        rr = dns_resource_record_new_full(DNS_CLASS_IN, DNS_TYPE_A, "www.example.com");
1✔
606
        ASSERT_NOT_NULL(rr);
1✔
607
        rr->a.in_addr.s_addr = htobe32(0xc0a8017f);
1✔
608
        ASSERT_TRUE(dns_answer_contains(ret_answer, rr));
1✔
609
}
1✔
610

611
TEST(dns_cache_lookup_returns_most_recent_response) {
1✔
612
        _cleanup_(dns_cache_unrefp) DnsCache cache = new_cache();
1✔
613
        _cleanup_(put_args_unrefp) PutArgs args1 = mk_put_args(), args2 = mk_put_args();
2✔
614
        _cleanup_(dns_answer_unrefp) DnsAnswer *ret_answer = NULL;
1✔
615
        _cleanup_(dns_packet_unrefp) DnsPacket *ret_full_packet = NULL;
1✔
616
        _cleanup_(dns_resource_key_unrefp) DnsResourceKey *key = NULL;
1✔
617
        DnsResourceRecord *rr = NULL;
1✔
618
        int query_flags, ret_rcode;
1✔
619
        uint64_t ret_query_flags;
1✔
620

621
        args1.key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_A, "www.example.com");
1✔
622
        ASSERT_NOT_NULL(args1.key);
1✔
623
        args1.rcode = DNS_RCODE_SUCCESS;
1✔
624
        answer_add_a(&args1, args1.key, 0xc0a8017f, 3600, DNS_ANSWER_CACHEABLE);
1✔
625
        cache_put(&cache, &args1);
1✔
626

627
        args2.key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_A, "www.example.com");
1✔
628
        ASSERT_NOT_NULL(args2.key);
1✔
629
        args2.rcode = DNS_RCODE_SUCCESS;
1✔
630
        answer_add_a(&args2, args2.key, 0x7f01a8c0, 2400, DNS_ANSWER_CACHEABLE);
1✔
631
        cache_put(&cache, &args2);
1✔
632

633
        ASSERT_EQ(dns_cache_size(&cache), 1u);
1✔
634

635
        key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_A, "www.example.com");
1✔
636
        ASSERT_NOT_NULL(key);
1✔
637
        query_flags = 0;
1✔
638
        ASSERT_OK_POSITIVE(dns_cache_lookup(&cache, key, query_flags, &ret_rcode, &ret_answer, &ret_full_packet, &ret_query_flags, NULL));
1✔
639

640
        ASSERT_EQ(cache.n_hit, 1u);
1✔
641
        ASSERT_EQ(cache.n_miss, 0u);
1✔
642

643
        ASSERT_EQ(ret_rcode, DNS_RCODE_SUCCESS);
1✔
644
        ASSERT_EQ(ret_query_flags, SD_RESOLVED_CONFIDENTIAL);
1✔
645

646
        ASSERT_EQ(dns_answer_size(ret_answer), 1u);
2✔
647

648
        rr = dns_resource_record_new_full(DNS_CLASS_IN, DNS_TYPE_A, "www.example.com");
1✔
649
        ASSERT_NOT_NULL(rr);
1✔
650
        rr->a.in_addr.s_addr = htobe32(0x7f01a8c0);
1✔
651
        ASSERT_TRUE(dns_answer_contains(ret_answer, rr));
1✔
652
        dns_resource_record_unref(rr);
1✔
653

654
        rr = dns_resource_record_new_full(DNS_CLASS_IN, DNS_TYPE_A, "www.example.com");
1✔
655
        ASSERT_NOT_NULL(rr);
1✔
656
        rr->a.in_addr.s_addr = htobe32(0xc0a8017f);
1✔
657
        ASSERT_FALSE(dns_answer_contains(ret_answer, rr));
1✔
658
        dns_resource_record_unref(rr);
1✔
659
}
1✔
660

661
TEST(dns_cache_lookup_retains_multiple_answers_from_one_response) {
1✔
662
        _cleanup_(dns_cache_unrefp) DnsCache cache = new_cache();
1✔
663
        _cleanup_(put_args_unrefp) PutArgs put_args = mk_put_args();
2✔
664
        _cleanup_(dns_answer_unrefp) DnsAnswer *ret_answer = NULL;
1✔
665
        _cleanup_(dns_packet_unrefp) DnsPacket *ret_full_packet = NULL;
1✔
666
        _cleanup_(dns_resource_key_unrefp) DnsResourceKey *key = NULL;
1✔
667
        DnsResourceRecord *rr = NULL;
1✔
668
        int query_flags, ret_rcode;
1✔
669
        uint64_t ret_query_flags;
1✔
670

671
        put_args.key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_A, "www.example.com");
1✔
672
        ASSERT_NOT_NULL(put_args.key);
1✔
673
        put_args.rcode = DNS_RCODE_SUCCESS;
1✔
674
        answer_add_a(&put_args, put_args.key, 0xc0a8017f, 3600, DNS_ANSWER_CACHEABLE);
1✔
675
        answer_add_a(&put_args, put_args.key, 0x7f01a8cc, 3600, DNS_ANSWER_CACHEABLE);
1✔
676
        cache_put(&cache, &put_args);
1✔
677

678
        ASSERT_EQ(dns_cache_size(&cache), 1u);
1✔
679

680
        key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_A, "www.example.com");
1✔
681
        ASSERT_NOT_NULL(key);
1✔
682
        query_flags = 0;
1✔
683
        ASSERT_OK_POSITIVE(dns_cache_lookup(&cache, key, query_flags, &ret_rcode, &ret_answer, &ret_full_packet, &ret_query_flags, NULL));
1✔
684

685
        ASSERT_EQ(cache.n_hit, 1u);
1✔
686
        ASSERT_EQ(cache.n_miss, 0u);
1✔
687

688
        ASSERT_EQ(ret_rcode, DNS_RCODE_SUCCESS);
1✔
689
        ASSERT_EQ(ret_query_flags, SD_RESOLVED_CONFIDENTIAL);
1✔
690

691
        ASSERT_EQ(dns_answer_size(ret_answer), 2u);
2✔
692

693
        rr = dns_resource_record_new_full(DNS_CLASS_IN, DNS_TYPE_A, "www.example.com");
1✔
694
        ASSERT_NOT_NULL(rr);
1✔
695
        rr->a.in_addr.s_addr = htobe32(0x7f01a8cc);
1✔
696
        ASSERT_TRUE(dns_answer_contains(ret_answer, rr));
1✔
697
        dns_resource_record_unref(rr);
1✔
698

699
        rr = dns_resource_record_new_full(DNS_CLASS_IN, DNS_TYPE_A, "www.example.com");
1✔
700
        ASSERT_NOT_NULL(rr);
1✔
701
        rr->a.in_addr.s_addr = htobe32(0xc0a8017f);
1✔
702
        ASSERT_TRUE(dns_answer_contains(ret_answer, rr));
1✔
703
        dns_resource_record_unref(rr);
1✔
704
}
1✔
705

706
TEST(dns_cache_lookup_nxdomain) {
1✔
707
        _cleanup_(dns_cache_unrefp) DnsCache cache = new_cache();
1✔
708
        _cleanup_(put_args_unrefp) PutArgs put_args = mk_put_args();
2✔
709
        _cleanup_(dns_answer_unrefp) DnsAnswer *ret_answer = NULL;
1✔
710
        _cleanup_(dns_packet_unrefp) DnsPacket *ret_full_packet = NULL;
1✔
711
        _cleanup_(dns_resource_record_unrefp) DnsResourceRecord *rr = NULL;
1✔
712
        _cleanup_(dns_resource_key_unrefp) DnsResourceKey *key = NULL;
1✔
713
        int query_flags, ret_rcode;
1✔
714
        uint64_t ret_query_flags;
1✔
715

716
        put_args.key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_A, "www.example.com");
1✔
717
        ASSERT_NOT_NULL(put_args.key);
1✔
718
        put_args.rcode = DNS_RCODE_NXDOMAIN;
1✔
719
        dns_answer_add_soa(put_args.answer, "example.com", 3600, 0);
1✔
720
        cache_put(&cache, &put_args);
1✔
721

722
        ASSERT_EQ(dns_cache_size(&cache), 1u);
1✔
723

724
        key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_A, "www.example.com");
1✔
725
        ASSERT_NOT_NULL(key);
1✔
726
        query_flags = 0;
1✔
727
        ASSERT_OK_POSITIVE(dns_cache_lookup(&cache, key, query_flags, &ret_rcode, &ret_answer, &ret_full_packet, &ret_query_flags, NULL));
1✔
728

729
        ASSERT_EQ(cache.n_hit, 1u);
1✔
730
        ASSERT_EQ(cache.n_miss, 0u);
1✔
731

732
        ASSERT_EQ(ret_rcode, DNS_RCODE_NXDOMAIN);
1✔
733
        ASSERT_EQ(ret_query_flags, (SD_RESOLVED_AUTHENTICATED | SD_RESOLVED_CONFIDENTIAL));
1✔
734

735
        ASSERT_EQ(dns_answer_size(ret_answer), 1u);
2✔
736

737
        rr = dns_resource_record_new_full(DNS_CLASS_IN, DNS_TYPE_SOA, "example.com");
1✔
738
        ASSERT_NOT_NULL(rr);
1✔
739
        rr->soa.mname = checked_strdup("example.com");
1✔
740
        rr->soa.rname = checked_strdup("root.example.com");
1✔
741
        rr->soa.serial = 1;
1✔
742
        rr->soa.refresh = 1;
1✔
743
        rr->soa.retry = 1;
1✔
744
        rr->soa.expire = 1;
1✔
745
        rr->soa.minimum = 3600;
1✔
746
        ASSERT_TRUE(dns_answer_contains(ret_answer, rr));
1✔
747
}
1✔
748

749
TEST(dns_cache_lookup_any_always_misses) {
1✔
750
        _cleanup_(dns_cache_unrefp) DnsCache cache = new_cache();
1✔
751
        _cleanup_(put_args_unrefp) PutArgs put_args = mk_put_args();
2✔
752
        _cleanup_(dns_answer_unrefp) DnsAnswer *ret_answer = NULL;
1✔
753
        _cleanup_(dns_packet_unrefp) DnsPacket *ret_full_packet = NULL;
1✔
754
        _cleanup_(dns_resource_key_unrefp) DnsResourceKey *key = NULL;
×
755
        int query_flags, ret_rcode;
1✔
756
        uint64_t ret_query_flags;
1✔
757

758
        put_args.key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_A, "www.example.com");
1✔
759
        ASSERT_NOT_NULL(put_args.key);
1✔
760
        put_args.rcode = DNS_RCODE_SUCCESS;
1✔
761
        answer_add_a(&put_args, put_args.key, 0xc0a8017f, 3600, DNS_ANSWER_CACHEABLE);
1✔
762
        cache_put(&cache, &put_args);
1✔
763

764
        ASSERT_EQ(dns_cache_size(&cache), 1u);
1✔
765

766
        key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_ANY, "www.example.com");
1✔
767
        ASSERT_NOT_NULL(key);
1✔
768
        query_flags = 0;
1✔
769
        ASSERT_FALSE(dns_cache_lookup(&cache, key, query_flags, &ret_rcode, &ret_answer, &ret_full_packet, &ret_query_flags, NULL));
1✔
770

771
        ASSERT_EQ(cache.n_hit, 0u);
1✔
772
        ASSERT_EQ(cache.n_miss, 1u);
1✔
773

774
        ASSERT_EQ(ret_rcode, DNS_RCODE_SUCCESS);
1✔
775
        ASSERT_EQ(ret_query_flags, 0u);
1✔
776

777
        ASSERT_EQ(dns_answer_size(ret_answer), 0u);
1✔
778
}
1✔
779

780
TEST(dns_cache_lookup_mdns_multiple_shared_responses_are_cached) {
1✔
781
        _cleanup_(dns_cache_unrefp) DnsCache cache = new_cache();
1✔
782
        _cleanup_(put_args_unrefp) PutArgs args1 = mk_put_args(), args2 = mk_put_args();
2✔
783
        _cleanup_(dns_answer_unrefp) DnsAnswer *ret_answer = NULL;
1✔
784
        _cleanup_(dns_packet_unrefp) DnsPacket *ret_full_packet = NULL;
1✔
785
        DnsResourceKey *key = NULL;
1✔
786
        DnsResourceRecord *rr = NULL;
1✔
787
        int query_flags, ret_rcode;
1✔
788
        uint64_t ret_query_flags;
1✔
789

790
        args1.protocol = DNS_PROTOCOL_MDNS;
1✔
791
        args1.rcode = DNS_RCODE_SUCCESS;
1✔
792
        key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_A, "example.com");
1✔
793
        ASSERT_NOT_NULL(key);
1✔
794
        answer_add_a(&args1, key, 0xc0a8017f, 3600, DNS_ANSWER_CACHEABLE | DNS_ANSWER_SHARED_OWNER);
1✔
795
        ASSERT_OK(cache_put(&cache, &args1));
1✔
796
        dns_resource_key_unref(key);
1✔
797

798
        args2.protocol = DNS_PROTOCOL_MDNS;
1✔
799
        args2.rcode = DNS_RCODE_SUCCESS;
1✔
800
        key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_A, "example.com");
1✔
801
        ASSERT_NOT_NULL(key);
1✔
802
        answer_add_a(&args2, key, 0x7f01a8cc, 3600, DNS_ANSWER_CACHEABLE | DNS_ANSWER_SHARED_OWNER);
1✔
803
        ASSERT_OK(cache_put(&cache, &args2));
1✔
804
        dns_resource_key_unref(key);
1✔
805

806
        ASSERT_FALSE(dns_cache_is_empty(&cache));
1✔
807
        ASSERT_EQ(dns_cache_size(&cache), 1u);
1✔
808

809
        key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_A, "example.com");
1✔
810
        ASSERT_NOT_NULL(key);
1✔
811
        query_flags = 0;
1✔
812
        ASSERT_OK_POSITIVE(dns_cache_lookup(&cache, key, query_flags, &ret_rcode, &ret_answer, &ret_full_packet, &ret_query_flags, NULL));
1✔
813
        dns_resource_key_unref(key);
1✔
814

815
        ASSERT_EQ(cache.n_hit, 1u);
1✔
816
        ASSERT_EQ(cache.n_miss, 0u);
1✔
817

818
        ASSERT_EQ(ret_rcode, DNS_RCODE_SUCCESS);
1✔
819
        ASSERT_EQ(ret_query_flags, SD_RESOLVED_CONFIDENTIAL);
1✔
820

821
        ASSERT_EQ(dns_answer_size(ret_answer), 2u);
2✔
822

823
        rr = dns_resource_record_new_full(DNS_CLASS_IN, DNS_TYPE_A, "example.com");
1✔
824
        ASSERT_NOT_NULL(rr);
1✔
825
        rr->a.in_addr.s_addr = htobe32(0xc0a8017f);
1✔
826
        ASSERT_TRUE(dns_answer_contains(ret_answer, rr));
1✔
827
        dns_resource_record_unref(rr);
1✔
828

829
        rr = dns_resource_record_new_full(DNS_CLASS_IN, DNS_TYPE_A, "example.com");
1✔
830
        ASSERT_NOT_NULL(rr);
1✔
831
        rr->a.in_addr.s_addr = htobe32(0x7f01a8cc);
1✔
832
        ASSERT_TRUE(dns_answer_contains(ret_answer, rr));
1✔
833
        dns_resource_record_unref(rr);
1✔
834
}
1✔
835

836
TEST(dns_cache_lookup_mdns_multiple_unshared_responses_are_not_cached) {
1✔
837
        _cleanup_(dns_cache_unrefp) DnsCache cache = new_cache();
1✔
838
        _cleanup_(put_args_unrefp) PutArgs args1 = mk_put_args(), args2 = mk_put_args();
2✔
839
        _cleanup_(dns_answer_unrefp) DnsAnswer *ret_answer = NULL;
1✔
840
        _cleanup_(dns_packet_unrefp) DnsPacket *ret_full_packet = NULL;
1✔
841
        DnsResourceKey *key = NULL;
1✔
842
        DnsResourceRecord *rr = NULL;
1✔
843
        int query_flags, ret_rcode;
1✔
844
        uint64_t ret_query_flags;
1✔
845

846
        args1.protocol = DNS_PROTOCOL_MDNS;
1✔
847
        args1.rcode = DNS_RCODE_SUCCESS;
1✔
848
        key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_A, "example.com");
1✔
849
        ASSERT_NOT_NULL(key);
1✔
850
        answer_add_a(&args1, key, 0xc0a8017f, 3600, DNS_ANSWER_CACHEABLE);
1✔
851
        ASSERT_OK(cache_put(&cache, &args1));
1✔
852
        dns_resource_key_unref(key);
1✔
853

854
        args2.protocol = DNS_PROTOCOL_MDNS;
1✔
855
        args2.rcode = DNS_RCODE_SUCCESS;
1✔
856
        key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_A, "example.com");
1✔
857
        ASSERT_NOT_NULL(key);
1✔
858
        answer_add_a(&args2, key, 0x7f01a8cc, 3600, DNS_ANSWER_CACHEABLE);
1✔
859
        ASSERT_OK(cache_put(&cache, &args2));
1✔
860
        dns_resource_key_unref(key);
1✔
861

862
        ASSERT_FALSE(dns_cache_is_empty(&cache));
1✔
863
        ASSERT_EQ(dns_cache_size(&cache), 1u);
1✔
864

865
        key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_A, "example.com");
1✔
866
        ASSERT_NOT_NULL(key);
1✔
867
        query_flags = 0;
1✔
868
        ASSERT_OK_POSITIVE(dns_cache_lookup(&cache, key, query_flags, &ret_rcode, &ret_answer, &ret_full_packet, &ret_query_flags, NULL));
1✔
869
        dns_resource_key_unref(key);
1✔
870

871
        ASSERT_EQ(cache.n_hit, 1u);
1✔
872
        ASSERT_EQ(cache.n_miss, 0u);
1✔
873

874
        ASSERT_EQ(ret_rcode, DNS_RCODE_SUCCESS);
1✔
875
        ASSERT_EQ(ret_query_flags, SD_RESOLVED_CONFIDENTIAL);
1✔
876

877
        ASSERT_EQ(dns_answer_size(ret_answer), 1u);
2✔
878

879
        rr = dns_resource_record_new_full(DNS_CLASS_IN, DNS_TYPE_A, "example.com");
1✔
880
        ASSERT_NOT_NULL(rr);
1✔
881
        rr->a.in_addr.s_addr = htobe32(0xc0a8017f);
1✔
882
        ASSERT_FALSE(dns_answer_contains(ret_answer, rr));
1✔
883
        dns_resource_record_unref(rr);
1✔
884

885
        rr = dns_resource_record_new_full(DNS_CLASS_IN, DNS_TYPE_A, "example.com");
1✔
886
        ASSERT_NOT_NULL(rr);
1✔
887
        rr->a.in_addr.s_addr = htobe32(0x7f01a8cc);
1✔
888
        ASSERT_TRUE(dns_answer_contains(ret_answer, rr));
1✔
889
        dns_resource_record_unref(rr);
1✔
890
}
1✔
891

892
/* ================================================================
893
 * dns_cache_prune(), dns_cache_expiry_in_one_second()
894
 * ================================================================ */
895

896
TEST(dns_cache_prune) {
1✔
897
        _cleanup_(dns_cache_unrefp) DnsCache cache = new_cache();
1✔
898
        _cleanup_(put_args_unrefp) PutArgs put_args = mk_put_args();
2✔
899
        DnsResourceKey *key = NULL;
1✔
900

901
        key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_A, "ns1.example.com");
1✔
902
        ASSERT_NOT_NULL(key);
1✔
903
        answer_add_a(&put_args, key, 0xc0a8017f, 1, DNS_ANSWER_CACHEABLE);
1✔
904
        dns_resource_key_unref(key);
1✔
905

906
        key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_A, "ns2.example.com");
1✔
907
        ASSERT_NOT_NULL(key);
1✔
908
        answer_add_a(&put_args, key, 0x7f01a8cc, 3, DNS_ANSWER_CACHEABLE);
1✔
909
        dns_resource_key_unref(key);
1✔
910

911
        cache_put(&cache, &put_args);
1✔
912

913
        dns_cache_prune(&cache);
1✔
914
        ASSERT_EQ(dns_cache_size(&cache), 2u);
1✔
915
        ASSERT_TRUE(dns_cache_expiry_in_one_second(&cache, now(CLOCK_BOOTTIME)));
1✔
916

917
        sleep(2);
1✔
918

919
        dns_cache_prune(&cache);
1✔
920
        ASSERT_EQ(dns_cache_size(&cache), 1u);
1✔
921
        ASSERT_TRUE(dns_cache_expiry_in_one_second(&cache, now(CLOCK_BOOTTIME)));
1✔
922

923
        sleep(2);
1✔
924

925
        dns_cache_prune(&cache);
1✔
926
        ASSERT_TRUE(dns_cache_is_empty(&cache));
1✔
927
        ASSERT_FALSE(dns_cache_expiry_in_one_second(&cache, now(CLOCK_BOOTTIME)));
1✔
928
}
1✔
929

930
/* ================================================================
931
 * dns_cache_check_conflicts()
932
 * ================================================================ */
933

934
TEST(dns_cache_check_conflicts_same_key_and_owner) {
1✔
935
        _cleanup_(dns_cache_unrefp) DnsCache cache = new_cache();
1✔
936
        _cleanup_(put_args_unrefp) PutArgs put_args = mk_put_args();
2✔
937
        _cleanup_(dns_resource_record_unrefp) DnsResourceRecord *rr = NULL;
1✔
938

939
        put_args.key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_A, "ns1.example.com");
1✔
940
        ASSERT_NOT_NULL(put_args.key);
1✔
941
        answer_add_a(&put_args, put_args.key, 0xc0a8017f, 3600, DNS_ANSWER_CACHEABLE);
1✔
942
        cache_put(&cache, &put_args);
1✔
943

944
        union in_addr_union owner_addr = { .in.s_addr = htobe32(0x01020304) };
1✔
945

946
        rr = dns_resource_record_new_full(DNS_CLASS_IN, DNS_TYPE_A, "ns1.example.com");
1✔
947
        ASSERT_NOT_NULL(rr);
1✔
948
        ASSERT_FALSE(dns_cache_check_conflicts(&cache, rr, AF_INET, &owner_addr));
1✔
949
}
1✔
950

951
TEST(dns_cache_check_conflicts_same_key_different_owner) {
1✔
952
        _cleanup_(dns_cache_unrefp) DnsCache cache = new_cache();
1✔
953
        _cleanup_(put_args_unrefp) PutArgs put_args = mk_put_args();
2✔
954
        _cleanup_(dns_resource_record_unrefp) DnsResourceRecord *rr = NULL;
1✔
955

956
        put_args.key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_A, "ns1.example.com");
1✔
957
        ASSERT_NOT_NULL(put_args.key);
1✔
958
        answer_add_a(&put_args, put_args.key, 0xc0a8017f, 3600, DNS_ANSWER_CACHEABLE);
1✔
959
        cache_put(&cache, &put_args);
1✔
960

961
        union in_addr_union owner_addr = { .in.s_addr = htobe32(0x01020305) };
1✔
962

963
        rr = dns_resource_record_new_full(DNS_CLASS_IN, DNS_TYPE_A, "ns1.example.com");
1✔
964
        ASSERT_NOT_NULL(rr);
1✔
965
        ASSERT_TRUE(dns_cache_check_conflicts(&cache, rr, AF_INET, &owner_addr));
1✔
966
}
1✔
967

968
TEST(dns_cache_check_conflicts_different_key) {
1✔
969
        _cleanup_(dns_cache_unrefp) DnsCache cache = new_cache();
1✔
970
        _cleanup_(put_args_unrefp) PutArgs put_args = mk_put_args();
2✔
971
        _cleanup_(dns_resource_record_unrefp) DnsResourceRecord *rr = NULL;
1✔
972

973
        put_args.key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_A, "ns2.example.com");
1✔
974
        ASSERT_NOT_NULL(put_args.key);
1✔
975
        answer_add_a(&put_args, put_args.key, 0xc0a8017f, 3600, DNS_ANSWER_CACHEABLE);
1✔
976
        cache_put(&cache, &put_args);
1✔
977

978
        union in_addr_union owner_addr = { .in.s_addr = htobe32(0x01020305) };
1✔
979

980
        rr = dns_resource_record_new_full(DNS_CLASS_IN, DNS_TYPE_A, "ns1.example.com");
1✔
981
        ASSERT_NOT_NULL(rr);
1✔
982
        ASSERT_FALSE(dns_cache_check_conflicts(&cache, rr, AF_INET, &owner_addr));
1✔
983
}
1✔
984

985
/* ================================================================
986
 * dns_cache_export_shared_to_packet()
987
 * ================================================================ */
988

989
TEST(dns_cache_export_shared_to_packet) {
1✔
990
        _cleanup_(dns_cache_unrefp) DnsCache cache = new_cache();
1✔
991
        _cleanup_(put_args_unrefp) PutArgs args1 = mk_put_args(), args2 = mk_put_args();
2✔
992
        _cleanup_(dns_packet_unrefp) DnsPacket *packet = NULL;
1✔
993
        DnsResourceKey *key = NULL;
1✔
994

995
        args1.protocol = DNS_PROTOCOL_MDNS;
1✔
996
        args1.rcode = DNS_RCODE_SUCCESS;
1✔
997

998
        key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_A, "shared.example.com");
1✔
999
        ASSERT_NOT_NULL(key);
1✔
1000
        answer_add_a(&args1, key, 0xc0a8017f, 3600, DNS_ANSWER_CACHEABLE | DNS_ANSWER_SHARED_OWNER);
1✔
1001
        dns_resource_key_unref(key);
1✔
1002

1003
        key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_A, "unshared.example.com");
1✔
1004
        ASSERT_NOT_NULL(key);
1✔
1005
        answer_add_a(&args1, key, 0xa87f01c0, 2400, DNS_ANSWER_CACHEABLE);
1✔
1006
        dns_resource_key_unref(key);
1✔
1007

1008
        cache_put(&cache, &args1);
1✔
1009

1010
        args2.protocol = DNS_PROTOCOL_DNS;
1✔
1011
        args2.key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_A, "dns.example.com");
1✔
1012
        ASSERT_NOT_NULL(args2.key);
1✔
1013
        args2.rcode = DNS_RCODE_SUCCESS;
1✔
1014
        answer_add_a(&args2, args2.key, 0xa9fe0100, 2400, DNS_ANSWER_CACHEABLE);
1✔
1015
        cache_put(&cache, &args2);
1✔
1016

1017
        dns_packet_new(&packet, DNS_PROTOCOL_MDNS, 0, DNS_PACKET_SIZE_MAX);
1✔
1018
        ASSERT_NOT_NULL(packet);
1✔
1019
        ASSERT_OK(dns_cache_export_shared_to_packet(&cache, packet, 0, 50));
1✔
1020

1021
        const uint8_t data[] = {
1✔
1022
                        0x00, 0x00,     0x00, 0x00,
1023
                        0x00, 0x00,     0x00, 0x01,     0x00, 0x00,     0x00, 0x00,
1024

1025
        /* name */      0x06, 's', 'h', 'a', 'r', 'e', 'd',
1026
                        0x07, 'e', 'x', 'a', 'm', 'p', 'l', 'e',
1027
                        0x03, 'c', 'o', 'm',
1028
                        0x00,
1029
        /* A */         0x00, 0x01,
1030
        /* IN */        0x00, 0x01,
1031
        /* ttl */       0x00, 0x00, 0x0e, 0x10,
1032
        /* rdata */     0x00, 0x04,
1033
        /* ip */        0xc0, 0xa8, 0x01, 0x7f
1034
        };
1035

1036
        ASSERT_EQ(packet->size, sizeof(data));
1✔
1037
        ASSERT_EQ(memcmp(DNS_PACKET_DATA(packet), data, sizeof(data)), 0);
2✔
1038
}
1✔
1039

1040
TEST(dns_cache_export_shared_to_packet_multi) {
1✔
1041
        _cleanup_(dns_cache_unrefp) DnsCache cache = new_cache();
1✔
1042
        _cleanup_(put_args_unrefp) PutArgs put_args = mk_put_args();
2✔
1043
        _cleanup_(dns_packet_unrefp) DnsPacket *packet = NULL;
1✔
1044
        DnsResourceKey *key = NULL;
1✔
1045

1046
        put_args.protocol = DNS_PROTOCOL_MDNS;
1✔
1047
        put_args.rcode = DNS_RCODE_SUCCESS;
1✔
1048

1049
        key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_A, "shared1.example.com");
1✔
1050
        ASSERT_NOT_NULL(key);
1✔
1051
        answer_add_a(&put_args, key, 0xc0a8017f, 3600, DNS_ANSWER_CACHEABLE | DNS_ANSWER_SHARED_OWNER);
1✔
1052
        dns_resource_key_unref(key);
1✔
1053

1054
        key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_A, "unshared.example.com");
1✔
1055
        ASSERT_NOT_NULL(key);
1✔
1056
        answer_add_a(&put_args, key, 0xa87f01c0, 2400, DNS_ANSWER_CACHEABLE);
1✔
1057
        dns_resource_key_unref(key);
1✔
1058

1059
        key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_A, "shared2.example.com");
1✔
1060
        ASSERT_NOT_NULL(key);
1✔
1061
        answer_add_a(&put_args, key, 0x7f01a8cc, 1800, DNS_ANSWER_CACHEABLE | DNS_ANSWER_SHARED_OWNER);
1✔
1062
        dns_resource_key_unref(key);
1✔
1063

1064
        cache_put(&cache, &put_args);
1✔
1065

1066
        dns_packet_new(&packet, DNS_PROTOCOL_MDNS, 0, DNS_PACKET_SIZE_MAX);
1✔
1067
        ASSERT_NOT_NULL(packet);
1✔
1068
        ASSERT_OK(dns_cache_export_shared_to_packet(&cache, packet, 0, 1));
1✔
1069

1070
        const uint8_t data1[] = {
1✔
1071
                        0x00, 0x00,     0x00, 0x00,
1072
                        0x00, 0x00,     0x00, 0x01,     0x00, 0x00,     0x00, 0x00,
1073

1074
        /* name */      0x07, 's', 'h', 'a', 'r', 'e', 'd', '1',
1075
                        0x07, 'e', 'x', 'a', 'm', 'p', 'l', 'e',
1076
                        0x03, 'c', 'o', 'm',
1077
                        0x00,
1078
        /* A */         0x00, 0x01,
1079
        /* IN */        0x00, 0x01,
1080
        /* ttl */       0x00, 0x00, 0x0e, 0x10,
1081
        /* rdata */     0x00, 0x04,
1082
        /* ip */        0xc0, 0xa8, 0x01, 0x7f
1083
        };
1084

1085
        const uint8_t data2[] = {
1✔
1086
                        0x00, 0x00,     0x00, 0x00,
1087
                        0x00, 0x00,     0x00, 0x01,     0x00, 0x00,     0x00, 0x00,
1088

1089
        /* name */      0x07, 's', 'h', 'a', 'r', 'e', 'd', '2',
1090
                        0x07, 'e', 'x', 'a', 'm', 'p', 'l', 'e',
1091
                        0x03, 'c', 'o', 'm',
1092
                        0x00,
1093
        /* A */         0x00, 0x01,
1094
        /* IN */        0x00, 0x01,
1095
        /* ttl */       0x00, 0x00, 0x07, 0x08,
1096
        /* rdata */     0x00, 0x04,
1097
        /* ip */        0x7f, 0x01, 0xa8, 0xcc
1098
        };
1099

1100
        size_t size1 = sizeof(data1), size2 = sizeof(data2);
1✔
1101

1102
        /* cache key order is not deterministic; the packets could come out in either order */
1103

1104
        if (memcmp(DNS_PACKET_DATA(packet), data1, size1) == 0) {
2✔
1105
                ASSERT_EQ(packet->size, size1);
1✔
1106
                ASSERT_EQ(memcmp(DNS_PACKET_DATA(packet), data1, size1), 0);
2✔
1107

1108
                ASSERT_EQ(packet->more->size, size2);
1✔
1109
                ASSERT_EQ(memcmp(DNS_PACKET_DATA(packet->more), data2, size2), 0);
2✔
1110
        } else {
UNCOV
1111
                ASSERT_EQ(packet->size, size2);
×
UNCOV
1112
                ASSERT_EQ(memcmp(DNS_PACKET_DATA(packet), data2, size2), 0);
×
1113

UNCOV
1114
                ASSERT_EQ(packet->more->size, size1);
×
UNCOV
1115
                ASSERT_EQ(memcmp(DNS_PACKET_DATA(packet->more), data1, size1), 0);
×
1116
        }
1117

1118
        ASSERT_NULL(packet->more->more);
1✔
1119
}
1✔
1120

1121
/* ================================================================
1122
 * dns_cache_dump()
1123
 * ================================================================ */
1124

1125
static int cmpstring(const void *a, const void *b) {
1✔
1126
        ASSERT_NOT_NULL(a);
1✔
1127
        ASSERT_NOT_NULL(b);
1✔
1128

1129
        return strcmp(*(const char **)a, *(const char **)b);
1✔
1130
}
1131

1132
static void check_dump_contents(FILE *f, const char **expected, size_t n) {
2✔
1133
        char *actual[n];
2✔
1134
        rewind(f);
2✔
1135

1136
        for (size_t i = 0; i < n; i++) {
5✔
1137
                size_t length = read_line(f, 1024, &actual[i]);
3✔
1138
                ASSERT_GT(length, 0u);
3✔
1139
        }
1140

1141
        qsort(actual, n, sizeof(char *), cmpstring);
2✔
1142

1143
        for (size_t i = 0; i < n; i++)
5✔
1144
                ASSERT_STREQ(actual[i], expected[i]);
3✔
1145

1146
        for (size_t i = 0; i < n; i++)
5✔
1147
                free(actual[i]);
3✔
1148
}
2✔
1149

1150
TEST(dns_cache_dump_single_a) {
1✔
1151
        _cleanup_(dns_cache_unrefp) DnsCache cache = new_cache();
1✔
1152
        _cleanup_(put_args_unrefp) PutArgs put_args = mk_put_args();
2✔
1153

1154
        put_args.key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_A, "www.example.com");
1✔
1155
        ASSERT_NOT_NULL(put_args.key);
1✔
1156
        put_args.rcode = DNS_RCODE_SUCCESS;
1✔
1157
        answer_add_a(&put_args, put_args.key, 0xc0a8017f, 3600, DNS_ANSWER_CACHEABLE);
1✔
1158
        cache_put(&cache, &put_args);
1✔
1159

1160
        ASSERT_EQ(dns_cache_size(&cache), 1u);
1✔
1161

1162
        _cleanup_(unlink_tempfilep) char p[] = "/tmp/dns-cache-dump-single-a-XXXXXX";
×
1163
        _cleanup_fclose_ FILE *f = NULL;
1✔
1164
        fmkostemp_safe(p, "r+", &f);
1✔
1165
        dns_cache_dump(&cache, f);
1✔
1166

1167
        const char *expected[] = {
1✔
1168
                "\twww.example.com IN A 192.168.1.127"
1169
        };
1170
        check_dump_contents(f, expected, 1);
1✔
1171
}
1✔
1172

1173
TEST(dns_cache_dump_a_with_cname) {
1✔
1174
        _cleanup_(dns_cache_unrefp) DnsCache cache = new_cache();
1✔
1175
        _cleanup_(put_args_unrefp) PutArgs put_args = mk_put_args();
2✔
1176
        _cleanup_(dns_resource_key_unrefp) DnsResourceKey *key = NULL;
1✔
1177

1178
        put_args.key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_A, "www.example.com");
1✔
1179
        ASSERT_NOT_NULL(put_args.key);
1✔
1180
        put_args.rcode = DNS_RCODE_SUCCESS;
1✔
1181

1182
        key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_CNAME, "www.example.com");
1✔
1183
        ASSERT_NOT_NULL(key);
1✔
1184
        answer_add_cname(&put_args, key, "example.com", 3600, DNS_ANSWER_CACHEABLE);
1✔
1185

1186
        dns_resource_key_unref(key);
1✔
1187
        key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_A, "example.com");
1✔
1188
        ASSERT_NOT_NULL(key);
1✔
1189
        answer_add_a(&put_args, key, 0xc0a8017f, 3600, DNS_ANSWER_CACHEABLE);
1✔
1190

1191
        cache_put(&cache, &put_args);
1✔
1192

1193
        ASSERT_EQ(dns_cache_size(&cache), 2u);
1✔
1194

1195
        _cleanup_(unlink_tempfilep) char p[] = "/tmp/dns-cache-dump-a-with-cname-XXXXXX";
×
1196
        _cleanup_fclose_ FILE *f = NULL;
1✔
1197
        fmkostemp_safe(p, "r+", &f);
1✔
1198
        dns_cache_dump(&cache, f);
1✔
1199

1200
        const char *expected[] = {
1✔
1201
                "\texample.com IN A 192.168.1.127",
1202
                "\twww.example.com IN CNAME example.com"
1203
        };
1204
        check_dump_contents(f, expected, 2);
1✔
1205
}
1✔
1206

1207
/* ================================================================
1208
 * dns_cache_dump_to_json()
1209
 * ================================================================ */
1210

1211
TEST(dns_cache_dump_json_basic) {
1✔
1212
        _cleanup_(dns_cache_unrefp) DnsCache cache = new_cache();
1✔
1213
        _cleanup_(put_args_unrefp) PutArgs put_args = mk_put_args();
1✔
1214
        _cleanup_(sd_json_variant_unrefp) sd_json_variant *json = NULL, *expected = NULL;
2✔
1215
        sd_json_variant *item = NULL, *rr = NULL;
1✔
1216
        _cleanup_free_ char *str = calloc(256, sizeof(char));
1✔
1217

1218
        ASSERT_NOT_NULL(str);
1✔
1219

1220
        put_args.key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_A, "www.example.com");
1✔
1221
        ASSERT_NOT_NULL(put_args.key);
1✔
1222
        put_args.rcode = DNS_RCODE_SUCCESS;
1✔
1223
        answer_add_a(&put_args, put_args.key, 0xc0a8017f, 3600, DNS_ANSWER_CACHEABLE);
1✔
1224
        cache_put(&cache, &put_args);
1✔
1225

1226
        ASSERT_EQ(dns_cache_size(&cache), 1u);
1✔
1227

1228
        ASSERT_OK(dns_cache_dump_to_json(&cache, &json));
1✔
1229
        ASSERT_NOT_NULL(json);
1✔
1230

1231
        ASSERT_TRUE(sd_json_variant_is_array(json));
1✔
1232
        ASSERT_EQ(sd_json_variant_elements(json), 1u);
1✔
1233

1234
        item = BY_IDX(json, 0);
1✔
1235
        ASSERT_NOT_NULL(item);
1✔
1236

1237
        sprintf(str, "{ \"class\": %d, \"type\": %d, \"name\": \"www.example.com\" }", DNS_CLASS_IN, DNS_TYPE_A);
1✔
1238
        ASSERT_OK(sd_json_parse(str, 0, &expected, NULL, NULL));
1✔
1239
        ASSERT_TRUE(sd_json_variant_equal(BY_KEY(item, "key"), expected));
1✔
1240

1241
        ASSERT_TRUE(sd_json_variant_is_array(BY_KEY(item, "rrs")));
1✔
1242
        ASSERT_EQ(sd_json_variant_elements(BY_KEY(item, "rrs")), 1u);
1✔
1243

1244
        rr = BY_KEY(BY_IDX(BY_KEY(item, "rrs"), 0), "rr");
1✔
1245
        ASSERT_NOT_NULL(rr);
1✔
1246
        ASSERT_TRUE(sd_json_variant_equal(BY_KEY(rr, "key"), expected));
1✔
1247

1248
        sd_json_variant_unref(expected);
1✔
1249

1250
        sprintf(str, "[192, 168, 1, 127]");
1✔
1251
        ASSERT_OK(sd_json_parse(str, 0, &expected, NULL, NULL));
1✔
1252
        ASSERT_TRUE(sd_json_variant_equal(BY_KEY(rr, "address"), expected));
1✔
1253

1254
        ASSERT_TRUE(sd_json_variant_is_string(BY_KEY(BY_IDX(BY_KEY(item, "rrs"), 0), "raw")));
1✔
1255
        ASSERT_TRUE(sd_json_variant_is_integer(BY_KEY(item, "until")));
1✔
1256
}
1✔
1257

1258
DEFINE_TEST_MAIN(LOG_DEBUG);
1✔
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc