1 /* SPDX-License-Identifier: LGPL-2.1+ */
8 #include "alloc-util.h"
10 #include "glob-util.h"
13 #include "resolved-dns-packet.h"
14 #include "resolved-dns-rr.h"
15 #include "path-util.h"
16 #include "string-util.h"
19 #include "unaligned.h"
21 #define HASH_KEY SD_ID128_MAKE(d3,1e,48,90,4b,fa,4c,fe,af,9d,d5,a1,d7,2e,8a,b1)
23 static void verify_rr_copy(DnsResourceRecord
*rr
) {
24 _cleanup_(dns_resource_record_unrefp
) DnsResourceRecord
*copy
= NULL
;
27 assert_se(copy
= dns_resource_record_copy(rr
));
28 assert_se(dns_resource_record_equal(copy
, rr
) > 0);
30 assert_se(a
= dns_resource_record_to_string(rr
));
31 assert_se(b
= dns_resource_record_to_string(copy
));
33 assert_se(streq(a
, b
));
36 static uint64_t hash(DnsResourceRecord
*rr
) {
39 siphash24_init(&state
, HASH_KEY
.bytes
);
40 dns_resource_record_hash_func(rr
, &state
);
41 return siphash24_finalize(&state
);
44 static void test_packet_from_file(const char* filename
, bool canonical
) {
45 _cleanup_free_
char *data
= NULL
;
46 size_t data_size
, packet_size
, offset
;
48 assert_se(read_full_file(filename
, &data
, &data_size
) >= 0);
50 assert_se(data_size
> 8);
52 log_info("============== %s %s==============", filename
, canonical
? "canonical " : "");
54 for (offset
= 0; offset
< data_size
; offset
+= 8 + packet_size
) {
55 _cleanup_(dns_packet_unrefp
) DnsPacket
*p
= NULL
, *p2
= NULL
;
56 _cleanup_(dns_resource_record_unrefp
) DnsResourceRecord
*rr
= NULL
, *rr2
= NULL
;
58 uint64_t hash1
, hash2
;
60 packet_size
= unaligned_read_le64(data
+ offset
);
61 assert_se(packet_size
> 0);
62 assert_se(offset
+ 8 + packet_size
<= data_size
);
64 assert_se(dns_packet_new(&p
, DNS_PROTOCOL_DNS
, 0, DNS_PACKET_SIZE_MAX
) >= 0);
66 assert_se(dns_packet_append_blob(p
, data
+ offset
+ 8, packet_size
, NULL
) >= 0);
67 assert_se(dns_packet_read_rr(p
, &rr
, NULL
, NULL
) >= 0);
71 s
= dns_resource_record_to_string(rr
);
77 assert_se(dns_resource_record_to_wire_format(rr
, canonical
) >= 0);
79 assert_se(dns_packet_new(&p2
, DNS_PROTOCOL_DNS
, 0, DNS_PACKET_SIZE_MAX
) >= 0);
80 assert_se(dns_packet_append_blob(p2
, rr
->wire_format
, rr
->wire_format_size
, NULL
) >= 0);
81 assert_se(dns_packet_read_rr(p2
, &rr2
, NULL
, NULL
) >= 0);
85 s2
= dns_resource_record_to_string(rr
);
87 assert_se(streq(s
, s2
));
90 assert_se(hash1
== hash2
);
94 int main(int argc
, char **argv
) {
96 _cleanup_free_
char *pkts_glob
= NULL
;
97 _cleanup_globfree_ glob_t g
= {};
100 log_parse_environment();
106 pkts_glob
= path_join(get_testdata_dir(), "test-resolve/*.pkts");
107 assert_se(glob(pkts_glob
, GLOB_NOSORT
, NULL
, &g
) == 0);
112 for (i
= 0; i
< N
; i
++) {
113 test_packet_from_file(fnames
[i
], false);
115 test_packet_from_file(fnames
[i
], true);