gfs2-utils: master - tests: Add unit tests for the new extent search functions

Andrew Price andyp at fedoraproject.org
Fri Sep 5 13:39:28 UTC 2014


Gitweb:        http://git.fedorahosted.org/git/?p=gfs2-utils.git;a=commitdiff;h=a4a76a6ffde5c7305f48ff9e2bff1830cfadcc82
Commit:        a4a76a6ffde5c7305f48ff9e2bff1830cfadcc82
Parent:        5cc5a173c606a85cb8d07b6d28d112b05caeb2f6
Author:        Andrew Price <anprice at redhat.com>
AuthorDate:    Thu Aug 21 15:26:14 2014 +0100
Committer:     Andrew Price <anprice at redhat.com>
CommitterDate: Mon Sep 1 11:31:11 2014 +0100

tests: Add unit tests for the new extent search functions

The rbm search functions added by the previous commit added a certain
amount of complexity. These unit tests go a long way to making sure
they're doing what they're meant to do, and also demonstrate how the new
rgrp functions work without any i/o required.

The unit test sources have also been reorganised to match the names of
the libgfs2 source files they test.

Signed-off-by: Andrew Price <anprice at redhat.com>
---
 .gitignore         |    3 +-
 tests/Makefile.am  |   33 ++++++++----
 tests/check_rgrp.c |  143 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 tests/libgfs2.at   |    8 ++-
 4 files changed, 173 insertions(+), 14 deletions(-)

diff --git a/.gitignore b/.gitignore
index ae72f2b..4ffdb71 100644
--- a/.gitignore
+++ b/.gitignore
@@ -42,7 +42,8 @@ gfs2/fsck/fsck.gfs2
 gfs2/mkfs/mkfs.gfs2
 gfs2/tune/tunegfs2
 test-driver
-tests/check_libgfs2
+tests/check_meta
+tests/check_rgrp
 tests/testvol
 tests/testsuite.log
 tests/testsuite.dir
diff --git a/tests/Makefile.am b/tests/Makefile.am
index 5f02d3a..70e77ef 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -3,20 +3,28 @@ DISTCLEANFILES = atlocal atconfig
 CLEANFILES = testvol
 
 if BUILD_TESTS
-check_PROGRAMS = check_libgfs2
-
-check_libgfs2_SOURCES = \
-	check_meta.c \
+UNIT_TESTS = \
+	check_meta \
+	check_rgrp
+UNIT_SOURCES = \
 	$(top_srcdir)/gfs2/libgfs2/libgfs2.h
-
-check_libgfs2_CFLAGS = \
+UNIT_CFLAGS = \
 	-I$(top_srcdir)/gfs2/libgfs2 \
         -I$(top_srcdir)/gfs2/include \
 	@check_CFLAGS@
-
-check_libgfs2_LDADD = \
+UNIT_LDADD = \
 	$(top_builddir)/gfs2/libgfs2/libgfs2.la \
 	@check_LIBS@
+
+check_PROGRAMS = $(UNIT_TESTS)
+
+check_meta_SOURCES = $(UNIT_SOURCES) check_meta.c
+check_meta_CFLAGS = $(UNIT_CFLAGS)
+check_meta_LDADD = $(UNIT_LDADD)
+
+check_rgrp_SOURCES = $(UNIT_SOURCES) check_rgrp.c
+check_rgrp_CFLAGS = $(UNIT_CFLAGS)
+check_rgrp_LDADD = $(UNIT_LDADD)
 endif
 
 # The `:;' works around a Bash 3.2 bug when the output is not writable.
@@ -41,8 +49,11 @@ TESTSUITE_AT = \
 	testsuite.at \
 	mkfs.at \
 	fsck.at \
-	edit.at \
-	libgfs2.at
+	edit.at
+
+if BUILD_TESTS
+TESTSUITE_AT += libgfs2.at
+endif
 
 TESTSUITE = $(srcdir)/testsuite
 
@@ -61,6 +72,6 @@ atconfig: $(top_builddir)/config.status
 AUTOM4TE = $(SHELL) $(top_srcdir)/missing --run autom4te
 AUTOTEST = $(AUTOM4TE) --language=autotest
 
-$(TESTSUITE): $(TESTSUITE_AT) package.m4
+$(TESTSUITE): $(TESTSUITE_AT) package.m4 $(UNIT_TESTS)
 	$(AUTOTEST) -I '$(srcdir)' -o $@.tmp $@.at
 	mv $@.tmp $@
