summaryrefslogtreecommitdiff
path: root/cesar/host/test/src/test_probe.c
diff options
context:
space:
mode:
Diffstat (limited to 'cesar/host/test/src/test_probe.c')
-rw-r--r--cesar/host/test/src/test_probe.c374
1 files changed, 374 insertions, 0 deletions
diff --git a/cesar/host/test/src/test_probe.c b/cesar/host/test/src/test_probe.c
new file mode 100644
index 0000000000..edb9434bda
--- /dev/null
+++ b/cesar/host/test/src/test_probe.c
@@ -0,0 +1,374 @@
+/* Cesar project {{{
+ *
+ * Copyright (C) 2007 Spidcom
+ *
+ * <<<Licence>>>
+ *
+ * }}} */
+/**
+ * \file test_probe.c
+ * \brief Test all probe functions.
+ * \ingroup test
+ */
+
+#include <string.h>
+#include <stdio.h>
+#include <arpa/inet.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <errno.h>
+#include "common/std.h"
+#include "host/fcall.h"
+#include "lib/test.h"
+
+extern char dump_buffer[];
+
+void probe_init_test_case(test_t t)
+{
+ fcall_ctx_t fcall;
+ sci_ctx_t sci;
+ station_ctx_t station;
+ probe_ctx_t probe;
+ sci_init(&sci, &station);
+ fcall_init(&fcall, &sci);
+
+ test_case_begin(t, "init");
+
+ test_begin(t, "probe = NULL")
+ {
+ test_fail_unless(
+ (probe_init(NULL, &fcall) < 0)
+ && (errno == EINVAL)
+ );
+ // reset errno
+ errno = 0;
+ } test_end;
+
+ test_begin(t, "fcall = NULL")
+ {
+ test_fail_unless(
+ (probe_init(&probe, NULL) < 0)
+ && (errno == EINVAL)
+ );
+ // reset errno
+ errno = 0;
+ } test_end;
+
+ test_begin(t, "check init")
+ {
+ int i;
+ test_fail_unless(
+ (probe_init(&probe, &fcall) >= 0)
+ && (probe.var_nb == 0)
+ && !strcmp(fcall.function_table[0].id, PROBE_ID)
+ && (fcall.function_table[0].function == probe_recv)
+ && (fcall.function_table[0].data == &probe)
+ );
+ for(i = 0; i < PROBE_VAR_MAX_NB; i++)
+ {
+ test_fail_unless(
+ (probe.var_table[i].id[0] == '\0')
+ );
+ }
+ } test_end;
+
+ return;
+}
+
+static int var1;
+static char var2[32];
+static char var3;
+#define TEST_STRING "test string"
+
+void probe_register_test_case(test_t t)
+{
+ fcall_ctx_t fcall;
+ sci_ctx_t sci;
+ station_ctx_t station;
+ probe_ctx_t probe;
+
+ test_case_begin(t, "register");
+ sci_init(&sci, &station);
+ fcall_init(&fcall, &sci);
+ probe_init(&probe, &fcall);
+
+ test_begin(t, "probe = NULL")
+ {
+ test_fail_unless(
+ (probe_register(NULL, "var1", sizeof(var1), &var1) < 0)
+ && (errno == EINVAL)
+ );
+ // reset errno
+ errno = 0;
+ } test_end;
+
+ test_begin(t, "id = NULL")
+ {
+ test_fail_unless(
+ (probe_register(&probe, NULL, sizeof(var1), &var1) < 0)
+ && (errno == EINVAL)
+ );
+ // reset errno
+ errno = 0;
+ } test_end;
+
+ test_begin(t, "addr = NULL")
+ {
+ test_fail_unless(
+ (probe_register(&probe, "var1", sizeof(var1), NULL) < 0)
+ && (errno == EINVAL)
+ );
+ // reset errno
+ errno = 0;
+ } test_end;
+
+ test_begin(t, "check register")
+ {
+ test_fail_unless(
+ (probe_register(&probe, "var1", sizeof(var1), &var1) >= 0)
+ && (probe.var_nb == 1)
+ && !strcmp(probe.var_table[0].id, "var1")
+ && (probe.var_table[0].addr == &var1)
+ );
+ test_fail_unless(
+ (probe_register(&probe, "var2", sizeof(var2), var2) >= 0)
+ && (probe.var_nb == 2)
+ && !strcmp(probe.var_table[1].id, "var2")
+ && (probe.var_table[1].addr == var2)
+ );
+ } test_end;
+
+ test_begin(t, "check already existing variable")
+ {
+ test_fail_unless(
+ (probe_register(&probe, "var1", sizeof(var1), &var1) < 0)
+ && (errno == EEXIST)
+ );
+ // reset errno
+ errno = 0;
+ } test_end;
+
+ test_begin(t, "check full table")
+ {
+// int i;
+ probe.var_nb = PROBE_VAR_MAX_NB;
+ test_fail_unless(
+ (probe_register(&probe, "var3", sizeof(var3), &var3) < 0)
+ && (errno == ENOSPC)
+ );
+ // reset errno
+ errno = 0;
+// probe.var_nb = 2;
+// for(i = 0; i < PROBE_VAR_MAX_NB; i++)
+// {
+// sprintf(probe.var_table[i].id, "var_%d", i);
+// probe.var_table[i].addr = &var3;
+// }
+// test_fail_unless(
+// (probe_register(&probe, "var3", sizeof(var3), &var3) < 0)
+// && (errno == ENOSPC)
+// );
+ } test_end;
+
+ return;
+}
+
+void probe_recv_test_case(test_t t)
+{
+ station_ctx_t station;
+ fcall_ctx_t fcall;
+ sci_ctx_t sci;
+ sci_msg_t msg, *msg_ref;
+ fcall_param_t param, *param_ref;
+ probe_ctx_t probe;
+ unsigned char buffer[256], *ptr;
+ int value1;
+ char value2[32];
+ char value3;
+
+ test_case_begin(t, "recv");
+
+ station_init(&station);
+ sci_init(&sci, &station);
+ fcall_init(&fcall, &sci);
+ probe_init(&probe, &fcall);
+
+ test_begin(t, "init msg")
+ {
+ test_fail_unless(
+ (0 == sci_msg_init(&msg, buffer, 256))
+ && (EINVAL != errno)
+ );
+ } test_end;
+
+ fcall_param_init(&param, PROBE_ID, 12345);
+ param_ref = &param;
+ msg_ref = &msg;
+
+ probe_register(&probe, "var1", sizeof(var1), &var1);
+ probe_register(&probe, "var2", sizeof(var2), var2);
+ probe_register(&probe, "var3", sizeof(var3), &var3);
+
+ fcall_fill_hdr(&fcall, &msg, &param, 0);
+ msg.hdr.fcall->type = FUNCTION_CALL_TYPE_REQ;
+
+ test_begin(t, "fcall = NULL")
+ {
+ test_fail_unless(
+ (probe_recv(NULL, &param_ref, &msg_ref, &probe) < 0)
+ && (errno == EINVAL)
+ );
+ // reset errno
+ errno = 0;
+ } test_end;
+
+ test_begin(t, "param = NULL")
+ {
+ test_fail_unless(
+ (probe_recv(&fcall, NULL, &msg_ref, &probe) < 0)
+ && (errno == EINVAL)
+ );
+ // reset errno
+ errno = 0;
+ } test_end;
+
+ test_begin(t, "msg = NULL")
+ {
+ test_fail_unless(
+ (probe_recv(&fcall, &param_ref, NULL, &probe) < 0)
+ && (errno == EINVAL)
+ );
+ // reset errno
+ errno = 0;
+ } test_end;
+
+ test_begin(t, "probe = NULL")
+ {
+ test_fail_unless(
+ (probe_recv(&fcall, &param_ref, &msg_ref, NULL) < 0)
+ && (errno == EINVAL)
+ );
+ // reset errno
+ errno = 0;
+ } test_end;
+
+ value1 = 0x12345678;
+ strcpy(value2, TEST_STRING);
+ value3 = 'A';
+
+ var1 = 0xdeadbeef;
+ strcpy(var2, "deadbeef");
+ var3 = 'Z';
+
+ fcall_param_init(&param, PROBE_ID, 54321);
+ fcall_param_add(&param, &msg, "var1", sizeof(value1), &value1);
+ fcall_param_add(&param, &msg, "var2", strlen(value2) + 1, value2);
+ fcall_param_add(&param, &msg, "var3", sizeof(value3), &value3);
+
+ test_begin(t, "check recv with set")
+ {
+ test_fail_unless(
+ (probe_recv(&fcall, &param_ref, &msg_ref, &probe) == 3)
+ && !strcmp(param_ref->id, PROBE_ID)
+ && (param_ref->param_nb == 3)
+ );
+ test_fail_unless(
+ (fcall_param_bind(param_ref, msg_ref, "var1", sizeof(value1), &value1) == 0)
+ && (value1 == 0x12345678)
+ && (var1 == 0x12345678)
+ && (fcall_param_bind(param_ref, msg_ref, "var2", sizeof(value2), value2) == 0)
+ && !strcmp(value2, TEST_STRING)
+ && !strcmp(var2, TEST_STRING)
+ && (fcall_param_bind(param_ref, msg_ref, "var3", sizeof(value3), &value3) == 0)
+ && (value3 == 'A')
+ && (var3 == 'A')
+ );
+ } test_end;
+
+ fcall_param_init(&param, PROBE_ID, 0x1234);
+ fcall_param_add(&param, &msg, "var2", sizeof(var2) + 1, value2);
+ param_ref = &param;
+ msg_ref = &msg;
+
+ test_begin(t, "check recv with too big set")
+ {
+ test_fail_unless(
+ (probe_recv(&fcall, &param_ref, &msg_ref, &probe) == 0)
+ && (param_ref->param_nb == 0)
+ );
+ } test_end;
+
+ value1 = 0xbeefdead;
+ strcpy(value2, "beefdead");
+ value3 = 'Y';
+ fcall_param_init(&param, PROBE_ID, 0x4321);
+ fcall_param_add(&param, &msg, "var1", 0, NULL);
+ fcall_param_add(&param, &msg, "var2", 0, NULL);
+ fcall_param_add(&param, &msg, "var3", 0, NULL);
+ param_ref = &param;
+ msg_ref = &msg;
+
+ test_begin(t, "check recv with get")
+ {
+ test_fail_unless(
+ (probe_recv(&fcall, &param_ref, &msg_ref, &probe) == 3)
+ && (param_ref->param_nb == 3)
+ );
+ test_fail_unless(
+ (fcall_param_bind(param_ref, msg_ref, "var1", sizeof(value1), &value1) == sizeof(value1))
+ && (value1 == 0x12345678)
+ && (var1 == 0x12345678)
+ && (fcall_param_bind(param_ref, msg_ref, "var2", sizeof(value2), value2) == sizeof(value2))
+ && !strcmp(value2, TEST_STRING)
+ && !strcmp(var2, TEST_STRING)
+ && (fcall_param_bind(param_ref, msg_ref, "var3", sizeof(value3), &value3) == sizeof(value3))
+ && (value3 == 'A')
+ && (var3 == 'A')
+ );
+ } test_end;
+
+ fcall_param_init(&param, PROBE_ID, 12345);
+ param_ref = &param;
+ msg_ref = &msg;
+
+ test_begin(t, "check recv with list")
+ {
+ test_fail_unless(
+ (probe_recv(&fcall, &param_ref, &msg_ref, &probe) == 3)
+ && (param_ref->param_nb == 3)
+ );
+ ptr = msg_ref->data_begin;
+ test_fail_unless(
+ !strcmp((char *)ptr, "var3")
+ && (ptr += (strlen("var3") + 1))
+ && (ntohs(*(unsigned short *)(ptr)) == sizeof(var3))
+ && !memcmp(ptr + 2, &var3, sizeof(var3))
+ );
+ ptr += (2 + sizeof(var3));
+ test_fail_unless(
+ !strcmp((char *)ptr, "var2")
+ && (ptr += (strlen("var2") + 1))
+ && (ntohs(*(unsigned short *)(ptr)) == sizeof(var2))
+ && !memcmp((char *)(ptr + 2), var2, sizeof(var2))
+ );
+ ptr += (2 + sizeof(var2));
+ test_fail_unless(
+ !strcmp((char *)ptr, "var1")
+ && (ptr += strlen("var1") + 1)
+ && (ntohs(*(unsigned short *)(ptr)) == sizeof(var1))
+ && !memcmp((char *)(ptr + 2), &var1, sizeof(var1))
+ );
+ } test_end;
+
+ station_down(&station);
+
+ return;
+}
+
+void probe_test_suite(test_t t)
+{
+ test_suite_begin(t, "probe");
+ probe_init_test_case(t);
+ probe_register_test_case(t);
+ probe_recv_test_case(t);
+}