diff options
Diffstat (limited to 'tests/ncmd_tests.c')
-rw-r--r-- | tests/ncmd_tests.c | 492 |
1 files changed, 492 insertions, 0 deletions
diff --git a/tests/ncmd_tests.c b/tests/ncmd_tests.c new file mode 100644 index 0000000..6174371 --- /dev/null +++ b/tests/ncmd_tests.c @@ -0,0 +1,492 @@ +/* SPDX-License-Identifier: BSD-3-Clause */ +/* + * Copyright © 2020 rsiddharth <s@ricketyspace.net> + */ + +#include "minunit.h" +#include <ncmd.h> + +char *test_sanitize() +{ + char *cmd = calloc(128, sizeof(char)); + mu_assert(cmd != NULL, "calloc failed"); + + char *c_cmd = "/create api/beef\n"; + size_t c_cmd_sz = strlen(c_cmd); + + strncpy(cmd, c_cmd, c_cmd_sz + 1); + mu_assert(strlen(cmd) == c_cmd_sz, "strncpy failed"); + + sanitize(cmd); + mu_assert(strlen(cmd) == c_cmd_sz - 1, "sanitize failed"); + mu_assert(strcmp(cmd, "/create api/beef") == 0, "sanitize failed"); + + + // Clear cmd. + memset(cmd, '\0', 128); + + + c_cmd = "/create api/ham\n\n\n"; + c_cmd_sz = strlen(c_cmd); + + strncpy(cmd, c_cmd, c_cmd_sz + 1); + mu_assert(strlen(cmd) == c_cmd_sz, "strncpy failed"); + + sanitize(cmd); + mu_assert(strlen(cmd) == c_cmd_sz - 3, "sanitize failed"); + mu_assert(strcmp(cmd, "/create api/ham") == 0, "sanitize failed"); + + + // Clear cmd. + memset(cmd, '\0', 128); + + + c_cmd = "/create api/bacon\n/create api/turkey\n"; + c_cmd_sz = strlen(c_cmd); + + strncpy(cmd, c_cmd, c_cmd_sz + 1); + mu_assert(strlen(cmd) == c_cmd_sz, "strncpy failed"); + + sanitize(cmd); + mu_assert(strlen(cmd) == c_cmd_sz - 20, "sanitize failed"); + mu_assert(strcmp(cmd, "/create api/bacon") == 0, "sanitize failed"); + + + // Cleanup. + free(cmd); + + return NULL; +} + +char *test_check_cmd() +{ + char *err = (char *) calloc(RSP_SIZE, sizeof(char)); + + char *cmd = (char *) calloc(128, sizeof(char)); + mu_assert(cmd != NULL, "calloc failed"); + + char *bacon = "/create api/bacon"; + strncpy(cmd, bacon, strlen(bacon)); + mu_assert(strlen(cmd) == strlen(bacon), "strncpy failed"); + + int rc = check_cmd(cmd, err); + mu_assert(rc == 0, "check_cmd failed"); + + memset(err, '\0', RSP_SIZE); + memset(cmd, '\0', 128); + + char *c = "/c"; + strncpy(cmd, c, strlen(c)); + mu_assert(strlen(cmd) == strlen(c), "strncpy failed"); + + rc = check_cmd(cmd, err); + mu_assert(rc < 0, "check_cmd failed"); + mu_assert(strcmp(err, "command size invalid\n") == 0, + "wrong err msg"); + + memset(err, '\0', RSP_SIZE); + memset(cmd, '\0', 128); + + + char *empty = "\n"; + strncpy(cmd, empty, strlen(empty)); + mu_assert(strlen(cmd) == strlen(empty), "strncpy failed"); + + rc = check_cmd(cmd, err); + mu_assert(rc < 0, "check_cmd failed"); + mu_assert(strcmp(err, "closing connection\n") == 0, + "wrong err msg"); + + + rc = check_cmd(NULL, err); + mu_assert(rc < 0, "check_cmd failed"); + mu_assert(strcmp(err, "internal error\n") == 0, + "wrong err msg"); + + + // Cleanup. + free(err); + free(cmd); + + return NULL; +} + +char *test_cmd_parts() +{ + struct bstrList *parts = NULL; + + bstring create = bfromcstr("/create"); + + char *bacon = "/create bacon"; + parts = cmd_parts(bacon); + mu_assert(parts != NULL, "cmd parts failed"); + mu_assert(parts->qty == 2, "qty check failed"); + mu_assert(bstricmp(parts->entry[0], create) == 0, + "equality check failed"); + + // Cleanup + bstrListDestroy(parts); + + char *ham = "/create ham"; + parts = cmd_parts(ham); + mu_assert(parts != NULL, "cmd parts failed"); + mu_assert(parts->qty == 2, "qty check failed"); + mu_assert(bstricmp(parts->entry[0], create) == 0, + "equality check failed"); + + + // Cleanup + bdestroy(create); + bstrListDestroy(parts); + + return NULL; +} + +char *test_find_function() +{ + struct bstrList *parts = NULL; + int funk = 0; + + char *bacon = "/create bacon"; + parts = cmd_parts(bacon); + mu_assert(parts != NULL, "cmd_parts failed"); + funk = find_function(parts); + mu_assert(funk == NS_CREATE, "find function create failed"); + + char *ham = "/create ham"; + parts = cmd_parts(ham); + mu_assert(parts != NULL, "cmd_parts failed"); + funk = find_function(parts); + mu_assert(funk == NS_CREATE, "find function create failed"); + + ham = "/CREate ham"; + parts = cmd_parts(ham); + mu_assert(parts != NULL, "cmd_parts failed"); + funk = find_function(parts); + mu_assert(funk == NS_CREATE, "find function create failed"); + + char *sample = "/sample bacon 42"; + parts = cmd_parts(sample); + mu_assert(parts != NULL, "cmd_parts failed"); + funk = find_function(parts); + mu_assert(funk == NS_SAMPLE, "find function sample failed"); + + sample = "/SAMPLE bacon 42"; + parts = cmd_parts(sample); + mu_assert(parts != NULL, "cmd_parts failed"); + funk = find_function(parts); + mu_assert(funk == NS_SAMPLE, "find function sample failed"); + + char *mean = "/mean bacon"; + parts = cmd_parts(mean); + mu_assert(parts != NULL, "cmd_parts failed"); + funk = find_function(parts); + mu_assert(funk == NS_MEAN, "find function mean failed"); + + char *dump = "/dump bacon"; + parts = cmd_parts(dump); + mu_assert(parts != NULL, "cmd_parts failed"); + funk = find_function(parts); + mu_assert(funk == NS_DUMP, "find function dump failed"); + + char *delete = "/delete bacon"; + parts = cmd_parts(delete); + mu_assert(parts != NULL, "cmd_parts failed"); + funk = find_function(parts); + mu_assert(funk == NS_DELETE, "find function delete failed"); + + char *list = "/list"; + parts = cmd_parts(list); + mu_assert(parts != NULL, "cmp_parts failed"); + funk = find_function(parts); + mu_assert(funk == NS_LIST, "find function list failed"); + + list = "/LIST"; + parts = cmd_parts(list); + mu_assert(parts != NULL, "cmp_parts failed"); + funk = find_function(parts); + mu_assert(funk == NS_LIST, "find function list failed"); + + char *store = "/store jowl"; + parts = cmd_parts(store); + mu_assert(parts != NULL, "cmp_parts failed"); + funk = find_function(parts); + mu_assert(funk == NS_STORE, "find function list failed"); + + store = "/STore jowl"; + parts = cmd_parts(store); + mu_assert(parts != NULL, "cmp_parts failed"); + funk = find_function(parts); + mu_assert(funk == NS_STORE, "find function list failed"); + + char *load = "/load jowl ears"; + parts = cmd_parts(load); + mu_assert(parts != NULL, "cmp_parts failed"); + funk = find_function(parts); + mu_assert(funk == NS_LOAD, "find function list failed"); + + load = "/LoAD jowl ears"; + parts = cmd_parts(load); + mu_assert(parts != NULL, "cmp_parts failed"); + funk = find_function(parts); + mu_assert(funk == NS_LOAD, "find function list failed"); + + char *nop = "/meant bacon"; + parts = cmd_parts(nop); + mu_assert(parts != NULL, "cmd_parts failed"); + funk = find_function(parts); + mu_assert(funk == NS_NOP, "find function mean failed"); + + return NULL; +} + +char *test_call_function() +{ + struct bstrList *parts = NULL; + + char *msg = (char *) calloc(RSP_SIZE + 1, sizeof(char)); + mu_assert(msg != NULL, "msg invalid"); + + char *bacon = "/create bacon"; + parts = cmd_parts(bacon); + mu_assert(parts != NULL, "cmd_parts failed"); + int rc = call_function(NS_CREATE, parts, msg); + mu_assert(rc == 0, "call function failed"); + mu_assert(strcmp(msg, "OK\n") == 0, "call function failed"); + + char *ham = "/create ham"; + parts = cmd_parts(ham); + mu_assert(parts != NULL, "cmd_parts failed"); + rc = call_function(NS_CREATE, parts, msg); + mu_assert(rc == 0, "call function failed"); + mu_assert(strcmp(msg, "OK\n") == 0, "call function failed"); + + char *beef = "/create beef"; + parts = cmd_parts(beef); + mu_assert(parts != NULL, "cmd_parts failed"); + rc = call_function(NS_CREATE, parts, msg); + mu_assert(rc == 0, "call function failed"); + mu_assert(strcmp(msg, "OK\n") == 0, "call function failed"); + + char *bacon_sample = "/sample bacon 4.2"; + parts = cmd_parts(bacon_sample); + mu_assert(parts != NULL, "cmd_parts failed"); + rc = call_function(NS_SAMPLE, parts, msg); + mu_assert(rc == 0, "call function failed"); + mu_assert(strcmp(msg, "Mean: 4.20\n") == 0, "call function failed"); + + bacon_sample = "/Sample bacon 6.9"; + parts = cmd_parts(bacon_sample); + mu_assert(parts != NULL, "cmd_parts failed"); + rc = call_function(NS_SAMPLE, parts, msg); + mu_assert(rc == 0, "call function failed"); + mu_assert(strcmp(msg, "Mean: 5.55\n") == 0, "call function failed"); + + char *bacon_mean = "/mean bacon"; + parts = cmd_parts(bacon_mean); + mu_assert(parts != NULL, "cmd_parts failed"); + rc = call_function(NS_MEAN, parts, msg); + mu_assert(rc == 0, "call function failed"); + mu_assert(strcmp(msg, "Mean: 5.55\n") == 0, "call function failed"); + + char *bacon_dump = "/dump bacon"; + parts = cmd_parts(bacon_dump); + mu_assert(parts != NULL, "cmd_parts failed"); + rc = call_function(NS_DUMP, parts, msg); + mu_assert(rc == 0, "call function failed"); + mu_assert(strcmp(msg, "sum: 11.100000, sumsq: 65.250000, n: 2, min: 4.200000, max: 6.900000, mean: 5.550000, stddev: 1.909188\n") == 0, "call function failed"); + + char *bacon_delete = "/delete bacon"; + parts = cmd_parts(bacon_delete); + mu_assert(parts != NULL, "cmd_parts failed"); + rc = call_function(NS_DELETE, parts, msg); + mu_assert(rc == 0, "call function failed"); + mu_assert(strcmp(msg, "OK\n") == 0, "call function failed"); + + char *list = "/list"; + parts = cmd_parts(list); + mu_assert(parts != NULL, "cmd_parts failed"); + rc = call_function(NS_LIST, parts, msg); + mu_assert(rc == 0, "call function failed"); + mu_assert(strcmp(msg, "ham\nbeef\n") == 0 + || strcmp(msg, "beef\nham\n") == 0, + "call function failed"); + + + char *ham_store = "/store ham"; + parts = cmd_parts(ham_store); + mu_assert(parts != NULL, "cmd_parts failed"); + rc = call_function(NS_STORE, parts, msg); + mu_assert(rc == 0, "call function failed"); + mu_assert(strcmp(msg, "OK\n") == 0, "call function failed"); + + + char *beef_store = "/store beef"; + parts = cmd_parts(beef_store); + mu_assert(parts != NULL, "cmd_parts failed"); + rc = call_function(NS_STORE, parts, msg); + mu_assert(rc == 0, "call function failed"); + mu_assert(strcmp(msg, "OK\n") == 0, "call function failed"); + + char *roastedham_load = "/load ham roastedham"; + parts = cmd_parts(roastedham_load); + mu_assert(parts != NULL, "cmd_parts failed"); + rc = call_function(NS_LOAD, parts, msg); + mu_assert(rc == 0, "call function failed"); + mu_assert(strcmp(msg, "OK\n") == 0, "call function failed"); + + char *grilledbeef_load = "/load beef grilledbeef"; + parts = cmd_parts(grilledbeef_load); + mu_assert(parts != NULL, "cmd_parts failed"); + rc = call_function(NS_LOAD, parts, msg); + printf("LOAD FIAAAL %d %s\n", rc, msg); + mu_assert(rc == 0, "call function failed"); + mu_assert(strcmp(msg, "OK\n") == 0, "call function failed"); + + // delete ham, roastedham, beef, and roastedbeef. + char *ham_delete = "/delete ham"; + parts = cmd_parts(ham_delete); + mu_assert(parts != NULL, "cmd_parts failed"); + rc = call_function(NS_DELETE, parts, msg); + mu_assert(rc == 0, "call function failed"); + mu_assert(strcmp(msg, "OK\n") == 0, "call function failed"); + + char *roastedham_delete = "/delete roastedham"; + parts = cmd_parts(roastedham_delete); + mu_assert(parts != NULL, "cmd_parts failed"); + rc = call_function(NS_DELETE, parts, msg); + mu_assert(rc == 0, "call function failed"); + mu_assert(strcmp(msg, "OK\n") == 0, "call function failed"); + + char *beef_delete = "/delete beef"; + parts = cmd_parts(beef_delete); + mu_assert(parts != NULL, "cmd_parts failed"); + rc = call_function(NS_DELETE, parts, msg); + mu_assert(rc == 0, "call function failed"); + mu_assert(strcmp(msg, "OK\n") == 0, "call function failed"); + + char *grilledbeef_delete = "/delete grilledbeef"; + parts = cmd_parts(grilledbeef_delete); + mu_assert(parts != NULL, "cmd_parts failed"); + rc = call_function(NS_DELETE, parts, msg); + mu_assert(rc == 0, "call function failed"); + mu_assert(strcmp(msg, "OK\n") == 0, "call function failed"); + + return NULL; +} + +char *test_process() +{ + char *out = (char *) calloc(RSP_SIZE + 1, sizeof(char)); + mu_assert(out != NULL, "out invalid"); + + char *bacon = "/create bacon"; + int rc = process(bacon, out); + mu_assert(rc == 0, "process failed"); + mu_assert(strcmp(out, "OK\n") == 0, "process failed"); + + char *ham = "/create ham"; + rc = process(ham, out); + mu_assert(rc == 0, "process failed"); + mu_assert(strcmp(out, "OK\n") == 0, "process failed"); + + char *beef = "/create beef"; + rc = process(beef, out); + mu_assert(rc == 0, "process failed"); + mu_assert(strcmp(out, "OK\n") == 0, "process failed"); + + char *ham_sample = "/sample ham 4.3"; + rc = process(ham_sample, out); + mu_assert(rc == 0, "process failed"); + mu_assert(strcmp(out, "Mean: 4.30\n") == 0, "process failed"); + + ham_sample = "/sample ham 6.0"; + rc = process(ham_sample, out); + mu_assert(rc == 0, "process failed"); + mu_assert(strcmp(out, "Mean: 5.15\n") == 0, "process failed"); + + char *bacon_sample = "/sample bacon 4.2"; + rc = process(bacon_sample, out); + mu_assert(rc == 0, "process failed"); + mu_assert(strcmp(out, "Mean: 4.20\n") == 0, "process failed"); + + bacon_sample = "/Sample bacon 6.9"; + rc = process(bacon_sample, out); + mu_assert(rc == 0, "process failed"); + mu_assert(strcmp(out, "Mean: 5.55\n") == 0, "process failed"); + + char *bacon_mean = "/mean bacon"; + rc = process(bacon_mean, out); + mu_assert(rc == 0, "process failed"); + mu_assert(strcmp(out, "Mean: 5.55\n") == 0, "process failed"); + + char *bacon_dump = "/dump bacon"; + rc = process(bacon_dump, out); + mu_assert(rc == 0, "process failed"); + mu_assert(strcmp(out, "sum: 11.100000, sumsq: 65.250000, n: 2, min: 4.200000, max: 6.900000, mean: 5.550000, stddev: 1.909188\n") == 0, "process failed"); + + char *bacon_delete = "/delete bacon"; + rc = process(bacon_delete, out); + mu_assert(rc == 0, "process failed"); + mu_assert(strcmp(out, "OK\n") == 0, "process failed"); + + char *list = "/list"; + rc = process(list, out); + mu_assert(rc == 0, "process failed"); + mu_assert(strcmp(out, "ham\nbeef\n") == 0 + || strcmp(out, "beef\nham\n") == 0, + "process failed"); + + char *ham_store = "/store ham"; + rc = process(ham_store, out); + mu_assert(rc == 0, "process failed"); + mu_assert(strcmp(out, "OK\n") == 0, "process failed"); + + char *beef_store = "/store beef"; + rc = process(beef_store, out); + mu_assert(rc == 0, "process failed"); + mu_assert(strcmp(out, "OK\n") == 0, "process failed"); + + char *bacon_store = "/store bacon"; + rc = process(bacon_store, out); + mu_assert(rc == -1, "process failed"); + mu_assert(strcmp(out, "error: store failed\n") == 0, "process failed"); + + char *roastedham_load = "/load ham roastedham"; + rc = process(roastedham_load, out); + mu_assert(rc == 0, "process failed"); + mu_assert(strcmp(out, "OK\n") == 0, "process failed"); + + char *roastedham_delete = "/delete roastedham"; + rc = process(roastedham_delete, out); + mu_assert(rc == 0, "process failed"); + mu_assert(strcmp(out, "OK\n") == 0, "process failed"); + + roastedham_load = "/load ham roastedham"; + rc = process(roastedham_load, out); + mu_assert(rc == 0, "process failed"); + mu_assert(strcmp(out, "OK\n") == 0, "process failed"); + + char *roastedham_dump = "/dump roastedham"; + rc = process(roastedham_dump, out); + mu_assert(rc == 0, "process failed"); + mu_assert(strcmp(out, "sum: 10.300000, sumsq: 54.490000, n: 2, min: 4.300000, max: 6.000000, mean: 5.150000, stddev: 1.202082\n") == 0, "process failed"); + + return NULL; +} + +char *all_tests() +{ + mu_suite_start(); + + mu_run_test(test_sanitize); + mu_run_test(test_check_cmd); + mu_run_test(test_cmd_parts); + mu_run_test(test_find_function); + mu_run_test(test_call_function); + mu_run_test(test_process); + + return NULL; +} + +RUN_TESTS(all_tests); |