/* Cesar project {{{ * * Copyright (C) 2007 Spidcom * * <<>> * * }}} */ /** * \file test_probe.c * \brief Test all probe functions. * \ingroup test */ #include #include #include #include #include #include #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) ); } test_end; test_begin(t, "fcall = NULL") { test_fail_unless( (probe_init(&probe, NULL) < 0) && (errno == EINVAL) ); } 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) ); } test_end; test_begin(t, "id = NULL") { test_fail_unless( (probe_register(&probe, NULL, sizeof(var1), &var1) < 0) && (errno == EINVAL) ); } test_end; test_begin(t, "addr = NULL") { test_fail_unless( (probe_register(&probe, "var1", sizeof(var1), NULL) < 0) && (errno == EINVAL) ); } 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) ); } 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) ); // 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); sci_msg_init(&msg, buffer, 256); fcall_param_init(¶m, PROBE_ID); param_ref = ¶m; 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, ¶m, 0); msg.hdr.fcall->type = FUNCTION_CALL_TYPE_REQ; test_begin(t, "param = NULL") { test_fail_unless( (probe_recv(NULL, &msg_ref, &probe) < 0) && (errno == EINVAL) ); } test_end; test_begin(t, "msg = NULL") { test_fail_unless( (probe_recv(¶m_ref, NULL, &probe) < 0) && (errno == EINVAL) ); } test_end; test_begin(t, "probe = NULL") { test_fail_unless( (probe_recv(¶m_ref, &msg_ref, NULL) < 0) && (errno == EINVAL) ); } test_end; value1 = 0x12345678; strcpy(value2, TEST_STRING); value3 = 'A'; var1 = 0xdeadbeef; strcpy(var2, "deadbeef"); var3 = 'Z'; fcall_param_init(¶m, PROBE_ID); fcall_param_add(¶m, &msg, "var1", sizeof(value1), &value1); fcall_param_add(¶m, &msg, "var2", strlen(value2) + 1, value2); fcall_param_add(¶m, &msg, "var3", sizeof(value3), &value3); test_begin(t, "check recv with set") { test_fail_unless( (probe_recv(¶m_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(¶m, PROBE_ID); fcall_param_add(¶m, &msg, "var2", sizeof(var2) + 1, value2); param_ref = ¶m; msg_ref = &msg; test_begin(t, "check recv with too big set") { test_fail_unless( (probe_recv(¶m_ref, &msg_ref, &probe) == 0) && (param_ref->param_nb == 0) ); } test_end; value1 = 0xbeefdead; strcpy(value2, "beefdead"); value3 = 'Y'; fcall_param_init(¶m, PROBE_ID); fcall_param_add(¶m, &msg, "var1", 0, NULL); fcall_param_add(¶m, &msg, "var2", 0, NULL); fcall_param_add(¶m, &msg, "var3", 0, NULL); param_ref = ¶m; msg_ref = &msg; test_begin(t, "check recv with get") { test_fail_unless( (probe_recv(¶m_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(¶m, PROBE_ID); param_ref = ¶m; msg_ref = &msg; test_begin(t, "check recv with list") { test_fail_unless( (probe_recv(¶m_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); }