raw: Add skeleton test suite for swift raw.
authorRazvan Deaconescu <razvan.deaconescu@cs.pub.ro>
Sat, 21 May 2011 11:07:15 +0000 (14:07 +0300)
committerRazvan Deaconescu <razvan.deaconescu@cs.pub.ro>
Sat, 21 May 2011 11:08:04 +0000 (14:08 +0300)
19 files changed:
src/raw/test/.gitignore [new file with mode: 0644]
src/raw/test/Makefile [new file with mode: 0644]
src/raw/test/debug.h [new file with mode: 0644]
src/raw/test/test.c [new file with mode: 0644]
src/raw/test/test.h [new file with mode: 0644]
src/raw/test/test_dummy.c [new file with mode: 0644]
src/raw/test/test_sw.h [new file with mode: 0644]
src/raw/test/test_sw_bind.c [new file with mode: 0644]
src/raw/test/test_sw_close.c [new file with mode: 0644]
src/raw/test/test_sw_getsockname.c [new file with mode: 0644]
src/raw/test/test_sw_getsockopt.c [new file with mode: 0644]
src/raw/test/test_sw_recvfrom.c [new file with mode: 0644]
src/raw/test/test_sw_recvmsg.c [new file with mode: 0644]
src/raw/test/test_sw_sendmsg.c [new file with mode: 0644]
src/raw/test/test_sw_sendto.c [new file with mode: 0644]
src/raw/test/test_sw_setsockopt.c [new file with mode: 0644]
src/raw/test/test_sw_shutdown.c [new file with mode: 0644]
src/raw/test/test_sw_socket.c [new file with mode: 0644]
src/raw/test/util.h [new file with mode: 0644]

diff --git a/src/raw/test/.gitignore b/src/raw/test/.gitignore
new file mode 100644 (file)
index 0000000..ee4c926
--- /dev/null
@@ -0,0 +1 @@
+/test
diff --git a/src/raw/test/Makefile b/src/raw/test/Makefile
new file mode 100644 (file)
index 0000000..46ca48a
--- /dev/null
@@ -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 (file)
index 0000000..493e985
--- /dev/null
@@ -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 <stdio.h>
+
+/* 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 (file)
index 0000000..3364e05
--- /dev/null
@@ -0,0 +1,64 @@
+/*
+ * Test swift. Imports functions from test_sw_* files and runs tests.
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+#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 (file)
index 0000000..1de3cb1
--- /dev/null
@@ -0,0 +1,61 @@
+/*
+ * generic test suite
+ *
+ * test macros and headers
+ */
+
+#ifndef TEST_H_
+#define TEST_H_                1
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <stdio.h>
+#include <string.h>
+
+/*
+ * 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 (file)
index 0000000..99f29d2
--- /dev/null
@@ -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 (file)
index 0000000..145fa45
--- /dev/null
@@ -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 (file)
index 0000000..b3ee88e
--- /dev/null
@@ -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 (file)
index 0000000..734bc43
--- /dev/null
@@ -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 (file)
index 0000000..e93ec0e
--- /dev/null
@@ -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 (file)
index 0000000..e727802
--- /dev/null
@@ -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 (file)
index 0000000..aec8cf1
--- /dev/null
@@ -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 (file)
index 0000000..8d07d18
--- /dev/null
@@ -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 (file)
index 0000000..9be7d22
--- /dev/null
@@ -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 (file)
index 0000000..97f8d29
--- /dev/null
@@ -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 (file)
index 0000000..fef7a0e
--- /dev/null
@@ -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 (file)
index 0000000..0777d80
--- /dev/null
@@ -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 (file)
index 0000000..89d4baa
--- /dev/null
@@ -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 (file)
index 0000000..776715a
--- /dev/null
@@ -0,0 +1,71 @@
+/*
+ * useful structures/macros
+ *
+ * 2011, Operating Systems
+ */
+
+#ifndef UTIL_H_
+#define UTIL_H_                1
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#if defined (_WIN32)
+
+#include <windows.h>
+
+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