netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Alexandru Copot <alex.mihai.c@gmail.com>
To: linux-kernel@vger.kernel.org
Cc: netdev@vger.kernel.org, akpm@linux-foundation.org,
	davem@davemloft.net, willemb@google.com, dborkman@redhat.com,
	ebiederm@xmission.com, gorcunov@openvz.org, palewis@adobe.com,
	edumazet@google.com, Alexandru Copot <alex.mihai.c@gmail.com>,
	Daniel Baluta <dbaluta@ixiacom.com>
Subject: [PATCH 1/3 RFC v2] selftests: introduce testing abstractions
Date: Thu, 25 Apr 2013 14:04:58 +0300	[thread overview]
Message-ID: <1366887900-24769-2-git-send-email-alex.mihai.c@gmail.com> (raw)
In-Reply-To: <1366887900-24769-1-git-send-email-alex.mihai.c@gmail.com>

Signed-of-by Alexandru Copot <alex.mihai.c@gmail.com>
Cc: Daniel Baluta <dbaluta@ixiacom.com>
---
 tools/testing/selftests/Makefile        |  3 +-
 tools/testing/selftests/lib/Makefile    | 14 +++++++
 tools/testing/selftests/lib/selftests.c | 57 ++++++++++++++++++++++++++++
 tools/testing/selftests/lib/selftests.h | 67 +++++++++++++++++++++++++++++++++
 4 files changed, 140 insertions(+), 1 deletion(-)
 create mode 100644 tools/testing/selftests/lib/Makefile
 create mode 100644 tools/testing/selftests/lib/selftests.c
 create mode 100644 tools/testing/selftests/lib/selftests.h

diff --git a/tools/testing/selftests/Makefile b/tools/testing/selftests/Makefile
index a480593..e0fccd9 100644
--- a/tools/testing/selftests/Makefile
+++ b/tools/testing/selftests/Makefile
@@ -1,4 +1,5 @@
-TARGETS = breakpoints
+TARGETS = lib
+TARGETS += breakpoints
 TARGETS += kcmp
 TARGETS += mqueue
 TARGETS += vm