diff --git a/tests/check_rgrp.c b/tests/check_rgrp.c
new file mode 100644
index 0000000..d113846
--- /dev/null
+++ b/tests/check_rgrp.c
@@ -0,0 +1,143 @@
+#include <check.h>
+#include <libgfs2.h>
+#include <rgrp.h> /* Private header libgfs2/rgrp.h for convenience */
+
+// TODO: Remove this when the extern is removed from libgfs2
+void print_it(const char *label, const char *fmt, const char *fmt2, ...) {}
+
+static lgfs2_rgrps_t mockup_rgrp(void)
+{
+	struct gfs2_sbd *sdp;
+	lgfs2_rgrps_t rgs;
+	unsigned i;
+	uint64_t addr;
+	struct gfs2_rindex ri = {0};
+	lgfs2_rgrp_t rg;
+	uint32_t rgsize = (1024 << 20) / 4096;
+
+	sdp = calloc(1, sizeof(*sdp));
+	ck_assert_ptr_ne(sdp, NULL);
+
+	sdp->device.length = rgsize + 20;
+	sdp->device_fd = -1;
+	sdp->bsize = sdp->sd_sb.sb_bsize = 4096;
+	compute_constants(sdp);
+
+	rgs = lgfs2_rgrps_init(sdp, 0, 0);
+	ck_assert_ptr_ne(rgs, NULL);
+
+	lgfs2_rgrps_plan(rgs, sdp->device.length - 16, rgsize);
+
+	addr = lgfs2_rindex_entry_new(rgs, &ri, 16, rgsize);
+	ck_assert(addr != 0);
+
+	rg = lgfs2_rgrps_append(rgs, &ri);
+	ck_assert_ptr_ne(rg, NULL);
+
+	for (i = 0; i < rg->ri.ri_length; i++) {
+		rg->bits[i].bi_bh = bget(sdp, rg->ri.ri_addr + i);
+		ck_assert_ptr_ne(rg->bits[i].bi_bh, NULL);
+	}
+	return rgs;
+}
+
+START_TEST(test_mockup_rgrp)
+{
+	lgfs2_rgrps_t rgs = mockup_rgrp();
+	ck_assert_ptr_ne(rgs, NULL);
+}
+END_TEST
+
+START_TEST(test_rbm_find_good)
+{
+	uint32_t minext;
+	struct lgfs2_rbm rbm = {0};
+	lgfs2_rgrps_t rgs = mockup_rgrp();
+	rbm.rgd = lgfs2_rgrp_first(rgs);
+
+	/* Check that extent sizes up to the whole rg can be found */
+	for (minext = 1; minext <= rbm.rgd->ri.ri_data; minext++) {
+		int err;
+		uint64_t addr;
+
+		rbm.offset = rbm.bii = 0;
+
+		err = lgfs2_rbm_find(&rbm, GFS2_BLKST_FREE, &minext);
+		ck_assert_int_eq(err, 0);
+
+		addr = lgfs2_rbm_to_block(&rbm);
+		ck_assert_uint_eq(addr, rbm.rgd->ri.ri_data0);
+	}
+}
+END_TEST
+
+START_TEST(test_rbm_find_bad)
+{
+	int err;
+	uint32_t minext;
+	struct lgfs2_rbm rbm = {0};
+	lgfs2_rgrps_t rgs = mockup_rgrp();
+
+	rbm.rgd = lgfs2_rgrp_first(rgs);
+	minext = rbm.rgd->ri.ri_data + 1;
+
+	err = lgfs2_rbm_find(&rbm, GFS2_BLKST_FREE, &minext);
+	ck_assert_int_eq(err, 1);
+}
+END_TEST
+
+START_TEST(test_rbm_find_lastblock)
+{
+	int err;
+	unsigned i;
+	uint64_t addr;
+	uint32_t minext = 1; /* Only looking for one block */
+	struct lgfs2_rbm rbm = {0};
+	lgfs2_rgrp_t rg;
+	lgfs2_rgrps_t rgs = mockup_rgrp();
+
+	rbm.rgd = rg = lgfs2_rgrp_first(rgs);
+
+	/* Flag all blocks as allocated... */
+	for (i = 0; i < rg->ri.ri_length; i++)
+		memset(rg->bits[i].bi_bh->b_data, 0xff, rgs->sdp->bsize);
+
+	/* ...except the final one */
+	err = gfs2_set_bitmap(rg, rg->ri.ri_data0 + rg->ri.ri_data - 1, GFS2_BLKST_FREE);
+	ck_assert_int_eq(err, 0);
+
+	err = lgfs2_rbm_find(&rbm, GFS2_BLKST_FREE, &minext);
+	ck_assert_int_eq(err, 0);
+
+	addr = lgfs2_rbm_to_block(&rbm);
+	ck_assert_uint_eq(addr, rg->ri.ri_data0 + rg->ri.ri_data - 1);
+}
+END_TEST
+
+static Suite * libgfs2_suite(void)
+{
+
+	Suite *s = suite_create("libgfs2");
+
+	TCase *tc_rgrp = tcase_create("rgrp");
+
+	tcase_add_test(tc_rgrp, test_mockup_rgrp);
+	tcase_add_test(tc_rgrp, test_rbm_find_good);
+	tcase_add_test(tc_rgrp, test_rbm_find_bad);
+	tcase_add_test(tc_rgrp, test_rbm_find_lastblock);
+	tcase_set_timeout(tc_rgrp, 60);
+	suite_add_tcase(s, tc_rgrp);
+
+	return s;
+}
+
+int main(void)
+{
+	int failures;
+	Suite *s = libgfs2_suite();
+	SRunner *sr = srunner_create(s);
+	srunner_run_all(sr, CK_NORMAL);
+	failures = srunner_ntests_failed(sr);
+	srunner_free(sr);
+	return failures ? EXIT_FAILURE : EXIT_SUCCESS;
+}
diff --git a/tests/libgfs2.at b/tests/libgfs2.at
index a6b478a..8c44cdd 100644
--- a/tests/libgfs2.at
+++ b/tests/libgfs2.at
@@ -1,5 +1,9 @@
 AT_BANNER([libgfs2 unit tests])
 
-AT_SETUP([Metadata check])
-AT_CHECK([check_libgfs2], 0, [ignore], [ignore])
+AT_SETUP([meta.c])
+AT_CHECK([check_meta], 0, [ignore], [ignore])
+AT_CLEANUP
+
+AT_SETUP([rgrp.c])
+AT_CHECK([check_rgrp], 0, [ignore], [ignore])
 AT_CLEANUP


More information about the cluster-commits mailing list