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);