More tidying of the BTreeDamageVisitorTests
This commit is contained in:
parent
4d2c3a7c14
commit
779f9e7cb4
@ -210,10 +210,14 @@ namespace {
|
|||||||
|
|
||||||
typedef typename btree_layout<1, thing_traits>::node_info node_info;
|
typedef typename btree_layout<1, thing_traits>::node_info node_info;
|
||||||
|
|
||||||
vector<typename node_info::ptr> get_nodes() {
|
vector<typename node_info::ptr> const &get_nodes() {
|
||||||
btree_layout<1, thing_traits> layout;
|
if (!nodes_) {
|
||||||
tree_->visit_depth_first(layout);
|
btree_layout<1, thing_traits> layout;
|
||||||
return layout.get_nodes();
|
tree_->visit_depth_first(layout);
|
||||||
|
nodes_ = layout.get_nodes(); // expensive copy, but it's only a test
|
||||||
|
}
|
||||||
|
|
||||||
|
return *nodes_;
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned node_index_of_nth_leaf(vector<typename node_info::ptr> const &nodes,
|
unsigned node_index_of_nth_leaf(vector<typename node_info::ptr> const &nodes,
|
||||||
@ -243,6 +247,40 @@ namespace {
|
|||||||
return nr_leaf;
|
return nr_leaf;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
node_info::ptr random_leaf_node() {
|
||||||
|
vector<typename node_info::ptr> const &nodes = get_nodes();
|
||||||
|
|
||||||
|
unsigned nr_leaf = get_nr_leaf_nodes(nodes);
|
||||||
|
unsigned target = random() % nr_leaf;
|
||||||
|
unsigned i = node_index_of_nth_leaf(nodes, target);
|
||||||
|
|
||||||
|
return nodes[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
vector<node_info::ptr> get_random_leaf_nodes(unsigned count) {
|
||||||
|
vector<node_info::ptr> const &nodes = get_nodes();
|
||||||
|
|
||||||
|
unsigned nr_leaf = get_nr_leaf_nodes(nodes);
|
||||||
|
unsigned target = random() % (nr_leaf - count);
|
||||||
|
unsigned i = node_index_of_nth_leaf(nodes, target);
|
||||||
|
|
||||||
|
vector<node_info::ptr> v;
|
||||||
|
|
||||||
|
for (; i < nodes.size() && count; i++) {
|
||||||
|
if (nodes[i]->leaf) {
|
||||||
|
count--;
|
||||||
|
v.push_back(nodes[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return v;
|
||||||
|
}
|
||||||
|
|
||||||
|
void trash_blocks(vector<node_info::ptr> const &blocks) {
|
||||||
|
for (unsigned i = 0; i < blocks.size(); i++)
|
||||||
|
trash_block(blocks[i]->b);
|
||||||
|
}
|
||||||
|
|
||||||
void run() {
|
void run() {
|
||||||
// We must commit before we do the test to ensure
|
// We must commit before we do the test to ensure
|
||||||
// all the block numbers and checksums are written
|
// all the block numbers and checksums are written
|
||||||
@ -263,6 +301,9 @@ namespace {
|
|||||||
thing_traits::ref_counter rc_;
|
thing_traits::ref_counter rc_;
|
||||||
btree<1, thing_traits>::ptr tree_;
|
btree<1, thing_traits>::ptr tree_;
|
||||||
|
|
||||||
|
optional<vector<typename node_info::ptr> > nodes_;
|
||||||
|
|
||||||
|
|
||||||
value_visitor_mock value_visitor_;
|
value_visitor_mock value_visitor_;
|
||||||
damage_visitor_mock damage_visitor_;
|
damage_visitor_mock damage_visitor_;
|
||||||
};
|
};
|
||||||
@ -303,12 +344,7 @@ TEST_F(BTreeDamageVisitorTests, populated_tree_with_a_damaged_leaf_node)
|
|||||||
insert_values(10000);
|
insert_values(10000);
|
||||||
commit();
|
commit();
|
||||||
|
|
||||||
vector<typename node_info::ptr> const &nodes = get_nodes();
|
node_info::ptr n = random_leaf_node();
|
||||||
|
|
||||||
unsigned nr_leaf = get_nr_leaf_nodes(nodes);
|
|
||||||
unsigned target = random() % nr_leaf;
|
|
||||||
unsigned i = node_index_of_nth_leaf(nodes, target);
|
|
||||||
typename node_info::ptr n = nodes[i];
|
|
||||||
|
|
||||||
trash_block(n->b);
|
trash_block(n->b);
|
||||||
expect_value_range(0, *n->keys.begin_);
|
expect_value_range(0, *n->keys.begin_);
|
||||||
@ -323,23 +359,15 @@ TEST_F(BTreeDamageVisitorTests, populated_tree_with_a_sequence_of_damaged_leaf_n
|
|||||||
insert_values(10000);
|
insert_values(10000);
|
||||||
commit();
|
commit();
|
||||||
|
|
||||||
vector<typename node_info::ptr> const &nodes = get_nodes();
|
unsigned const COUNT = 5;
|
||||||
|
vector<node_info::ptr> nodes = get_random_leaf_nodes(COUNT);
|
||||||
|
|
||||||
unsigned nr_leaf = get_nr_leaf_nodes(nodes);
|
trash_blocks(nodes);
|
||||||
unsigned target = random() % (nr_leaf - 6);
|
block_address begin = *nodes[0]->keys.begin_;
|
||||||
unsigned i = node_index_of_nth_leaf(nodes, target);
|
block_address end = *nodes[COUNT - 1]->keys.end_;
|
||||||
|
|
||||||
block_address begin = *nodes[i]->keys.begin_, end;
|
expect_value_range(0, *nodes[0]->keys.begin_);
|
||||||
for (unsigned count = 0; count < 5 && i < nodes.size(); i++, count++) {
|
expect_value_range(*nodes[COUNT - 1]->keys.end_, 10000);
|
||||||
typename node_info::ptr n = nodes[i];
|
|
||||||
if (n->leaf) {
|
|
||||||
end = *n->keys.end_;
|
|
||||||
trash_block(n->b);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
expect_value_range(0, begin);
|
|
||||||
expect_value_range(end, 10000);
|
|
||||||
expect_damage(0, range<block_address>(begin, end));
|
expect_damage(0, range<block_address>(begin, end));
|
||||||
|
|
||||||
run();
|
run();
|
||||||
|
Loading…
Reference in New Issue
Block a user