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