diff --git a/test/schema_test.c b/test/schema_test.c
index eddaa74403da4cf4eebf5eebb2fc223cc43e5a57..f1b345b81d5ac06bc7c5bc4f75b972998e1e57b3 100644
--- a/test/schema_test.c
+++ b/test/schema_test.c
@@ -71,6 +71,25 @@ static void null_test_success(void **state) {
(void) state; /* unused */
}
+
+static void test_parse_invalid_schema(void **state)
+{
+ (void) state; /* unused */
+
+ /* invalid json */
+ cp("/usr/share/rpcd/schemas/invalid.json", "/opt/work/test/files/invalid_schemas/incomplete.json");
+ schema_validator_init();
+ schema_validator_destroy();
+ remove("/usr/share/rpcd/schemas/invalid.json");
+
+ /* missing object key */
+ cp("/usr/share/rpcd/schemas/invalid.json", "/opt/work/test/files/invalid_schemas/missing_object.json");
+ schema_validator_init();
+ schema_validator_destroy();
+ remove("/usr/share/rpcd/schemas/invalid.json");
+}
+
+
static void test_validator_create_nothing(void **state)
{
(void) state; /* unused */
@@ -89,43 +108,55 @@ static void test_validator_create(void **state)
schema_validator_destroy();
}
-static void test_validate_input_document_jobj(void **state)
+static void validate_doc_blob(char *path, char *obj, char *met, bool outcome, enum schema_call_t type)
+{
+ struct blob_buf bb = {0};
+ bool validated;
+
+ blob_buf_init(&bb, 0);
+
+ if (!blobmsg_add_json_from_file(&bb, path))
+ return;
+
+ validated = schema_validator_validate_blob(bb.head, obj, met, type);
+ assert_int_equal(validated, outcome);
+
+ blob_buf_free(&bb);
+}
+
+static void validate_doc_jobj(char *path, char *obj, char *met, bool outcome, enum schema_call_t type)
{
- (void) state; /* unused */
struct json_object *doc;
bool validated;
+ doc = json_object_from_file(path);
+ validated = schema_validator_validate_jobj(doc, obj, met, type);
+ assert_int_equal(validated, outcome);
+ json_object_put(doc);
+}
+
+static void test_validate_input_document_jobj(void **state)
+{
+ (void) state; /* unused */
+
schema_validator_init();
- doc = json_object_from_file("/opt/work/test/files/input/wifi.status.json");
- printf("%s %d doc = %s\n", __func__, __LINE__, json_object_get_string(doc));
- validated = schema_validator_validate_jobj(doc, "wifi", "status", SCHEMA_INPUT_CALL);
- assert_true(validated);
- json_object_put(doc);
+ /* test valid input (empty object) */
+ validate_doc_jobj("/opt/work/test/files/input/wifi.status.json", "wifi", "status", true, SCHEMA_INPUT_CALL);
- doc = json_object_from_file("/opt/work/test/files/input/wifi.wps.status.json");
- printf("%s %d doc = %s\n", __func__, __LINE__, json_object_get_string(doc));
- validated = schema_validator_validate_jobj(doc, "wifi.wps", "status", SCHEMA_INPUT_CALL);
- assert_true(validated);
- json_object_put(doc);
+ /* test valid input (valid interface) */
+ validate_doc_jobj("/opt/work/test/files/input/wifi.wps.status.json", "wifi", "status", true, SCHEMA_INPUT_CALL);
- doc = json_object_from_file("/opt/work/test/files/input/wifi.wps.status.failure.json");
- printf("%s %d doc = %s\n", __func__, __LINE__, json_object_get_string(doc));
- validated = schema_validator_validate_jobj(doc, "wifi.wps", "status", SCHEMA_INPUT_CALL);
- assert_false(validated);
- json_object_put(doc);
+ /* test invalid input (integer rather than interface) */
+ validate_doc_jobj("/opt/work/test/files/input/wifi.wps.status.failure.json", "wifi.wps", "status", false, SCHEMA_INPUT_CALL);
- doc = json_object_from_file("/opt/work/test/files/input/wifi.ap.stations.json");
- printf("%s %d doc = %s\n", __func__, __LINE__, json_object_get_string(doc));
- validated = schema_validator_validate_jobj(doc, "wifi.ap.wlan2", "stations", SCHEMA_INPUT_CALL);
- assert_true(validated);
- json_object_put(doc);
+ /* test valid input (valid MAC) */
+ /* parsed using regex */
+ validate_doc_jobj("/opt/work/test/files/input/wifi.ap.stations.json", "wifi.ap.wlan2", "stations", true, SCHEMA_INPUT_CALL);
- doc = json_object_from_file("/opt/work/test/files/input/wifi.ap.stations.failure.json");
- printf("%s %d doc = %s\n", __func__, __LINE__, json_object_get_string(doc));
- validated = schema_validator_validate_jobj(doc, "wifi.ap.wlan2", "stations", SCHEMA_INPUT_CALL);
- assert_false(validated);
- json_object_put(doc);
+ /* test invalid input (invalid MAC) */
+ /* parsed using regex */
+ validate_doc_jobj("/opt/work/test/files/input/wifi.ap.stations.failure.json", "wifi.ap.wlan2", "stations", false, SCHEMA_INPUT_CALL);
schema_validator_destroy();
}
@@ -133,28 +164,59 @@ static void test_validate_input_document_jobj(void **state)
static void test_validate_output_document_jobj(void **state)
{
- struct json_object *doc;
- bool validated;
+ (void *) state;
schema_validator_init();
- doc = json_object_from_file("/opt/work/test/files/output/wifi.status.json");
- printf("%s %d doc = %s\n", __func__, __LINE__, json_object_get_string(doc));
- validated = schema_validator_validate_jobj(doc, "wifi", "status", SCHEMA_OUTPUT_CALL);
- assert_true(validated);
- json_object_put(doc);
+ /* test valid output with complex types */
+ validate_doc_jobj("/opt/work/test/files/output/wifi.status.json", "wifi", "status", true, SCHEMA_OUTPUT_CALL);
+ /* test invalid output with complex types */
+ validate_doc_jobj("/opt/work/test/files/output/wifi.status.failure.json", "wifi", "status", false, SCHEMA_OUTPUT_CALL);
+ /* test valid empty output*/
+ validate_doc_jobj("/opt/work/test/files/output/wifi.start.json", "wifi.wps", "start", true, SCHEMA_OUTPUT_CALL);
- doc = json_object_from_file("/opt/work/test/files/output/wifi.status.failure.json");
- printf("%s %d doc = %s\n", __func__, __LINE__, json_object_get_string(doc));
- validated = schema_validator_validate_jobj(doc, "wifi", "status", SCHEMA_OUTPUT_CALL);
- assert_false(validated);
- json_object_put(doc);
+ schema_validator_destroy();
+}
- doc = json_object_from_file("/opt/work/test/files/output/wifi.start.json");
- printf("%s %d doc = %s\n", __func__, __LINE__, json_object_get_string(doc));
- validated = schema_validator_validate_jobj(doc, "wifi.wps", "start", SCHEMA_OUTPUT_CALL);
- assert_true(validated);
- json_object_put(doc);
+static void test_validate_input_document_blob(void **state)
+{
+ (void) state; /* unused */
+
+ schema_validator_init();
+
+ /* test valid input (empty object) */
+ validate_doc_blob("/opt/work/test/files/input/wifi.status.json", "wifi", "status", true, SCHEMA_INPUT_CALL);
+
+ /* test valid input (valid interface) */
+ validate_doc_blob("/opt/work/test/files/input/wifi.wps.status.json", "wifi", "status", true, SCHEMA_INPUT_CALL);
+
+ /* test invalid input (integer rather than interface) */
+ validate_doc_blob("/opt/work/test/files/input/wifi.wps.status.failure.json", "wifi.wps", "status", false, SCHEMA_INPUT_CALL);
+
+ /* test valid input (valid MAC) */
+ /* parsed using regex */
+ validate_doc_blob("/opt/work/test/files/input/wifi.ap.stations.json", "wifi.ap.wlan2", "stations", true, SCHEMA_INPUT_CALL);
+
+ /* test invalid input (invalid MAC) */
+ /* parsed using regex */
+ validate_doc_blob("/opt/work/test/files/input/wifi.ap.stations.failure.json", "wifi.ap.wlan2", "stations", false, SCHEMA_INPUT_CALL);
+
+ schema_validator_destroy();
+}
+
+
+static void test_validate_output_document_blob(void **state)
+{
+ (void *) state;
+
+ schema_validator_init();
+
+ /* test valid output with complex types */
+ validate_doc_blob("/opt/work/test/files/output/wifi.status.json", "wifi", "status", true, SCHEMA_OUTPUT_CALL);
+ /* test invalid output with complex types */
+ validate_doc_blob("/opt/work/test/files/output/wifi.status.failure.json", "wifi", "status", false, SCHEMA_OUTPUT_CALL);
+ /* test valid empty output*/
+ validate_doc_blob("/opt/work/test/files/output/wifi.start.json", "wifi.wps", "start", true, SCHEMA_OUTPUT_CALL);
schema_validator_destroy();
}
@@ -165,27 +227,30 @@ static int create_setup(void** state) {
cp("/usr/share/rpcd/schemas/wifi.wps.json", "/opt/work/ubus/wifi.wps.json");
cp("/usr/share/rpcd/schemas/wifi.radio.json", "/opt/work/ubus/wifi.radio.json");
cp("/usr/share/rpcd/schemas/wifi.ap.json", "/opt/work/ubus/wifi.ap.json");
-
+ printf("finished copying schemas\n");
return 0;
}
static int create_teardown(void** state) {
+ printf("removing schemas\n");
remove("/usr/share/rpcd/schemas/wifi.json");
remove("/usr/share/rpcd/schemas/wifi.wps.json");
remove("/usr/share/rpcd/schemas/wifi.radio.json");
remove("/usr/share/rpcd/schemas/wifi.ap.json");
-
+ printf("finished removing schemas\n");
return 0;
}
int main(void) {
const struct CMUnitTest tests[] = {
- cmocka_unit_test(null_test_success),
cmocka_unit_test(test_validator_create_nothing),
+ cmocka_unit_test(test_parse_invalid_schema),
cmocka_unit_test_setup_teardown(test_validator_create, create_setup, create_teardown),
cmocka_unit_test_setup_teardown(test_validate_input_document_jobj, create_setup, create_teardown),
cmocka_unit_test_setup_teardown(test_validate_output_document_jobj, create_setup, create_teardown),
+ cmocka_unit_test_setup_teardown(test_validate_input_document_blob, create_setup, create_teardown),
+ cmocka_unit_test_setup_teardown(test_validate_output_document_blob, create_setup, create_teardown),
};
return cmocka_run_group_tests(tests, NULL, NULL);