Skip to content
Snippets Groups Projects
ubus_api_validator.c 3.52 KiB
Newer Older
  • Learn to ignore specific revisions
  • Suru Dissanaike's avatar
    Suru Dissanaike committed
    /*
    
     * ubus_api_validator.c -
    
    Suru Dissanaike's avatar
    Suru Dissanaike committed
     *
     * Copyright (C) 2020 iopsys Software Solutions AB. All rights reserved.
     *
     *
     * This program is free software; you can redistribute it and/or
     * modify it under the terms of the GNU General Public License
     * version 2 as published by the Free Software Foundation.
     *
     * This program is distributed in the hope that it will be useful, but
     * WITHOUT ANY WARRANTY; without even the implied warranty of
     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     * General Public License for more details.
     *
     * You should have received a copy of the GNU General Public License
     * along with this program; if not, write to the Free Software
     * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
     * 02110-1301 USA
     */
    
    Suru Dissanaike's avatar
    Suru Dissanaike committed
    #define _GNU_SOURCE
    
    #include "ubus_api_validator.h"
    
    Suru Dissanaike's avatar
    Suru Dissanaike committed
    #include "ubus_call.h"
    
    #include <json-validator.h>
    #include <stdbool.h>
    #include <stdio.h>
    #include <stdlib.h>
    
    Suru Dissanaike's avatar
    Suru Dissanaike committed
    #include <tap.h>
    
    Suru Dissanaike's avatar
    Suru Dissanaike committed
    static int validate_jobj(struct json_object *jobj);
    
    Suru Dissanaike's avatar
    Suru Dissanaike committed
    int validate_path(char *path) {
    
      json_object *jobj;
      int result = -1;
    
    Suru Dissanaike's avatar
    Suru Dissanaike committed
      jobj = json_object_from_file(path);
      if (jobj == NULL) {
        perror("could not read json file");
        return result;
      }
    
    Suru Dissanaike's avatar
    Suru Dissanaike committed
      result = validate_jobj(jobj);
    
    Suru Dissanaike's avatar
    Suru Dissanaike committed
    static int validate_jobj(struct json_object *jobj) {
    
    Suru Dissanaike's avatar
    Suru Dissanaike committed
      struct json_object *ubus_object;
    
      struct json_object *ubus_methods;
    
    
    Suru Dissanaike's avatar
    Suru Dissanaike committed
      const char *object;
    
    Suru Dissanaike's avatar
    Suru Dissanaike committed
      int failed = 0;
    
    Suru Dissanaike's avatar
    Suru Dissanaike committed
    
      /*Now printing the json object*/
    
    Suru Dissanaike's avatar
    Suru Dissanaike committed
      // printf("\n json object: %s \n", json_object_to_json_string(jobj));
    
    Suru Dissanaike's avatar
    Suru Dissanaike committed
      json_object_object_get_ex(jobj, "object", &ubus_object);
    
      json_object_object_get_ex(jobj, "methods", &ubus_methods);
    
    Suru Dissanaike's avatar
    Suru Dissanaike committed
      // init TAP
      plan(NO_PLAN);
    
    
    Suru Dissanaike's avatar
    Suru Dissanaike committed
      int i = 0;
    
    Suru Dissanaike's avatar
    Suru Dissanaike committed
      object = json_object_get_string(ubus_object);
    
      for (i = 0; i < json_object_array_length(ubus_methods); i++) {
    
        struct json_object *tmp;
    
        struct json_object *ubus_method;
    
    Suru Dissanaike's avatar
    Suru Dissanaike committed
        struct json_object *ubus_args;
    
        struct json_object *ubus_rc;
        struct ubus_result *res = NULL;
    
    
    Suru Dissanaike's avatar
    Suru Dissanaike committed
        const char *method;
    
    Suru Dissanaike's avatar
    Suru Dissanaike committed
        const char *args;
    
        int rc = 0;
        const char *defstr = "no result";
    
        int rv_validation = 1;
    
        char *format = NULL;
    
        tmp = json_object_array_get_idx(ubus_methods, i);
    
    Suru Dissanaike's avatar
    Suru Dissanaike committed
        // printf("json-array[%d] = %s\n", i, json_object_to_json_string(tmp));
    
        json_object_object_get_ex(tmp, "method", &ubus_method);
    
    Suru Dissanaike's avatar
    Suru Dissanaike committed
        json_object_object_get_ex(tmp, "args", &ubus_args);
    
        json_object_object_get_ex(tmp, "rc", &ubus_rc);
    
    Suru Dissanaike's avatar
    Suru Dissanaike committed
        method = json_object_get_string(ubus_method);
    
    Suru Dissanaike's avatar
    Suru Dissanaike committed
        args = json_object_get_string(ubus_args);
    
        rc = json_object_get_int(ubus_rc);
    
        res = ubus_call(object, method, args);
    
        if (res->rc == 0) {
    
          rv = asprintf(&format, "object: %s method:%s args:%s rc: %d result:%s",
                        object, method, args, rc,
                        json_object_to_json_string(res->result));
    
          if (rv == -1) {
            fprintf(stderr, "asprintf() failed: insufficient memory!\n");
            return EXIT_FAILURE;
          }
    
          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 == -1) {
            fprintf(stderr, "asprintf() failed: insufficient memory!\n");
            return EXIT_FAILURE;
          }
        }
    
    
        if (rv_validation && rc == res->rc)
            ok(true, format);
        else {
    
            ok(false, format);
            failed = 1;
    
    Suru Dissanaike's avatar
    Suru Dissanaike committed
      done_testing();
    
      if (failed)
        return -1;
      else
        return 0;