summaryrefslogtreecommitdiffstats
path: root/tests/ncmd_tests.c
diff options
context:
space:
mode:
Diffstat (limited to 'tests/ncmd_tests.c')
-rw-r--r--tests/ncmd_tests.c492
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);