summaryrefslogtreecommitdiff
path: root/unittests
diff options
context:
space:
mode:
authorTomohiro Kusumi <kusumi.tomohiro@gmail.com>2018-10-26 09:35:40 -0700
committerJens Axboe <axboe@kernel.dk>2018-10-26 10:24:19 -0600
commitb8b0e1eea7780a02ff67f0caeba446cc403f1b37 (patch)
tree3e20e67dc0668bc87042245150707b88f1025278 /unittests
parentd7e92306bde2117702ed96b7c5647d9485869047 (diff)
downloadfio-b8b0e1eea7780a02ff67f0caeba446cc403f1b37.tar.gz
fio-b8b0e1eea7780a02ff67f0caeba446cc403f1b37.tar.bz2
unittests: add CUnit based unittest framework
CUnit is C version of *unit framework to help write test cases. https://sourceforge.net/projects/cunit/ unittests/* are compiled only if CUnit exists, and detected on build time in ./configure like any other build time detection, by running a simple CUnit initialization code. Some OS/distros have binary package for CUnit. In case of Fedora and FreeBSD, they both install shared library (libcunit.so) and CUnit headers required to compile fio's unittests. Fedora: # dnf install CUnit FreeBSD: # pkg install cunit To build and install CUnit from upstream source, do below. # ./bootstrap && make && make install Note that make install seems to install binaries and headers under ~/CUnitHome/ by default. After applying actual test cases in the next few commits, running ./unittests/unittest will print results to stdout. These are examples of test cases, and one can add more tests. -- Example of unittest results # ./unittests/unittest CUnit - A unit testing framework for C - Version 2.1-3 http://cunit.sourceforge.net/ Suite: lib/memalign.c Test: memalign/1 ...passed Suite: lib/strntol.c Test: strntol/1 ...passed Test: strntol/2 ...FAILED 1. unittests/lib/strntol.c:24 - CU_ASSERT_EQUAL(*endp,'\0') Test: strntol/3 ...passed Suite: oslib/strlcat.c Test: strlcat/1 ...passed Test: strlcat/2 ...FAILED 1. unittests/oslib/strlcat.c:28 - CU_ASSERT_EQUAL(strcmp(dst, ""),0) Suite: oslib/strndup.c Test: strndup/1 ...passed Test: strndup/2 ...passed Test: strndup/3 ...passed Run Summary: Type Total Ran Passed Failed Inactive suites 4 4 n/a 0 0 tests 9 9 7 2 0 asserts 18 18 16 2 n/a Elapsed time = 0.000 seconds Signed-off-by: Tomohiro Kusumi <kusumi.tomohiro@gmail.com> Signed-off-by: Jens Axboe <axboe@kernel.dk>
Diffstat (limited to 'unittests')
-rw-r--r--unittests/unittest.c58
-rw-r--r--unittests/unittest.h15
2 files changed, 73 insertions, 0 deletions
diff --git a/unittests/unittest.c b/unittests/unittest.c
new file mode 100644
index 00000000..bc75bb6e
--- /dev/null
+++ b/unittests/unittest.c
@@ -0,0 +1,58 @@
+/*
+ * fio unittest
+ * Copyright (C) 2018 Tomohiro Kusumi <kusumi.tomohiro@osnexus.com>
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "./unittest.h"
+
+CU_ErrorCode fio_unittest_add_suite(const char *name, CU_InitializeFunc initfn,
+ CU_CleanupFunc cleanfn, struct fio_unittest_entry *tvec)
+{
+ CU_pSuite pSuite;
+ struct fio_unittest_entry *t;
+
+ pSuite = CU_add_suite(name, initfn, cleanfn);
+ if (!pSuite) {
+ CU_cleanup_registry();
+ return CU_get_error();
+ }
+
+ t = tvec;
+ while (t && t->name) {
+ if (!CU_add_test(pSuite, t->name, t->fn)) {
+ CU_cleanup_registry();
+ return CU_get_error();
+ }
+ t++;
+ }
+
+ return CUE_SUCCESS;
+}
+
+static void fio_unittest_register(CU_ErrorCode (*fn)(void))
+{
+ if (fn && fn() != CUE_SUCCESS) {
+ fprintf(stderr, "%s\n", CU_get_error_msg());
+ exit(1);
+ }
+}
+
+int main(void)
+{
+ if (CU_initialize_registry() != CUE_SUCCESS) {
+ fprintf(stderr, "%s\n", CU_get_error_msg());
+ exit(1);
+ }
+
+ /* Register unittest suites. */
+ fio_unittest_register(NULL); /* prevent unused warning */
+
+ CU_basic_set_mode(CU_BRM_VERBOSE);
+ CU_basic_run_tests();
+ CU_cleanup_registry();
+
+ return CU_get_error();
+}
diff --git a/unittests/unittest.h b/unittests/unittest.h
new file mode 100644
index 00000000..4ac6366b
--- /dev/null
+++ b/unittests/unittest.h
@@ -0,0 +1,15 @@
+#ifndef FIO_UNITTEST_H
+#define FIO_UNITTEST_H
+
+#include <CUnit/CUnit.h>
+#include <CUnit/Basic.h>
+
+struct fio_unittest_entry {
+ const char *name;
+ CU_TestFunc fn;
+};
+
+CU_ErrorCode fio_unittest_add_suite(const char*, CU_InitializeFunc,
+ CU_CleanupFunc, struct fio_unittest_entry*);
+
+#endif