diff --git a/json/ubus copy 2.json b/json/ubus copy 2.json
deleted file mode 100644
index 9d12f24c56e732d298a84755be9d347b87d38adf..0000000000000000000000000000000000000000
--- a/json/ubus copy 2.json
+++ /dev/null
@@ -1,18 +0,0 @@
-{
- "object": "demo",
- "calls": [
- {
- "call": "unixtime",
- "args": {
- "format": "%d--%d--%d %d::%d::%d"
- }
- },
- {
- "call": "unixtimer"
- },
- {
- "call": "unixtime"
- }
- ]
-}
-
diff --git a/json/ubus copy.json b/json/ubus copy.json
deleted file mode 100644
index 9d12f24c56e732d298a84755be9d347b87d38adf..0000000000000000000000000000000000000000
--- a/json/ubus copy.json
+++ /dev/null
@@ -1,18 +0,0 @@
-{
- "object": "demo",
- "calls": [
- {
- "call": "unixtime",
- "args": {
- "format": "%d--%d--%d %d::%d::%d"
- }
- },
- {
- "call": "unixtimer"
- },
- {
- "call": "unixtime"
- }
- ]
-}
-
diff --git a/json/ubus.json b/json/ubus.json
index 9d12f24c56e732d298a84755be9d347b87d38adf..12881c3879c28f68dd7ee86eb548c9e8e01c2e17 100644
--- a/json/ubus.json
+++ b/json/ubus.json
@@ -1,18 +1,31 @@
{
"object": "demo",
- "calls": [
+ "methods": [
{
- "call": "unixtime",
+ "method": "unixtime",
+ "rc":0
+ },
+ {
+ "method": "unixtime",
"args": {
"format": "%d--%d--%d %d::%d::%d"
- }
+ },
+ "rc":0
},
{
- "call": "unixtimer"
+ "method": "unixtime",
+ "args": {
+ "format": 0
+ },
+ "rc":0
},
{
- "call": "unixtime"
+ "method": "unixtime-format",
+ "args": {
+ "format": 0
+ },
+ "rc":2
+
}
]
}
-
diff --git a/main.c b/main.c
index 26f2db3d62c7d01aabe75a6a057bb7729fb5aaa6..e1968d40ad481c8ef5d2a2178b9af8091db75b0a 100644
--- a/main.c
+++ b/main.c
@@ -136,7 +136,7 @@ int main(int argc, char *argv[]) {
}
} else if (global_args.path == NULL && global_args.dir_path == NULL) {
printf("trying default file... \n");
- validate_path("./ubus.json");
+ validate_path("./json/ubus.json");
}
return 0;
diff --git a/ubus.json b/ubus.json
deleted file mode 100644
index 36f29f690674fb0ed71d5e0cf76f9ca4861b7a50..0000000000000000000000000000000000000000
--- a/ubus.json
+++ /dev/null
@@ -1,18 +0,0 @@
-{
- "object": "demo",
- "calls": [
- {
- "call": "unixtime",
- "args": {
- "format": "%d--%d--%d %d::%d::%d"
- }
- },
- {
- "call": "unixtime"
- },
- {
- "call": "unixtime"
- }
- ]
-}
-
diff --git a/ubus_api_validator.c b/ubus_api_validator.c
index e98cf225745a4ebd370e977830616faad01d4fe6..6557b4d2678c53e69ea907d32b1e3db6b3a44140 100644
--- a/ubus_api_validator.c
+++ b/ubus_api_validator.c
@@ -49,16 +49,16 @@ int validate_path(char *path) {
static int validate_jobj(struct json_object *jobj) {
- struct json_object *result = NULL;
struct json_object *ubus_object;
- struct json_object *ubus_calls;
+ struct json_object *ubus_methods;
+
const char *object;
int failed = 0;
/*Now printing the json object*/
// printf("\n json object: %s \n", json_object_to_json_string(jobj));
json_object_object_get_ex(jobj, "object", &ubus_object);
- json_object_object_get_ex(jobj, "calls", &ubus_calls);
+ json_object_object_get_ex(jobj, "methods", &ubus_methods);
// init TAP
plan(NO_PLAN);
@@ -66,51 +66,68 @@ static int validate_jobj(struct json_object *jobj) {
int i = 0;
object = json_object_get_string(ubus_object);
- for (i = 0; i < json_object_array_length(ubus_calls); i++) {
+ for (i = 0; i < json_object_array_length(ubus_methods); i++) {
struct json_object *tmp;
struct json_object *ubus_method;
struct json_object *ubus_args;
+ struct json_object *ubus_rc;
+ struct ubus_result *res = NULL;
+
const char *method;
const char *args;
+ int rc = 0;
+ const char *defstr = "no result";
- int rv;
+ int rv = 0;
+ int rv_validation = 0;
+ char *format = NULL;
- tmp = json_object_array_get_idx(ubus_calls, i);
+ tmp = json_object_array_get_idx(ubus_methods, i);
// printf("json-array[%d] = %s\n", i, json_object_to_json_string(tmp));
- json_object_object_get_ex(tmp, "call", &ubus_method);
+ json_object_object_get_ex(tmp, "method", &ubus_method);
json_object_object_get_ex(tmp, "args", &ubus_args);
+ json_object_object_get_ex(tmp, "rc", &ubus_rc);
method = json_object_get_string(ubus_method);
args = json_object_get_string(ubus_args);
+ rc = json_object_get_int(ubus_rc);
- // printf("object: %s\n", object);
- // printf("call: %s\n", method);
- // printf("args: %s\n", args);
+ res = ubus_call(object, method, args);
- result = ubus_call(object, method, args);
+ if (res->rc == 0) {
- // printf("\n json_object_to_json_string of result: %s \n",
- // json_object_to_json_string(result));
+ rv = asprintf(&format, "object: %s method:%s args:%s rc: %d result:%s",
+ object, method, args, rc,
+ json_object_to_json_string(res->result));
- char *res;
- rv = asprintf(&res, "object: %s method:%s args:%s result:%s", object,
- method, args, json_object_to_json_string(result));
- if (rv == -1) {
- fprintf(stderr, "asprintf() failed: insufficient memory!\n");
- return EXIT_FAILURE;
- }
+ if (rv == -1) {
+ fprintf(stderr, "asprintf() failed: insufficient memory!\n");
+ return EXIT_FAILURE;
+ }
- rv = schema_validator_validate_jobj(result, object, method,
- SCHEMA_OUTPUT_CALL);
+ rv_validation = schema_validator_validate_jobj(
+ res->result, object, method, SCHEMA_OUTPUT_CALL);
+ } else {
+ rv = asprintf(&format, "object: %s method:%s args:%s rc: %d result:%s",
+ object, method, args, rc, defstr);
- if (rv) {
- ok(true, res);
+ if (rv == -1) {
+ fprintf(stderr, "asprintf() failed: insufficient memory!\n");
+ return EXIT_FAILURE;
+ }
+ }
+
+ // rc == res->rc handles negative testing
+ if (rv_validation || (rc == res->rc)) {
+ ok(true, format);
} else {
- ok(false, res);
+ ok(false, format);
failed = 1;
}
+
+ free(res);
}
done_testing();
diff --git a/ubus_call.c b/ubus_call.c
index 88a4cfa826ff901a55630243f29d8f6ef75a8738..354bc8a8b087cfc505f035d759573c5506fcf310 100644
--- a/ubus_call.c
+++ b/ubus_call.c
@@ -66,13 +66,14 @@ void parse_ubus_cb(struct ubus_request *req, int type, struct blob_attr *msg) {
free(json_str);
}
-json_object *ubus_call(const char *object, const char *method,
- const char *args) {
+struct ubus_result *ubus_call(const char *object, const char *method,
+ const char *args) {
struct blob_buf buff = {0};
int rv = -1;
uint32_t obj_id;
struct json_object *json_ubus_result;
+ struct ubus_result *res = NULL;
ubus_lookup_id(ctx, object, &obj_id);
@@ -100,13 +101,15 @@ json_object *ubus_call(const char *object, const char *method,
(ubus_data_handler_t)parse_ubus_cb, &json_ubus_result,
UBUS_DEFAULT_TIMEOUT);
- if (rv) {
- fprintf(stderr, "ubus_invoke error code %d \n", rv);
- json_ubus_result = NULL;
- }
+ res = calloc(1, sizeof(struct ubus_result));
+ if (!res)
+ goto out;
+
+ res->rc = rv;
+ res->result = json_ubus_result;
out:
blob_buf_free(&buff);
- return json_ubus_result;
+ return res;
}
\ No newline at end of file
diff --git a/ubus_call.h b/ubus_call.h
index e1c18153a70c0d9e7ccb21ee8c36e36dcb5f5359..cefdc5716994ef1e79f6857c21ab5fe163304f86 100644
--- a/ubus_call.h
+++ b/ubus_call.h
@@ -6,11 +6,15 @@
#include <libubox/blobmsg_json.h>
#include <libubus.h>
#include <stdio.h>
+struct ubus_result
+{
+ json_object *result;
+ int rc;
+};
int ubus_init(void);
-json_object *ubus_call(const char *object, const char *method, const char *args);
-
+struct ubus_result *ubus_call(const char *object, const char *method, const char *args);
#endif /* UBUS_CALL_H */
\ No newline at end of file