]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
json: add unit tests for json_dispatch_const_unit_name()
authorIvan Kruglov <mail@ikruglov.com>
Mon, 26 May 2025 10:02:59 +0000 (03:02 -0700)
committerIvan Kruglov <mail@ikruglov.com>
Tue, 27 May 2025 08:16:56 +0000 (01:16 -0700)
src/test/test-json.c

index 482e053e7acbaa12a7a9efa370a0dfb89035a904..065e84dad77538d39761833c3da192a349ee7c8c 100644 (file)
@@ -1422,4 +1422,57 @@ TEST(fd_info) {
         pidref_done(&pidref);
 }
 
+TEST(unit_name) {
+        _cleanup_(sd_json_variant_unrefp) sd_json_variant *v = NULL;
+        ASSERT_OK(sd_json_buildo(&v,
+                                 SD_JSON_BUILD_PAIR_STRING("plain", "myservice.service"),
+                                 SD_JSON_BUILD_PAIR_STRING("instance", "myservice@instance1.service"),
+                                 SD_JSON_BUILD_PAIR_STRING("template", "myservice@.service")));
+
+        sd_json_variant_dump(v, SD_JSON_FORMAT_COLOR|SD_JSON_FORMAT_PRETTY, NULL, NULL);
+
+        struct {
+                const char *plain, *instance, *template;
+        } data = {};
+
+        ASSERT_OK(sd_json_dispatch(
+                                  v,
+                                  (const sd_json_dispatch_field[]) {
+                                          { "plain",    SD_JSON_VARIANT_STRING, json_dispatch_const_unit_name, voffsetof(data, plain),    SD_JSON_STRICT },
+                                          { "instance", SD_JSON_VARIANT_STRING, json_dispatch_const_unit_name, voffsetof(data, instance), 0              },
+                                          { "template", SD_JSON_VARIANT_STRING, json_dispatch_const_unit_name, voffsetof(data, template), SD_JSON_RELAX  },
+                                          {},
+                                  },
+                                  /* flags= */ 0,
+                                  &data));
+
+        ASSERT_STREQ(data.plain, "myservice.service");
+        ASSERT_STREQ(data.instance, "myservice@instance1.service");
+        ASSERT_STREQ(data.template, "myservice@.service");
+
+        ASSERT_ERROR(sd_json_dispatch(
+                                  v,
+                                  (const sd_json_dispatch_field[]) {
+                                          { "plain",    SD_JSON_VARIANT_STRING, json_dispatch_const_unit_name, voffsetof(data, plain),    SD_JSON_RELAX  },
+                                          /* instance value is not allowed with SD_JSON_STRICT */
+                                          { "instance", SD_JSON_VARIANT_STRING, json_dispatch_const_unit_name, voffsetof(data, instance), SD_JSON_STRICT },
+                                          { "template", SD_JSON_VARIANT_STRING, json_dispatch_const_unit_name, voffsetof(data, template), SD_JSON_RELAX  },
+                                          {},
+                                  },
+                                  /* flags= */ 0,
+                                  &data), EINVAL);
+
+        ASSERT_ERROR(sd_json_dispatch(
+                                  v,
+                                  (const sd_json_dispatch_field[]) {
+                                          { "plain",    SD_JSON_VARIANT_STRING, json_dispatch_const_unit_name, voffsetof(data, plain),    SD_JSON_RELAX  },
+                                          { "instance", SD_JSON_VARIANT_STRING, json_dispatch_const_unit_name, voffsetof(data, instance), SD_JSON_RELAX  },
+                                          /* template value is not allowed by default */
+                                          { "template", SD_JSON_VARIANT_STRING, json_dispatch_const_unit_name, voffsetof(data, template), 0 },
+                                          {},
+                                  },
+                                  /* flags= */ 0,
+                                  &data), EINVAL);
+}
+
 DEFINE_TEST_MAIN(LOG_DEBUG);