From c5cd13c24fdd0343f34b6a938577b803c7e44e4a Mon Sep 17 00:00:00 2001 From: Razvan Deaconescu Date: Sat, 21 May 2011 14:07:15 +0300 Subject: [PATCH] raw: Add skeleton test suite for swift raw. --- src/raw/test/.gitignore | 1 + src/raw/test/Makefile | 15 ++++++ src/raw/test/debug.h | 77 ++++++++++++++++++++++++++++++ src/raw/test/test.c | 64 +++++++++++++++++++++++++ src/raw/test/test.h | 61 +++++++++++++++++++++++ src/raw/test/test_dummy.c | 15 ++++++ src/raw/test/test_sw.h | 30 ++++++++++++ src/raw/test/test_sw_bind.c | 11 +++++ src/raw/test/test_sw_close.c | 12 +++++ src/raw/test/test_sw_getsockname.c | 12 +++++ src/raw/test/test_sw_getsockopt.c | 12 +++++ src/raw/test/test_sw_recvfrom.c | 12 +++++ src/raw/test/test_sw_recvmsg.c | 12 +++++ src/raw/test/test_sw_sendmsg.c | 11 +++++ src/raw/test/test_sw_sendto.c | 11 +++++ src/raw/test/test_sw_setsockopt.c | 11 +++++ src/raw/test/test_sw_shutdown.c | 11 +++++ src/raw/test/test_sw_socket.c | 11 +++++ src/raw/test/util.h | 71 +++++++++++++++++++++++++++ 19 files changed, 460 insertions(+) create mode 100644 src/raw/test/.gitignore create mode 100644 src/raw/test/Makefile create mode 100644 src/raw/test/debug.h create mode 100644 src/raw/test/test.c create mode 100644 src/raw/test/test.h create mode 100644 src/raw/test/test_dummy.c create mode 100644 src/raw/test/test_sw.h create mode 100644 src/raw/test/test_sw_bind.c create mode 100644 src/raw/test/test_sw_close.c create mode 100644 src/raw/test/test_sw_getsockname.c create mode 100644 src/raw/test/test_sw_getsockopt.c create mode 100644 src/raw/test/test_sw_recvfrom.c create mode 100644 src/raw/test/test_sw_recvmsg.c create mode 100644 src/raw/test/test_sw_sendmsg.c create mode 100644 src/raw/test/test_sw_sendto.c create mode 100644 src/raw/test/test_sw_setsockopt.c create mode 100644 src/raw/test/test_sw_shutdown.c create mode 100644 src/raw/test/test_sw_socket.c create mode 100644 src/raw/test/util.h diff --git a/src/raw/test/.gitignore b/src/raw/test/.gitignore new file mode 100644 index 0000000..ee4c926 --- /dev/null +++ b/src/raw/test/.gitignore @@ -0,0 +1 @@ +/test diff --git a/src/raw/test/Makefile b/src/raw/test/Makefile new file mode 100644 index 0000000..46ca48a --- /dev/null +++ b/src/raw/test/Makefile @@ -0,0 +1,15 @@ +#CPPFLAGS = -DDEBUG -DLOG_LEVEL=LOG_DEBUG +CFLAGS = -Wall -g + +.PHONY: all clean + +all: test + +test: test.o test_sw_socket.o test_sw_bind.o test_sw_getsockname.o \ + test_sw_sendto.o test_sw_recvfrom.o test_sw_sendmsg.o \ + test_sw_recvmsg.o test_sw_setsockopt.o test_sw_getsockopt.o \ + test_sw_shutdown.o test_sw_close.o test_dummy.o + +clean: + -rm -f *~ *.o + -rm -f test diff --git a/src/raw/test/debug.h b/src/raw/test/debug.h new file mode 100644 index 0000000..493e985 --- /dev/null +++ b/src/raw/test/debug.h @@ -0,0 +1,77 @@ +/* + * debugging macros + * heavily inspired by previous work and Internet resources + * + * uses C99 variadic macros + * uses non-standard usage of the token-paste operator (##) for + * removing the comma symbol (,) when not followed by a token + * uses non-standard __FUNCTION__ macro (MSVC doesn't support __func__) + * tested on gcc 4.4.5 and Visual Studio 2008 (9.0), compiler version 15.00 + * + * 2011, Razvan Deaconescu, razvan.deaconescu@cs.pub.ro + */ + +#ifndef DEBUG_H_ +#define DEBUG_H_ 1 + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +/* log levels */ +enum { + LOG_EMERG = 1, + LOG_ALERT, + LOG_CRIT, + LOG_ERR, + LOG_WARNING, + LOG_NOTICE, + LOG_INFO, + LOG_DEBUG +}; + +/* + * initialize default loglevel (for dlog) + * may be redefined in the including code + */ + +#ifndef LOG_LEVEL +#define LOG_LEVEL LOG_WARNING +#endif + +/* + * define DEBUG macro as a compiler option: + * -DDEBUG for GCC + * /DDEBUG for MSVC + */ + +#if defined DEBUG +#define dprintf(format, ...) \ + fprintf(stderr, " [%s(), %s:%u] " format, \ + __FUNCTION__, __FILE__, __LINE__, \ + ##__VA_ARGS__) +#else +#define dprintf(format, ...) \ + do { \ + } while (0) +#endif + +#if defined DEBUG +#define dlog(level, format, ...) \ + do { \ + if (level <= LOG_LEVEL) \ + dprintf(format, ##__VA_ARGS__); \ + } while (0) +#else +#define dlog(level, format, ...) \ + do { \ + } while (0) +#endif + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/raw/test/test.c b/src/raw/test/test.c new file mode 100644 index 0000000..3364e05 --- /dev/null +++ b/src/raw/test/test.c @@ -0,0 +1,64 @@ +/* + * Test swift. Imports functions from test_sw_* files and runs tests. + */ + +#include +#include +#include + +#include "debug.h" +#include "util.h" + +#include "test_sw.h" + +static void (*test_fun_array[])(void) = { + NULL, + dummy_1_eq_1, + dummy_1_neq_0, + socket_dummy, + bind_dummy, + getsockname_dummy, + sendto_dummy, + recvfrom_dummy, + sendmsg_dummy, + recvmsg_dummy, + shutdown_dummy, + close_dummy, +}; + +static void usage(const char *argv0) +{ + fprintf(stderr, "Usage: %s [test_no]\n\n", argv0); + exit(EXIT_FAILURE); +} + +/* + * In case of no arguments call all functions defined in test_fun_array. + */ + +int main(int argc, char **argv) +{ + int test_idx; + + /* No arguments: call all test functions. */ + if (argc == 1) { + int i; + for (i = 1; i < sizeof(test_fun_array)/sizeof(test_fun_array[0]); i++) + test_fun_array[i](); + return 0; + } + + if (argc != 2) + usage(argv[0]); + + test_idx = atoi(argv[1]); + + if (test_idx < 1 || test_idx >= sizeof(test_fun_array)/sizeof(test_fun_array[0])) { + fprintf(stderr, "Error: test index %d is out of bounds\n", test_idx); + exit(EXIT_FAILURE); + } + + test_fun_array[test_idx](); + + return 0; +} diff --git a/src/raw/test/test.h b/src/raw/test/test.h new file mode 100644 index 0000000..1de3cb1 --- /dev/null +++ b/src/raw/test/test.h @@ -0,0 +1,61 @@ +/* + * generic test suite + * + * test macros and headers + */ + +#ifndef TEST_H_ +#define TEST_H_ 1 + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include + +/* + * uncommend EXIT_IF_FAIL macro in order to stop test execution + * at first failed test + */ + +/*#define EXIT_IF_FAIL 1*/ + +#if defined (EXIT_IF_FAIL) +#define test_do_fail() \ + do { \ + printf("failed\n"); \ + exit(EXIT_FAILURE); \ + } while (0) +#else +#define test_do_fail() \ + printf("failed\n") +#endif + +#define test_do_pass() \ + printf("passed\n") + +#define test(test) \ + do { \ + size_t i; \ + int t = (test); \ + \ + printf("%s", __FUNCTION__); \ + fflush(stdout); \ + \ + for (i = 0; i < 60 - strlen(__FUNCTION__); i++) \ + putchar('.'); \ + \ + if (!t) \ + test_do_fail(); \ + else \ + test_do_pass(); \ + \ + fflush(stdout); \ + } while (0) + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/raw/test/test_dummy.c b/src/raw/test/test_dummy.c new file mode 100644 index 0000000..99f29d2 --- /dev/null +++ b/src/raw/test/test_dummy.c @@ -0,0 +1,15 @@ +/* + * Dummy test functions. + */ + +#include "test.h" + +void dummy_1_eq_1(void) +{ + test(1 == 1); +} + +void dummy_1_neq_0(void) +{ + test(1 != 0); +} diff --git a/src/raw/test/test_sw.h b/src/raw/test/test_sw.h new file mode 100644 index 0000000..145fa45 --- /dev/null +++ b/src/raw/test/test_sw.h @@ -0,0 +1,30 @@ +/* + * Header for all swift test functions. + */ + +#ifndef TEST_SW_H_ +#define TEST_SW_H_ 1 + +#ifdef __cplusplus +extern "C" { +#endif + +void dummy_1_eq_1(void); +void dummy_1_neq_0(void); +void socket_dummy(void); +void bind_dummy(void); +void getsockname_dummy(void); +void sendto_dummy(void); +void recvfrom_dummy(void); +void sendmsg_dummy(void); +void recvmsg_dummy(void); +void shutdown_dummy(void); +void close_dummy(void); + +/* TODO: fill with test function headers. */ + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/raw/test/test_sw_bind.c b/src/raw/test/test_sw_bind.c new file mode 100644 index 0000000..b3ee88e --- /dev/null +++ b/src/raw/test/test_sw_bind.c @@ -0,0 +1,11 @@ +/* + * Test sw_bind "syscall". + */ + +#include "test_sw.h" +#include "test.h" + +void bind_dummy(void) +{ + test(1 == 1); +} diff --git a/src/raw/test/test_sw_close.c b/src/raw/test/test_sw_close.c new file mode 100644 index 0000000..734bc43 --- /dev/null +++ b/src/raw/test/test_sw_close.c @@ -0,0 +1,12 @@ +/* + * Test sw_close "syscall". + */ + +#include "test_sw.h" +#include "test.h" + +void close_dummy(void) +{ + test(1 == 1); +} + diff --git a/src/raw/test/test_sw_getsockname.c b/src/raw/test/test_sw_getsockname.c new file mode 100644 index 0000000..e93ec0e --- /dev/null +++ b/src/raw/test/test_sw_getsockname.c @@ -0,0 +1,12 @@ +/* + * Test sw_getsockname "syscall". + */ + +#include "test_sw.h" +#include "test.h" + +void getsockname_dummy(void) +{ + test(1 == 1); +} + diff --git a/src/raw/test/test_sw_getsockopt.c b/src/raw/test/test_sw_getsockopt.c new file mode 100644 index 0000000..e727802 --- /dev/null +++ b/src/raw/test/test_sw_getsockopt.c @@ -0,0 +1,12 @@ +/* + * Test sw_getsockopt "syscall". + */ + +#include "test_sw.h" +#include "test.h" + +void getsockopt_dummy(void) +{ + test(1 == 1); +} + diff --git a/src/raw/test/test_sw_recvfrom.c b/src/raw/test/test_sw_recvfrom.c new file mode 100644 index 0000000..aec8cf1 --- /dev/null +++ b/src/raw/test/test_sw_recvfrom.c @@ -0,0 +1,12 @@ +/* + * Test sw_recvfrom "syscall". + */ + +#include "test_sw.h" +#include "test.h" + +void recvfrom_dummy(void) +{ + test(1 == 1); +} + diff --git a/src/raw/test/test_sw_recvmsg.c b/src/raw/test/test_sw_recvmsg.c new file mode 100644 index 0000000..8d07d18 --- /dev/null +++ b/src/raw/test/test_sw_recvmsg.c @@ -0,0 +1,12 @@ +/* + * Test sw_recvmsg "syscall". + */ + +#include "test_sw.h" +#include "test.h" + +void recvmsg_dummy(void) +{ + test(1 == 1); +} + diff --git a/src/raw/test/test_sw_sendmsg.c b/src/raw/test/test_sw_sendmsg.c new file mode 100644 index 0000000..9be7d22 --- /dev/null +++ b/src/raw/test/test_sw_sendmsg.c @@ -0,0 +1,11 @@ +/* + * Test sw_sendmsg "syscall". + */ + +#include "test_sw.h" +#include "test.h" + +void sendmsg_dummy(void) +{ + test(1 == 1); +} diff --git a/src/raw/test/test_sw_sendto.c b/src/raw/test/test_sw_sendto.c new file mode 100644 index 0000000..97f8d29 --- /dev/null +++ b/src/raw/test/test_sw_sendto.c @@ -0,0 +1,11 @@ +/* + * Test sw_sendto "syscall". + */ + +#include "test_sw.h" +#include "test.h" + +void sendto_dummy(void) +{ + test(1 == 1); +} diff --git a/src/raw/test/test_sw_setsockopt.c b/src/raw/test/test_sw_setsockopt.c new file mode 100644 index 0000000..fef7a0e --- /dev/null +++ b/src/raw/test/test_sw_setsockopt.c @@ -0,0 +1,11 @@ +/* + * Test sw_setsockopt "syscall". + */ + +#include "test_sw.h" +#include "test.h" + +void setsockopt_dummy(void) +{ + test(1 == 1); +} diff --git a/src/raw/test/test_sw_shutdown.c b/src/raw/test/test_sw_shutdown.c new file mode 100644 index 0000000..0777d80 --- /dev/null +++ b/src/raw/test/test_sw_shutdown.c @@ -0,0 +1,11 @@ +/* + * Test sw_shutdown "syscall". + */ + +#include "test_sw.h" +#include "test.h" + +void shutdown_dummy(void) +{ + test(1 == 1); +} diff --git a/src/raw/test/test_sw_socket.c b/src/raw/test/test_sw_socket.c new file mode 100644 index 0000000..89d4baa --- /dev/null +++ b/src/raw/test/test_sw_socket.c @@ -0,0 +1,11 @@ +/* + * Test sw_socket "syscall". + */ + +#include "test_sw.h" +#include "test.h" + +void socket_dummy(void) +{ + test(1 == 1); +} diff --git a/src/raw/test/util.h b/src/raw/test/util.h new file mode 100644 index 0000000..776715a --- /dev/null +++ b/src/raw/test/util.h @@ -0,0 +1,71 @@ +/* + * useful structures/macros + * + * 2011, Operating Systems + */ + +#ifndef UTIL_H_ +#define UTIL_H_ 1 + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include + +#if defined (_WIN32) + +#include + +static VOID PrintLastError(const PCHAR message) +{ + CHAR errBuff[1024]; + + FormatMessage( + FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_MAX_WIDTH_MASK, + NULL, + GetLastError(), + 0, + errBuff, + sizeof(errBuff) - 1, + NULL); + + fprintf(stderr, "%s: %s\n", message, errBuff); +} + +#define ERR(call_description) \ + do { \ + fprintf(stderr, "(%s, %d): ", \ + __FILE__, __LINE__); \ + PrintLastError(call_description); \ + } while (0) + +#elif defined (__linux__) + +/* error printing macro */ +#define ERR(call_description) \ + do { \ + fprintf(stderr, "(%s, %d): ", \ + __FILE__, __LINE__); \ + perror(call_description); \ + } while (0) + +#else + #error "Unknown platform" +#endif + +/* print error (call ERR) and exit */ +#define DIE(assertion, call_description) \ + do { \ + if (assertion) { \ + ERR(call_description); \ + exit(EXIT_FAILURE); \ + } \ + } while(0) + +#ifdef __cplusplus +} +#endif + +#endif -- 2.20.1