Skip to content
Snippets Groups Projects
unit_test_qos.c 4.76 KiB
Newer Older
  • Learn to ignore specific revisions
  • Oskar Viljasaar's avatar
    Oskar Viljasaar committed
    #include <stdarg.h>
    #include <stddef.h>
    #include <setjmp.h>
    #include <cmocka.h>
    
    #include <libubus.h>
    #include <libubox/blobmsg_json.h>
    #include <libubox/blobmsg.h>
    
    #include <json-validator.h>
    #include <json-c/json.h>
    #include <json-editor.h>
    
    #include <json-c/json_tokener.h>
    #include <easy/easy.h>
    #include <qos.h>
    
    #include <qosmngr.h>
    
    struct test_ctx {
    	struct blob_buf bb;
    	struct ubus_object qos;
    	FILE *fp;
    };
    
    /* declare qosmngr functions */
    int wl_radio_status(struct ubus_context *ctx, struct ubus_object *obj,
    		struct ubus_request_data *req, const char *method,
    		struct blob_attr *msg);
    
    
    int wl_radio_get_param(struct ubus_context *ctx, struct ubus_object *obj,
    		  struct ubus_request_data *req, const char *method,
    		  struct blob_attr *msg);
    
    int sta_disconnect(struct ubus_context *ctx, struct ubus_object *obj,
    		      struct ubus_request_data *req, const char *method,
    		      struct blob_attr *msg);
    
    int nbr_transition(struct ubus_context *ctx, struct ubus_object *obj,
    		      struct ubus_request_data *req, const char *method,
    		      struct blob_attr *msg);
    
    int nbr_request(struct ubus_context *ctx, struct ubus_object *obj,
    		      struct ubus_request_data *req, const char *method,
    		      struct blob_attr *msg);
    
    int nbr_add(struct ubus_context *ctx, struct ubus_object *obj,
    		      struct ubus_request_data *req, const char *method,
    		      struct blob_attr *msg);
    
    int wps_start(struct ubus_context *ctx, struct ubus_object *obj,
    		  struct ubus_request_data *req, const char *method,
    		  struct blob_attr *msg);
    
    int wps_stop(struct ubus_context *ctx, struct ubus_object *obj,
    		  struct ubus_request_data *req, const char *method,
    		  struct blob_attr *msg);
    
    int vsie_add(struct ubus_context *ctx, struct ubus_object *obj,
    		      struct ubus_request_data *ureq, const char *method,
    		      struct blob_attr *msg);
    
    int vsie_del(struct ubus_context *ctx, struct ubus_object *obj,
    		      struct ubus_request_data *ureq, const char *method,
    		      struct blob_attr *msg);
    
    int nbr_del(struct ubus_context *ctx, struct ubus_object *obj,
    		      struct ubus_request_data *req, const char *method,
    		      struct blob_attr *msg);
    
    int sta_monitor(struct ubus_context *ctx, struct ubus_object *obj,
    		      struct ubus_request_data *req, const char *method,
    		      struct blob_attr *msg);
    
    int wl_scan(struct ubus_context *ctx, struct ubus_object *obj,
    		  struct ubus_request_data *req, const char *method,
    		  struct blob_attr *msg);
    
    int wl_autochannel(struct ubus_context *ctx, struct ubus_object *obj,
    		struct ubus_request_data *req, const char *method,
    		struct blob_attr *msg);
    
    int wps_set_ap_pin(struct ubus_context *ctx, struct ubus_object *obj,
    		  struct ubus_request_data *req, const char *method,
    		  struct blob_attr *msg);
    
    int qosmngr_event_main(const char *evmap_file);
    
    /* overload ubus_send_reply to prevent segfault*/
    int ubus_send_reply(struct ubus_context *ctx, struct ubus_request_data *req,
    		    struct blob_attr *msg)
    {
    	return 0;
    }
    
    
    /* TODO: how to fix events without fopen and fclose every poll? */
    struct json_object *poll_test_log(FILE *fp, const char *prefix)
    {
    	char line[256] = {0};
    	char msg[256] = {0};
    	struct json_object *obj = NULL;
    
    	//if (!fp) {
        fp = fopen("/tmp/test.log", "r");
        if (!fp)
            return NULL;
    	//}
    
    	while (fgets(line, 256, fp))  {
    		char *ptr, *s;
    		char appended[32];
    
    		snprintf(appended, sizeof(appended), "%s:", prefix);
    
    		ptr = strstr(line, appended);
    		if (!ptr)
    			continue;
    
    		s = multi_tok(ptr, appended);
    		s = multi_tok(NULL, appended);
    		strncpy(msg, s, sizeof(msg));
    	}
    
    	if (strlen(msg))
    		obj = json_tokener_parse(msg);
    
    	fclose(fp);
    	return obj;
    }
    
    static int group_setup(void **state)
    {
    	struct test_ctx *ctx = calloc(1, sizeof(struct test_ctx));
    
    	if (!ctx)
    		return -1;
    
    	remove("/tmp/test.log");
    
    	ctx->qos.name = "qos";
    
    	memset(&ctx->bb, 0, sizeof(struct blob_buf));
    
    	*state = ctx;
    	return 0;
    }
    
    static void test_api_get_stats(void **state)
    {
    	struct test_ctx *ctx = (struct test_ctx *) *state;
    	struct blob_buf *bb = &ctx->bb;
    	struct ubus_object *obj = &ctx->qos;
    	struct json_object *jobj, *tmp;
    
    	blobmsg_add_string(bb, "ifname", "test");
    
    	tmp = json_object_get_by_string(jobj, "iface");
    	assert_string_equal(json_object_get_string(tmp), "test");
    
    	json_object_put(jobj);
        
    	return;
    }
    
    static int group_teardown(void **state)
    {
    	struct test_ctx *ctx = (struct test_ctx *) *state;
    
    	blob_buf_free(&ctx->bb);
    	free(ctx);
    	remove("/tmp/test.log");
    
    	/* TODO: fix event poll file */
    	//if (ctx->fp)
    		//fclose(ctx->fp);
    	return 0;
    }
    
    static int setup(void **state)
    {
    	struct test_ctx *ctx = (struct test_ctx *) *state;
    
    	blob_buf_init(&ctx->bb, 0);
    
    	return 0;
    }
    
    int main(void)
    {
    	const struct CMUnitTest tests[] = {
    		cmocka_unit_test_setup(test_api_get_stats, setup),
    	};
    
    	return cmocka_run_group_tests(tests, group_setup, group_teardown);
    }