diff --git a/tools/testing/selftests/lib/Makefile b/tools/testing/selftests/lib/Makefile
new file mode 100644
index 0000000..9c81d0c
--- /dev/null
+++ b/tools/testing/selftests/lib/Makefile
@@ -0,0 +1,14 @@
+
+CFLAGS = -Wall -O2 -c -g
+
+selftests.a: selftests.o
+	ar qc $@ $^
+
+%.c: %.h
+
+%.o: %.c
+	$(CC) $(CFLAGS) -o $@ $^
+
+clean:
+	rm -rf *.o *.a
+
diff --git a/tools/testing/selftests/lib/selftests.c b/tools/testing/selftests/lib/selftests.c
new file mode 100644
index 0000000..1a65785
--- /dev/null
+++ b/tools/testing/selftests/lib/selftests.c
@@ -0,0 +1,57 @@
+#include <stdio.h>
+#include <stdarg.h>
+
+#include "selftests.h"
+
+test_result_t __assert(int expr, const char *filename, int line, const char *fmt, ...)
+{
+	va_list vl;
+	const char *m;
+	char msg[BUFSIZ];
+
+	if (expr)
+		return TEST_PASS;
+
+	fprintf(stderr, "\n(%s:%d) ", filename, line);
+
+	va_start(vl, fmt);
+	m = va_arg(vl, char *);
+	if (!m)
+		m = fmt;
+	else
+		fprintf(stderr, "%s ", fmt);
+
+	vsnprintf(msg, sizeof msg, m, vl);
+	va_end(vl);
+
+	fprintf(stderr, "%s\n", msg);
+
+	return TEST_FAIL;
+}
+
+test_result_t run_all_tests(struct generic_test *test, void *param)
+{
+	int i;
+	char *ptr = test->testcases;
+	test_result_t rc = TEST_PASS;
+
+	rc = test->prepare ? test->prepare(param) : 0;
+	if (rc == TEST_FAIL)
+		return rc;
+
+	fprintf(stderr, "Testing: %s ", test->name);
+	for (i = 0; i < test->testcase_count; i++) {
+
+		rc |= test->run(ptr);
+		ptr += test->testcase_size;
+		
+		if (rc == TEST_FAIL && test->abort_on_fail) {
+			fprintf(stderr, "Test aborted\n");
+			break;
+		}
+	}
+
+	fprintf(stderr, "\t\t%s\n", rc ? "[FAIL]" : "[PASS]");
+	return rc;
+}
+
diff --git a/tools/testing/selftests/lib/selftests.h b/tools/testing/selftests/lib/selftests.h
new file mode 100644
index 0000000..6210199
--- /dev/null
+++ b/tools/testing/selftests/lib/selftests.h
@@ -0,0 +1,67 @@
+#ifndef SELFTESTS_H
+#define SELFTESTS_H
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <errno.h>
+
+typedef enum test_result {
+	TEST_PASS = 0,
+	TEST_FAIL,
+} test_result_t;
+
+test_result_t __assert(int expr, const char *filename, int line, const char *fmt, ...);
+
+#define abort(cond) do {							\
+	if (!(cond)) {								\
+		fprintf(stderr, "%s:%d %s\n", __FILE__, __LINE__, #cond);	\
+		perror("");							\
+		exit(EXIT_FAILURE);						\
+	}									\
+} while (0)
+
+#define pass_if(expr, label, ret)				\
+	do {                                                    \
+		if (expr) {					\
+			ret = TEST_PASS;			\
+			goto label;				\
+		}						\
+	} while (0)
+
+/* @expr:   a boolean expression
+ * @label:  jump here to free resources if it fails
+ * @ret:    a test_result_t variable that will hold the result of the test
+ *          This can be later returned from the test function.
+ */
+#define check(expr, label, ret, ...)					     \
+	do {                                                                 \
+		ret = __assert(expr, __FILE__, __LINE__,       		     \
+			       "Assertion '" #expr "' failed", __VA_ARGS__); \
+		if (!(expr)) {						     \
+			perror("");					     \
+			goto label;                                          \
+		}							     \
+	} while (0)
+
+struct generic_test {
+	const char *name;
+	void *private;
+
+
+	void *testcases;
+	int testcase_size;
+	int testcase_count;
+
+	/* Ends all tests if one fails */
+	int abort_on_fail;
+
+	test_result_t (*prepare)(void *);
+	test_result_t (*run)(void *);
+	test_result_t (*cleanup)(void *);
+};
+
+test_result_t run_all_tests(struct generic_test *test, void *param);
+
+#endif
+
+
-- 
1.8.2.1

  reply	other threads:[~2013-04-25 11:05 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-04-25 11:04 [PATCH 0/3 RFC v2] selftests: Basic framework for tests Alexandru Copot
2013-04-25 11:04 ` Alexandru Copot [this message]
2013-04-25 18:19   ` [PATCH 1/3 RFC v2] selftests: introduce testing abstractions Daniel Borkmann
2013-04-26  8:39     ` Alexandru Copot
2013-04-25 11:04 ` [PATCH 2/3 RFC v2] selftests/net: update socket test to use new testing framework Alexandru Copot
2013-04-25 11:05 ` [PATCH 3/3 RFC v2] selftests/net: add socket options test with IPv6 testcases Alexandru Copot
2013-04-25 11:27 ` [PATCH 0/3 RFC v2] selftests: Basic framework for tests Daniel Borkmann
2013-04-25 11:36   ` Alexandru Copot

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1366887900-24769-2-git-send-email-alex.mihai.c@gmail.com \
    --to=alex.mihai.c@gmail.com \
    --cc=akpm@linux-foundation.org \
    --cc=davem@davemloft.net \
    --cc=dbaluta@ixiacom.com \
    --cc=dborkman@redhat.com \
    --cc=ebiederm@xmission.com \
    --cc=edumazet@google.com \
    --cc=gorcunov@openvz.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=netdev@vger.kernel.org \
    --cc=palewis@adobe.com \
    --cc=willemb@google.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).