Skip to content
Snippets Groups Projects
Commit 5807ef0d authored by Jakob Olsson's avatar Jakob Olsson
Browse files

refactor tests, add blob and invalid schema tests

parent 80d1ffd9
No related branches found
No related tags found
No related merge requests found
...@@ -71,6 +71,25 @@ static void null_test_success(void **state) { ...@@ -71,6 +71,25 @@ static void null_test_success(void **state) {
(void) state; /* unused */ (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) static void test_validator_create_nothing(void **state)
{ {
(void) state; /* unused */ (void) state; /* unused */
...@@ -89,43 +108,55 @@ static void test_validator_create(void **state) ...@@ -89,43 +108,55 @@ static void test_validator_create(void **state)
schema_validator_destroy(); 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; struct json_object *doc;
bool validated; 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(); schema_validator_init();
doc = json_object_from_file("/opt/work/test/files/input/wifi.status.json"); /* test valid input (empty object) */
printf("%s %d doc = %s\n", __func__, __LINE__, json_object_get_string(doc)); validate_doc_jobj("/opt/work/test/files/input/wifi.status.json", "wifi", "status", true, SCHEMA_INPUT_CALL);
validated = schema_validator_validate_jobj(doc, "wifi", "status", SCHEMA_INPUT_CALL);
assert_true(validated);
json_object_put(doc);
doc = json_object_from_file("/opt/work/test/files/input/wifi.wps.status.json"); /* test valid input (valid interface) */
printf("%s %d doc = %s\n", __func__, __LINE__, json_object_get_string(doc)); validate_doc_jobj("/opt/work/test/files/input/wifi.wps.status.json", "wifi", "status", true, SCHEMA_INPUT_CALL);
validated = schema_validator_validate_jobj(doc, "wifi.wps", "status", SCHEMA_INPUT_CALL);
assert_true(validated);
json_object_put(doc);
doc = json_object_from_file("/opt/work/test/files/input/wifi.wps.status.failure.json"); /* test invalid input (integer rather than interface) */
printf("%s %d doc = %s\n", __func__, __LINE__, json_object_get_string(doc)); validate_doc_jobj("/opt/work/test/files/input/wifi.wps.status.failure.json", "wifi.wps", "status", false, SCHEMA_INPUT_CALL);
validated = schema_validator_validate_jobj(doc, "wifi.wps", "status", SCHEMA_INPUT_CALL);
assert_false(validated);
json_object_put(doc);
doc = json_object_from_file("/opt/work/test/files/input/wifi.ap.stations.json"); /* test valid input (valid MAC) */
printf("%s %d doc = %s\n", __func__, __LINE__, json_object_get_string(doc)); /* parsed using regex */
validated = schema_validator_validate_jobj(doc, "wifi.ap.wlan2", "stations", SCHEMA_INPUT_CALL); validate_doc_jobj("/opt/work/test/files/input/wifi.ap.stations.json", "wifi.ap.wlan2", "stations", true, SCHEMA_INPUT_CALL);
assert_true(validated);
json_object_put(doc);
doc = json_object_from_file("/opt/work/test/files/input/wifi.ap.stations.failure.json"); /* test invalid input (invalid MAC) */
printf("%s %d doc = %s\n", __func__, __LINE__, json_object_get_string(doc)); /* parsed using regex */
validated = schema_validator_validate_jobj(doc, "wifi.ap.wlan2", "stations", SCHEMA_INPUT_CALL); validate_doc_jobj("/opt/work/test/files/input/wifi.ap.stations.failure.json", "wifi.ap.wlan2", "stations", false, SCHEMA_INPUT_CALL);
assert_false(validated);
json_object_put(doc);
schema_validator_destroy(); schema_validator_destroy();
} }
...@@ -133,28 +164,59 @@ static void test_validate_input_document_jobj(void **state) ...@@ -133,28 +164,59 @@ static void test_validate_input_document_jobj(void **state)
static void test_validate_output_document_jobj(void **state) static void test_validate_output_document_jobj(void **state)
{ {
struct json_object *doc; (void *) state;
bool validated;
schema_validator_init(); schema_validator_init();
doc = json_object_from_file("/opt/work/test/files/output/wifi.status.json"); /* test valid output with complex types */
printf("%s %d doc = %s\n", __func__, __LINE__, json_object_get_string(doc)); validate_doc_jobj("/opt/work/test/files/output/wifi.status.json", "wifi", "status", true, SCHEMA_OUTPUT_CALL);
validated = schema_validator_validate_jobj(doc, "wifi", "status", SCHEMA_OUTPUT_CALL); /* test invalid output with complex types */
assert_true(validated); validate_doc_jobj("/opt/work/test/files/output/wifi.status.failure.json", "wifi", "status", false, SCHEMA_OUTPUT_CALL);
json_object_put(doc); /* 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"); schema_validator_destroy();
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);
doc = json_object_from_file("/opt/work/test/files/output/wifi.start.json"); static void test_validate_input_document_blob(void **state)
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); (void) state; /* unused */
assert_true(validated);
json_object_put(doc); 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(); schema_validator_destroy();
} }
...@@ -165,27 +227,30 @@ static int create_setup(void** state) { ...@@ -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.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.radio.json", "/opt/work/ubus/wifi.radio.json");
cp("/usr/share/rpcd/schemas/wifi.ap.json", "/opt/work/ubus/wifi.ap.json"); cp("/usr/share/rpcd/schemas/wifi.ap.json", "/opt/work/ubus/wifi.ap.json");
printf("finished copying schemas\n");
return 0; return 0;
} }
static int create_teardown(void** state) { static int create_teardown(void** state) {
printf("removing schemas\n");
remove("/usr/share/rpcd/schemas/wifi.json"); remove("/usr/share/rpcd/schemas/wifi.json");
remove("/usr/share/rpcd/schemas/wifi.wps.json"); remove("/usr/share/rpcd/schemas/wifi.wps.json");
remove("/usr/share/rpcd/schemas/wifi.radio.json"); remove("/usr/share/rpcd/schemas/wifi.radio.json");
remove("/usr/share/rpcd/schemas/wifi.ap.json"); remove("/usr/share/rpcd/schemas/wifi.ap.json");
printf("finished removing schemas\n");
return 0; return 0;
} }
int main(void) { int main(void) {
const struct CMUnitTest tests[] = { const struct CMUnitTest tests[] = {
cmocka_unit_test(null_test_success),
cmocka_unit_test(test_validator_create_nothing), 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_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_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_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); return cmocka_run_group_tests(tests, NULL, NULL);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment