Blame tests/check_rgrp.c

Packit 6ef888
#include <check.h>
Packit 6ef888
#include <libgfs2.h>
Packit 6ef888
#include <rgrp.h> /* Private header libgfs2/rgrp.h for convenience */
Packit 6ef888
Packit 6ef888
// TODO: Remove this when the extern is removed from libgfs2
Packit 6ef888
void print_it(const char *label, const char *fmt, const char *fmt2, ...) {}
Packit 6ef888
Packit 6ef888
static lgfs2_rgrps_t mockup_rgrp(void)
Packit 6ef888
{
Packit 6ef888
	struct gfs2_sbd *sdp;
Packit 6ef888
	lgfs2_rgrps_t rgs;
Packit 6ef888
	unsigned i;
Packit 6ef888
	uint64_t addr;
Packit 6ef888
	struct gfs2_rindex ri = {0};
Packit 6ef888
	lgfs2_rgrp_t rg;
Packit 6ef888
	uint32_t rgsize = (1024 << 20) / 4096;
Packit 6ef888
Packit 6ef888
	sdp = calloc(1, sizeof(*sdp));
Packit 6ef888
	fail_unless(sdp != NULL);
Packit 6ef888
Packit 6ef888
	sdp->device.length = rgsize + 20;
Packit 6ef888
	sdp->device_fd = -1;
Packit 6ef888
	sdp->bsize = sdp->sd_sb.sb_bsize = 4096;
Packit 6ef888
	compute_constants(sdp);
Packit 6ef888
Packit 6ef888
	rgs = lgfs2_rgrps_init(sdp, 0, 0);
Packit 6ef888
	fail_unless(rgs != NULL);
Packit 6ef888
Packit 6ef888
	lgfs2_rgrps_plan(rgs, sdp->device.length - 16, rgsize);
Packit 6ef888
Packit 6ef888
	addr = lgfs2_rindex_entry_new(rgs, &ri, 16, rgsize);
Packit 6ef888
	ck_assert(addr != 0);
Packit 6ef888
Packit 6ef888
	rg = lgfs2_rgrps_append(rgs, &ri, 0);
Packit 6ef888
	fail_unless(rg != NULL);
Packit 6ef888
Packit 6ef888
	for (i = 0; i < rg->ri.ri_length; i++) {
Packit 6ef888
		rg->bits[i].bi_bh = bget(sdp, rg->ri.ri_addr + i);
Packit 6ef888
		fail_unless(rg->bits[i].bi_bh != NULL);
Packit 6ef888
	}
Packit 6ef888
	return rgs;
Packit 6ef888
}
Packit 6ef888
Packit 6ef888
START_TEST(test_mockup_rgrp)
Packit 6ef888
{
Packit 6ef888
	lgfs2_rgrps_t rgs = mockup_rgrp();
Packit 6ef888
	fail_unless(rgs != NULL);
Packit 6ef888
}
Packit 6ef888
END_TEST
Packit 6ef888
Packit 6ef888
START_TEST(test_rbm_find_good)
Packit 6ef888
{
Packit 6ef888
	uint32_t minext;
Packit 6ef888
	struct lgfs2_rbm rbm = {0};
Packit 6ef888
	lgfs2_rgrps_t rgs = mockup_rgrp();
Packit 6ef888
	rbm.rgd = lgfs2_rgrp_first(rgs);
Packit 6ef888
Packit 6ef888
	/* Check that extent sizes up to the whole rg can be found */
Packit 6ef888
	for (minext = 1; minext <= rbm.rgd->ri.ri_data; minext++) {
Packit 6ef888
		int err;
Packit 6ef888
		uint64_t addr;
Packit 6ef888
Packit 6ef888
		rbm.offset = rbm.bii = 0;
Packit 6ef888
Packit 6ef888
		err = lgfs2_rbm_find(&rbm, GFS2_BLKST_FREE, &minext);
Packit 6ef888
		ck_assert_int_eq(err, 0);
Packit 6ef888
Packit 6ef888
		addr = lgfs2_rbm_to_block(&rbm;;
Packit 6ef888
		fail_unless(addr == rbm.rgd->ri.ri_data0);
Packit 6ef888
	}
Packit 6ef888
}
Packit 6ef888
END_TEST
Packit 6ef888
Packit 6ef888
START_TEST(test_rbm_find_bad)
Packit 6ef888
{
Packit 6ef888
	int err;
Packit 6ef888
	uint32_t minext;
Packit 6ef888
	struct lgfs2_rbm rbm = {0};
Packit 6ef888
	lgfs2_rgrps_t rgs = mockup_rgrp();
Packit 6ef888
Packit 6ef888
	rbm.rgd = lgfs2_rgrp_first(rgs);
Packit 6ef888
	minext = rbm.rgd->ri.ri_data + 1;
Packit 6ef888
Packit 6ef888
	err = lgfs2_rbm_find(&rbm, GFS2_BLKST_FREE, &minext);
Packit 6ef888
	ck_assert_int_eq(err, 1);
Packit 6ef888
}
Packit 6ef888
END_TEST
Packit 6ef888
Packit 6ef888
START_TEST(test_rbm_find_lastblock)
Packit 6ef888
{
Packit 6ef888
	int err;
Packit 6ef888
	unsigned i;
Packit 6ef888
	uint64_t addr;
Packit 6ef888
	uint32_t minext = 1; /* Only looking for one block */
Packit 6ef888
	struct lgfs2_rbm rbm = {0};
Packit 6ef888
	lgfs2_rgrp_t rg;
Packit 6ef888
	lgfs2_rgrps_t rgs = mockup_rgrp();
Packit 6ef888
Packit 6ef888
	rbm.rgd = rg = lgfs2_rgrp_first(rgs);
Packit 6ef888
Packit 6ef888
	/* Flag all blocks as allocated... */
Packit 6ef888
	for (i = 0; i < rg->ri.ri_length; i++)
Packit 6ef888
		memset(rg->bits[i].bi_bh->b_data, 0xff, rgs->sdp->bsize);
Packit 6ef888
Packit 6ef888
	/* ...except the final one */
Packit 6ef888
	err = gfs2_set_bitmap(rg, rg->ri.ri_data0 + rg->ri.ri_data - 1, GFS2_BLKST_FREE);
Packit 6ef888
	ck_assert_int_eq(err, 0);
Packit 6ef888
Packit 6ef888
	err = lgfs2_rbm_find(&rbm, GFS2_BLKST_FREE, &minext);
Packit 6ef888
	ck_assert_int_eq(err, 0);
Packit 6ef888
Packit 6ef888
	addr = lgfs2_rbm_to_block(&rbm;;
Packit 6ef888
	fail_unless(addr == (rg->ri.ri_data0 + rg->ri.ri_data - 1));
Packit 6ef888
}
Packit 6ef888
END_TEST
Packit 6ef888
Packit 6ef888
static Suite * libgfs2_suite(void)
Packit 6ef888
{
Packit 6ef888
Packit 6ef888
	Suite *s = suite_create("libgfs2");
Packit 6ef888
Packit 6ef888
	TCase *tc_rgrp = tcase_create("rgrp");
Packit 6ef888
Packit 6ef888
	tcase_add_test(tc_rgrp, test_mockup_rgrp);
Packit 6ef888
	tcase_add_test(tc_rgrp, test_rbm_find_good);
Packit 6ef888
	tcase_add_test(tc_rgrp, test_rbm_find_bad);
Packit 6ef888
	tcase_add_test(tc_rgrp, test_rbm_find_lastblock);
Packit 6ef888
	tcase_set_timeout(tc_rgrp, 0);
Packit 6ef888
	suite_add_tcase(s, tc_rgrp);
Packit 6ef888
Packit 6ef888
	return s;
Packit 6ef888
}
Packit 6ef888
Packit 6ef888
int main(void)
Packit 6ef888
{
Packit 6ef888
	int failures;
Packit 6ef888
	Suite *s = libgfs2_suite();
Packit 6ef888
	SRunner *sr = srunner_create(s);
Packit 6ef888
	srunner_run_all(sr, CK_NORMAL);
Packit 6ef888
	failures = srunner_ntests_failed(sr);
Packit 6ef888
	srunner_free(sr);
Packit 6ef888
	return failures ? EXIT_FAILURE : EXIT_SUCCESS;
Packit 6ef888
}