thin-provisioning-tools/unit-tests/damage_tracker_t.cc
Joe Thornber 880785a9bf [damage_tracker] Reset the tracker in the end() method so we can reuse it.
The *_check tools already reuse trackers.

Patch from Ming-Hung Tsai.
2015-05-26 12:49:27 +01:00

113 lines
2.3 KiB
C++

#include "gmock/gmock.h"
#include "test_utils.h"
#include "persistent-data/data-structures/btree_damage_visitor.h"
using namespace std;
using namespace persistent_data;
using namespace test;
using namespace testing;
//----------------------------------------------------------------
namespace {
typedef run<block_address> run64;
typedef damage_tracker::maybe_run64 mr64;
class DamageTrackerTests : public Test {
public:
void assert_no_damage(mr64 const &mr) const {
ASSERT_THAT(mr, Eq(mr64()));
}
void assert_damage(mr64 const &mr, run64 const &expected) const {
ASSERT_THAT(mr, Eq(mr64(expected)));
}
damage_tracker dt;
};
};
//----------------------------------------------------------------
TEST_F(DamageTrackerTests, good_leaf)
{
assert_no_damage(dt.good_leaf(0, 10));
assert_no_damage(dt.end());
}
TEST_F(DamageTrackerTests, bad_node)
{
dt.bad_node();
assert_damage(dt.end(), run64(0ull));
}
TEST_F(DamageTrackerTests, good_bad)
{
dt.good_leaf(0, 10);
dt.bad_node();
assert_damage(dt.end(), run64(10ull));
}
TEST_F(DamageTrackerTests, bad_good)
{
dt.bad_node();
assert_damage(dt.good_leaf(10, 20), run64(0ull, 10ull));
}
TEST_F(DamageTrackerTests, good_bad_good)
{
dt.good_leaf(0, 10);
dt.bad_node();
assert_damage(dt.good_leaf(20, 30), run64(10ull, 20ull));
assert_no_damage(dt.end());
}
TEST_F(DamageTrackerTests, bad_good_bad)
{
dt.bad_node();
dt.good_leaf(10, 20);
dt.bad_node();
assert_damage(dt.end(), run64(20ull));
}
TEST_F(DamageTrackerTests, gi_bl_gl)
{
dt.good_internal(0);
dt.bad_node();
assert_damage(dt.good_leaf(10, 20), run64(0ull, 10ull));
assert_no_damage(dt.end());
}
TEST_F(DamageTrackerTests, gi_gl_bl_bi)
{
dt.good_internal(0);
dt.good_leaf(0, 10);
dt.bad_node();
dt.bad_node();
assert_damage(dt.end(), run64(10ull));
}
TEST_F(DamageTrackerTests, gi_bi_gi_bl_gl)
{
dt.good_internal(0);
dt.bad_node();
assert_damage(dt.good_internal(10), run64(0ull, 10ull));
dt.bad_node();
assert_damage(dt.good_leaf(15, 20), run64(10ull, 15ull));
}
TEST_F(DamageTrackerTests, end_resets_tracker)
{
dt.good_internal(0);
dt.good_leaf(0, 10);
dt.bad_node();
assert_damage(dt.end(), run64(10ull));
assert_no_damage(dt.good_leaf(20, 30));
assert_no_damage(dt.end());
}
//----------------------------------------------------------------