]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
resolved: tests for dns_cache_dump_to_json()
authorJames Coglan <james@neighbourhood.ie>
Wed, 22 May 2024 14:54:36 +0000 (15:54 +0100)
committerJames Coglan <james@neighbourhood.ie>
Tue, 23 Jul 2024 13:08:31 +0000 (14:08 +0100)
src/resolve/test-dns-cache.c

index 11dea7002f4938b9dedcbab15a21f18897165606..2789549b248da40b855eba59d9a0205f15214b8e 100644 (file)
@@ -104,6 +104,15 @@ static void answer_add_cname(PutArgs *args, DnsResourceKey *key, const char *ali
         dns_answer_add(args->answer, rr, 1, flags, NULL);
 }
 
+#define BY_IDX(json, idx) sd_json_variant_by_index(json, idx)
+#define BY_KEY(json, key) sd_json_variant_by_key(json, key)
+#define INTVAL(json) sd_json_variant_integer(json)
+#define STRVAL(json) sd_json_variant_string(json)
+
+/* ================================================================
+ * dns_cache_put()
+ * ================================================================ */
+
 TEST(dns_a_success_is_cached) {
         _cleanup_(dns_cache_unrefp) DnsCache cache = new_cache();
         _cleanup_(put_args_unrefp) PutArgs put_args = mk_put_args();
@@ -298,4 +307,55 @@ TEST(dns_a_to_cname_success_escaped_name_returns_error) {
         ASSERT_TRUE(dns_cache_is_empty(&cache));
 }
 
+/* ================================================================
+ * dns_cache_dump_to_json()
+ * ================================================================ */
+
+TEST(dns_cache_dump_json_basic) {
+        _cleanup_(dns_cache_unrefp) DnsCache cache = new_cache();
+        _cleanup_(put_args_unrefp) PutArgs put_args = mk_put_args();
+        _cleanup_(sd_json_variant_unrefp) sd_json_variant *json = NULL, *expected = NULL;
+        sd_json_variant *item = NULL, *rr = NULL;
+        _cleanup_free_ char *str = calloc(256, sizeof(char));
+
+        ASSERT_NOT_NULL(str);
+
+        put_args.key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_A, "www.example.com");
+        ASSERT_NOT_NULL(put_args.key);
+        put_args.rcode = DNS_RCODE_SUCCESS;
+        answer_add_a(&put_args, put_args.key, 0xc0a8017f, 3600, DNS_ANSWER_CACHEABLE);
+        cache_put(&cache, &put_args);
+
+        ASSERT_EQ(dns_cache_size(&cache), 1u);
+
+        ASSERT_OK(dns_cache_dump_to_json(&cache, &json));
+        ASSERT_NOT_NULL(json);
+
+        ASSERT_TRUE(sd_json_variant_is_array(json));
+        ASSERT_EQ(sd_json_variant_elements(json), 1u);
+
+        item = BY_IDX(json, 0);
+        ASSERT_NOT_NULL(item);
+
+        sprintf(str, "{ \"class\": %d, \"type\": %d, \"name\": \"www.example.com\" }", DNS_CLASS_IN, DNS_TYPE_A);
+        ASSERT_OK(sd_json_parse(str, 0, &expected, NULL, NULL));
+        ASSERT_TRUE(sd_json_variant_equal(BY_KEY(item, "key"), expected));
+
+        ASSERT_TRUE(sd_json_variant_is_array(BY_KEY(item, "rrs")));
+        ASSERT_EQ(sd_json_variant_elements(BY_KEY(item, "rrs")), 1u);
+
+        rr = BY_KEY(BY_IDX(BY_KEY(item, "rrs"), 0), "rr");
+        ASSERT_NOT_NULL(rr);
+        ASSERT_TRUE(sd_json_variant_equal(BY_KEY(rr, "key"), expected));
+
+        sd_json_variant_unref(expected);
+
+        sprintf(str, "[192, 168, 1, 127]");
+        ASSERT_OK(sd_json_parse(str, 0, &expected, NULL, NULL));
+        ASSERT_TRUE(sd_json_variant_equal(BY_KEY(rr, "address"), expected));
+
+        ASSERT_TRUE(sd_json_variant_is_string(BY_KEY(BY_IDX(BY_KEY(item, "rrs"), 0), "raw")));
+        ASSERT_TRUE(sd_json_variant_is_integer(BY_KEY(item, "until")));
+}
+
 DEFINE_TEST_MAIN(LOG_DEBUG);