[sheepdog] [PATCH 2/4] tests/unit: introduce mock
Kai Zhang
kyle at zelin.io
Wed Jul 10 12:23:15 CEST 2013
Signed-off-by: Kai Zhang <kyle at zelin.io>
---
configure.ac | 1 +
tests/unit/Makefile.am | 2 +-
tests/unit/mock/Makefile.am | 7 +++++
tests/unit/mock/mock.c | 41 ++++++++++++++++++++++++++++
tests/unit/mock/mock.h | 63 +++++++++++++++++++++++++++++++++++++++++++
5 files changed, 113 insertions(+), 1 deletion(-)
create mode 100644 tests/unit/mock/Makefile.am
create mode 100644 tests/unit/mock/mock.c
create mode 100644 tests/unit/mock/mock.h
diff --git a/configure.ac b/configure.ac
index b609fac..84ce448 100644
--- a/configure.ac
+++ b/configure.ac
@@ -136,6 +136,7 @@ AC_CONFIG_FILES([Makefile
man/Makefile
shepherd/Makefile
tests/unit/Makefile
+ tests/unit/mock/Makefile
tests/unit/collie/Makefile
tests/unit/sheep/Makefile
tools/Makefile])
diff --git a/tests/unit/Makefile.am b/tests/unit/Makefile.am
index eb0a50e..3e6255a 100644
--- a/tests/unit/Makefile.am
+++ b/tests/unit/Makefile.am
@@ -1,3 +1,3 @@
MAINTAINERCLEANFILES = Makefile.in
-SUBDIRS = collie sheep
+SUBDIRS = mock collie sheep
diff --git a/tests/unit/mock/Makefile.am b/tests/unit/mock/Makefile.am
new file mode 100644
index 0000000..b7c0c32
--- /dev/null
+++ b/tests/unit/mock/Makefile.am
@@ -0,0 +1,7 @@
+MAINTAINERCLEANFILES = Makefile.in
+
+INCLUDES = -I$(top_builddir)/include -I$(top_srcdir)/include
+
+noinst_LIBRARIES = libmock.a
+
+libmock_a_SOURCES = mock.c
diff --git a/tests/unit/mock/mock.c b/tests/unit/mock/mock.c
new file mode 100644
index 0000000..11f68b8
--- /dev/null
+++ b/tests/unit/mock/mock.c
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2013 Zelin.io
+ *
+ * Kai Zhang <kyle at zelin.io>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License version
+ * 2 as published by the Free Software Foundation.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <string.h>
+
+#include "list.h"
+#include "logger.h"
+#include "mock.h"
+
+LIST_HEAD(mock_methods);
+
+static struct mock_method *find_method(const char *name)
+{
+ struct mock_method *method;
+ int len;
+ list_for_each_entry(method, &mock_methods, list) {
+ len = strlen(method->name);
+ if (strncmp(method->name, name, len) == 0)
+ return method;
+ }
+ return NULL;
+}
+
+int __method_nr_call(const char *name)
+{
+ struct mock_method *method = find_method(name);
+ if (method)
+ return method->nr_call;
+ else
+ panic("%s is not a mock method", name);
+}
diff --git a/tests/unit/mock/mock.h b/tests/unit/mock/mock.h
new file mode 100644
index 0000000..a614f20
--- /dev/null
+++ b/tests/unit/mock/mock.h
@@ -0,0 +1,63 @@
+/*
+ * Copyright (C) 2013 Zelin.io
+ *
+ * Kai Zhang <kyle at zelin.io>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License version
+ * 2 as published by the Free Software Foundation.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef __MOCK_H__
+#define __MOCK_H__
+
+#include "list.h"
+
+struct mock_argument {
+ void *addr;
+ struct list_head list;
+};
+
+struct mock_method {
+ const char *name;
+ int nr_call;
+ struct list_head list;
+};
+
+extern struct list_head mock_methods;
+#define method_register(m) \
+ static void __attribute__((constructor)) regist_##m(void) \
+ { \
+ list_add(&m.list, &mock_methods); \
+ }
+
+#define MOCK_VOID_METHOD(m, ...) \
+ static struct mock_method _##m = { \
+ .name = #m, \
+ }; \
+ void m(__VA_ARGS__) \
+ { \
+ _##m.nr_call++; \
+ return; \
+ } \
+ method_register(_##m)
+
+#define MOCK_METHOD(m,rt, rv, ...) \
+ static struct mock_method _##m = { \
+ .name = #m, \
+ }; \
+ rt m(__VA_ARGS__) \
+ { \
+ _##m.nr_call++; \
+ return rv; \
+ } \
+ method_register(_##m)
+
+int __method_nr_call(const char *name);
+
+#define METHOD_NR_CALL(m) __method_nr_call(#m)
+
+#endif
--
1.7.9.5
More information about the sheepdog
mailing list