using ::testing::_;
using ::testing::Invoke;
using ::testing::InSequence;
+using ::testing::Return;
using ::testing::StrEq;
using ::testing::WithArg;
expect_load_map(mock_image_ctx, snap_id, object_map, r, [](){});
}
+ void expect_with_map(MockTestImageCtx& mock_image_ctx,
+ const BitVector<2>& object_map) {
+ EXPECT_CALL(*mock_image_ctx.object_map, with()).WillOnce(Return(object_map));
+ }
+
template <typename F>
- int do_diff(F&& f, uint64_t start_snap_id, uint64_t end_snap_id,
+ int do_diff(bool want_object_map, F&& f,
+ uint64_t start_snap_id, uint64_t end_snap_id,
uint64_t start_object_no, uint64_t end_object_no) {
InSequence seq;
MockTestImageCtx mock_image_ctx(*m_image_ctx);
+ MockObjectMap mock_object_map;
+ if (want_object_map) {
+ mock_image_ctx.object_map = &mock_object_map;
+ }
+ mock_image_ctx.snap_id = end_snap_id;
std::forward<F>(f)(mock_image_ctx);
C_SaferCond ctx;
}
template <typename F>
- void test_diff_iterate(F&& f, uint64_t start_snap_id, uint64_t end_snap_id,
+ void test_diff_iterate(bool want_object_map, F&& f,
+ uint64_t start_snap_id, uint64_t end_snap_id,
const BitVector<2>& expected_diff_state) {
// ranged -- run through all ranges (substrings) in expected_diff_state
for (uint64_t i = 0; i < expected_diff_state.size(); i++) {
for (uint64_t j = i + 1; j <= expected_diff_state.size(); j++) {
- ASSERT_EQ(0, do_diff(std::forward<F>(f), start_snap_id, end_snap_id,
- i, j));
+ ASSERT_EQ(0, do_diff(want_object_map, std::forward<F>(f),
+ start_snap_id, end_snap_id, i, j));
ASSERT_EQ(j - i, m_diff_state.size());
for (uint64_t k = 0; k < m_diff_state.size(); k++) {
ASSERT_EQ(expected_diff_state[i + k], m_diff_state[k]);
}
// unranged -- equivalent to i=0, j=expected_diff_state.size() range
- ASSERT_EQ(0, do_diff(std::forward<F>(f), start_snap_id, end_snap_id,
- 0, UINT64_MAX - 1));
+ ASSERT_EQ(0, do_diff(want_object_map, std::forward<F>(f),
+ start_snap_id, end_snap_id, 0, UINT64_MAX - 1));
ASSERT_EQ(expected_diff_state, m_diff_state);
}
template <typename F>
- void test_deep_copy(F&& f, uint64_t start_snap_id, uint64_t end_snap_id,
+ void test_deep_copy(bool want_object_map, F&& f,
+ uint64_t start_snap_id, uint64_t end_snap_id,
const BitVector<2>& expected_diff_state) {
- ASSERT_EQ(0, do_diff(std::forward<F>(f), start_snap_id, end_snap_id,
- 0, UINT64_MAX));
+ ASSERT_EQ(0, do_diff(want_object_map, std::forward<F>(f),
+ start_snap_id, end_snap_id, 0, UINT64_MAX));
ASSERT_EQ(expected_diff_state, m_diff_state);
}
TEST_P(TestMockObjectMapDiffRequest, InvalidStartSnap) {
if (is_diff_iterate()) {
- ASSERT_EQ(-EINVAL, do_diff(noop, CEPH_NOSNAP, CEPH_NOSNAP, 123, 456));
+ ASSERT_EQ(-EINVAL, do_diff(false, noop, CEPH_NOSNAP, CEPH_NOSNAP, 123, 456));
+ ASSERT_EQ(-EINVAL, do_diff(true, noop, CEPH_NOSNAP, CEPH_NOSNAP, 123, 456));
} else {
- ASSERT_EQ(-EINVAL, do_diff(noop, CEPH_NOSNAP, CEPH_NOSNAP, 0, UINT64_MAX));
+ ASSERT_EQ(-EINVAL, do_diff(false, noop, CEPH_NOSNAP, CEPH_NOSNAP, 0, UINT64_MAX));
+ ASSERT_EQ(-EINVAL, do_diff(true, noop, CEPH_NOSNAP, CEPH_NOSNAP, 0, UINT64_MAX));
}
}
TEST_P(TestMockObjectMapDiffRequest, InvalidEndSnap) {
if (is_diff_iterate()) {
- ASSERT_EQ(-EINVAL, do_diff(noop, 2, 1, 123, 456));
+ ASSERT_EQ(-EINVAL, do_diff(false, noop, 2, 1, 123, 456));
+ ASSERT_EQ(-EINVAL, do_diff(true, noop, 2, 1, 123, 456));
} else {
- ASSERT_EQ(-EINVAL, do_diff(noop, 2, 1, 0, UINT64_MAX));
+ ASSERT_EQ(-EINVAL, do_diff(false, noop, 2, 1, 0, UINT64_MAX));
+ ASSERT_EQ(-EINVAL, do_diff(true, noop, 2, 1, 0, UINT64_MAX));
}
}
BitVector<2> expected_diff_state;
if (is_diff_iterate()) {
- ASSERT_EQ(0, do_diff(noop, 1, 1, 123, 456));
+ ASSERT_EQ(0, do_diff(false, noop, 1, 1, 123, 456));
+ ASSERT_EQ(expected_diff_state, m_diff_state);
+ ASSERT_EQ(0, do_diff(true, noop, 1, 1, 123, 456));
+ ASSERT_EQ(expected_diff_state, m_diff_state);
} else {
- ASSERT_EQ(0, do_diff(noop, 1, 1, 0, UINT64_MAX));
+ ASSERT_EQ(0, do_diff(false, noop, 1, 1, 0, UINT64_MAX));
+ ASSERT_EQ(expected_diff_state, m_diff_state);
+ ASSERT_EQ(0, do_diff(true, noop, 1, 1, 0, UINT64_MAX));
+ ASSERT_EQ(expected_diff_state, m_diff_state);
}
- ASSERT_EQ(expected_diff_state, m_diff_state);
}
TEST_P(TestMockObjectMapDiffRequest, InvalidStartObject) {
if (is_diff_iterate()) {
- ASSERT_EQ(-EINVAL, do_diff(noop, 0, 1, UINT64_MAX, UINT64_MAX));
+ ASSERT_EQ(-EINVAL, do_diff(false, noop, 0, 1, UINT64_MAX, UINT64_MAX));
+ ASSERT_EQ(-EINVAL, do_diff(true, noop, 0, 1, UINT64_MAX, UINT64_MAX));
} else {
- ASSERT_EQ(-EINVAL, do_diff(noop, 0, 1, 123, UINT64_MAX));
+ ASSERT_EQ(-EINVAL, do_diff(false, noop, 0, 1, 123, UINT64_MAX));
+ ASSERT_EQ(-EINVAL, do_diff(true, noop, 0, 1, 123, UINT64_MAX));
}
}
TEST_P(TestMockObjectMapDiffRequest, InvalidEndObject) {
if (is_diff_iterate()) {
- ASSERT_EQ(-EINVAL, do_diff(noop, 0, 1, 456, 123));
+ ASSERT_EQ(-EINVAL, do_diff(false, noop, 0, 1, 456, 123));
+ ASSERT_EQ(-EINVAL, do_diff(true, noop, 0, 1, 456, 123));
} else {
SUCCEED();
}
BitVector<2> expected_diff_state;
if (is_diff_iterate()) {
- ASSERT_EQ(0, do_diff(noop, 0, 1, 123, 123));
+ ASSERT_EQ(0, do_diff(false, noop, 0, 1, 123, 123));
+ ASSERT_EQ(expected_diff_state, m_diff_state);
+ ASSERT_EQ(0, do_diff(true, noop, 0, 1, 123, 123));
ASSERT_EQ(expected_diff_state, m_diff_state);
} else {
SUCCEED();
REQUIRE(!is_feature_enabled(RBD_FEATURE_OBJECT_MAP));
if (is_diff_iterate()) {
- ASSERT_EQ(-EINVAL, do_diff(noop, 0, CEPH_NOSNAP, 123, 456));
+ ASSERT_EQ(-EINVAL, do_diff(false, noop, 0, CEPH_NOSNAP, 123, 456));
+ ASSERT_EQ(-EINVAL, do_diff(true, noop, 0, CEPH_NOSNAP, 123, 456));
} else {
- ASSERT_EQ(-EINVAL, do_diff(noop, 0, CEPH_NOSNAP, 0, UINT64_MAX));
+ ASSERT_EQ(-EINVAL, do_diff(false, noop, 0, CEPH_NOSNAP, 0, UINT64_MAX));
+ ASSERT_EQ(-EINVAL, do_diff(true, noop, 0, CEPH_NOSNAP, 0, UINT64_MAX));
}
}
expect_load_map(mock_image_ctx, 1, object_map_1, 0);
};
if (is_diff_iterate()) {
- test_diff_iterate(load, 0, 1, expected_diff_state);
+ auto with = [&](MockTestImageCtx& mock_image_ctx) {
+ expect_get_flags(mock_image_ctx, 1, 0, 0);
+ expect_with_map(mock_image_ctx, object_map_1);
+ };
+ test_diff_iterate(false, load, 0, 1, expected_diff_state);
+ test_diff_iterate(true, with, 0, 1, expected_diff_state);
} else {
- test_deep_copy(load, 0, 1, expected_diff_state);
+ test_deep_copy(false, load, 0, 1, expected_diff_state);
+ test_deep_copy(true, load, 0, 1, expected_diff_state);
}
}
expect_load_map(mock_image_ctx, 1, object_map_1, 0);
};
if (is_diff_iterate()) {
- test_diff_iterate(load, 0, 1, expected_diff_state);
+ auto with = [&](MockTestImageCtx& mock_image_ctx) {
+ expect_get_flags(mock_image_ctx, 1, 0, 0);
+ expect_with_map(mock_image_ctx, object_map_1);
+ };
+ test_diff_iterate(false, load, 0, 1, expected_diff_state);
+ test_diff_iterate(true, with, 0, 1, expected_diff_state);
} else {
- test_deep_copy(load, 0, 1, expected_diff_state);
+ test_deep_copy(false, load, 0, 1, expected_diff_state);
+ test_deep_copy(true, load, 0, 1, expected_diff_state);
}
}
expect_get_flags(mock_image_ctx, 2, 0, 0);
expect_load_map(mock_image_ctx, 2, object_map_2, 0);
};
- test_diff_iterate(load, 0, 2, expected_diff_state);
+ auto with = [&](MockTestImageCtx& mock_image_ctx) {
+ expect_get_flags(mock_image_ctx, 2, 0, 0);
+ expect_with_map(mock_image_ctx, object_map_2);
+ };
+ test_diff_iterate(false, load, 0, 2, expected_diff_state);
+ test_diff_iterate(true, with, 0, 2, expected_diff_state);
} else {
auto load = [&](MockTestImageCtx& mock_image_ctx) {
expect_get_flags(mock_image_ctx, 1, 0, 0);
expect_get_flags(mock_image_ctx, 2, 0, 0);
expect_load_map(mock_image_ctx, 2, object_map_2, 0);
};
- test_deep_copy(load, 0, 2, expected_diff_state);
+ test_deep_copy(false, load, 0, 2, expected_diff_state);
+ test_deep_copy(true, load, 0, 2, expected_diff_state);
}
}
expect_get_flags(mock_image_ctx, 2, 0, 0);
expect_load_map(mock_image_ctx, 2, object_map_2, 0);
};
- test_diff_iterate(load, 0, 2, expected_diff_state);
+ auto with = [&](MockTestImageCtx& mock_image_ctx) {
+ expect_get_flags(mock_image_ctx, 2, 0, 0);
+ expect_with_map(mock_image_ctx, object_map_2);
+ };
+ test_diff_iterate(false, load, 0, 2, expected_diff_state);
+ test_diff_iterate(true, with, 0, 2, expected_diff_state);
} else {
auto load = [&](MockTestImageCtx& mock_image_ctx) {
expect_get_flags(mock_image_ctx, 1, 0, 0);
expect_get_flags(mock_image_ctx, 2, 0, 0);
expect_load_map(mock_image_ctx, 2, object_map_2, 0);
};
- test_deep_copy(load, 0, 2, expected_diff_state);
+ test_deep_copy(false, load, 0, 2, expected_diff_state);
+ test_deep_copy(true, load, 0, 2, expected_diff_state);
}
}
expect_get_flags(mock_image_ctx, 2, 0, 0);
expect_load_map(mock_image_ctx, 2, object_map_2, 0);
};
- test_diff_iterate(load, 0, 2, expected_diff_state);
+ auto with = [&](MockTestImageCtx& mock_image_ctx) {
+ expect_get_flags(mock_image_ctx, 2, 0, 0);
+ expect_with_map(mock_image_ctx, object_map_2);
+ };
+ test_diff_iterate(false, load, 0, 2, expected_diff_state);
+ test_diff_iterate(true, with, 0, 2, expected_diff_state);
} else {
auto load = [&](MockTestImageCtx& mock_image_ctx) {
expect_get_flags(mock_image_ctx, 1, 0, 0);
expect_get_flags(mock_image_ctx, 2, 0, 0);
expect_load_map(mock_image_ctx, 2, object_map_2, 0);
};
- test_deep_copy(load, 0, 2, expected_diff_state);
+ test_deep_copy(false, load, 0, 2, expected_diff_state);
+ test_deep_copy(true, load, 0, 2, expected_diff_state);
}
}
expect_get_flags(mock_image_ctx, 2, 0, 0);
expect_load_map(mock_image_ctx, 2, object_map_2, 0);
};
- test_diff_iterate(load, 0, 2, expected_diff_state);
+ auto with = [&](MockTestImageCtx& mock_image_ctx) {
+ expect_get_flags(mock_image_ctx, 2, 0, 0);
+ expect_with_map(mock_image_ctx, object_map_2);
+ };
+ test_diff_iterate(false, load, 0, 2, expected_diff_state);
+ test_diff_iterate(true, with, 0, 2, expected_diff_state);
} else {
auto load = [&](MockTestImageCtx& mock_image_ctx) {
expect_get_flags(mock_image_ctx, 1, 0, 0);
expect_get_flags(mock_image_ctx, 2, 0, 0);
expect_load_map(mock_image_ctx, 2, object_map_2, 0);
};
- test_deep_copy(load, 0, 2, expected_diff_state);
+ test_deep_copy(false, load, 0, 2, expected_diff_state);
+ test_deep_copy(true, load, 0, 2, expected_diff_state);
}
}
expect_get_flags(mock_image_ctx, 2, 0, 0);
expect_load_map(mock_image_ctx, 2, object_map_2, 0);
};
- test_diff_iterate(load, 0, 2, expected_diff_state);
+ auto with = [&](MockTestImageCtx& mock_image_ctx) {
+ expect_get_flags(mock_image_ctx, 2, 0, 0);
+ expect_with_map(mock_image_ctx, object_map_2);
+ };
+ test_diff_iterate(false, load, 0, 2, expected_diff_state);
+ test_diff_iterate(true, with, 0, 2, expected_diff_state);
} else {
auto load = [&](MockTestImageCtx& mock_image_ctx) {
expect_get_flags(mock_image_ctx, 1, 0, 0);
expect_get_flags(mock_image_ctx, 2, 0, 0);
expect_load_map(mock_image_ctx, 2, object_map_2, 0);
};
- test_deep_copy(load, 0, 2, expected_diff_state);
+ test_deep_copy(false, load, 0, 2, expected_diff_state);
+ test_deep_copy(true, load, 0, 2, expected_diff_state);
+ }
+}
+
+TEST_P(TestMockObjectMapDiffRequest, FromBeginningToUnsetSnap) {
+ REQUIRE_FEATURE(RBD_FEATURE_FAST_DIFF);
+
+ uint32_t object_count = std::size(from_beginning_table);
+ m_image_ctx->size = object_count * (1 << m_image_ctx->order);
+ m_image_ctx->snap_info = {
+ {1U, {"snap1", {cls::rbd::UserSnapshotNamespace{}}, m_image_ctx->size, {},
+ {}, {}, {}}}
+ };
+
+ BitVector<2> object_map_1;
+ object_map_1.resize(object_count);
+ BitVector<2> expected_diff_state;
+ expected_diff_state.resize(object_count);
+ for (uint32_t i = 0; i < object_count; i++) {
+ object_map_1[i] = from_beginning_table[i][0];
+ expected_diff_state[i] = from_beginning_table[i][1];
+ }
+
+ auto load = [&](MockTestImageCtx& mock_image_ctx) {
+ mock_image_ctx.snap_id = 123;
+ expect_get_flags(mock_image_ctx, 1, 0, 0);
+ expect_load_map(mock_image_ctx, 1, object_map_1, 0);
+ };
+ if (is_diff_iterate()) {
+ test_diff_iterate(false, load, 0, 1, expected_diff_state);
+ test_diff_iterate(true, load, 0, 1, expected_diff_state);
+ } else {
+ test_deep_copy(false, load, 0, 1, expected_diff_state);
+ test_deep_copy(true, load, 0, 1, expected_diff_state);
}
}
expect_load_map(mock_image_ctx, CEPH_NOSNAP, object_map_head, 0);
};
if (is_diff_iterate()) {
- test_diff_iterate(load, 0, CEPH_NOSNAP, expected_diff_state);
+ auto with = [&](MockTestImageCtx& mock_image_ctx) {
+ expect_get_flags(mock_image_ctx, CEPH_NOSNAP, 0, 0);
+ expect_with_map(mock_image_ctx, object_map_head);
+ };
+ test_diff_iterate(false, load, 0, CEPH_NOSNAP, expected_diff_state);
+ test_diff_iterate(true, with, 0, CEPH_NOSNAP, expected_diff_state);
} else {
- test_deep_copy(load, 0, CEPH_NOSNAP, expected_diff_state);
+ test_deep_copy(false, load, 0, CEPH_NOSNAP, expected_diff_state);
+ test_deep_copy(true, load, 0, CEPH_NOSNAP, expected_diff_state);
}
}
expect_load_map(mock_image_ctx, CEPH_NOSNAP, object_map_head, 0);
};
if (is_diff_iterate()) {
- test_diff_iterate(load, 0, CEPH_NOSNAP, expected_diff_state);
+ auto with = [&](MockTestImageCtx& mock_image_ctx) {
+ expect_get_flags(mock_image_ctx, CEPH_NOSNAP, 0, 0);
+ expect_with_map(mock_image_ctx, object_map_head);
+ };
+ test_diff_iterate(false, load, 0, CEPH_NOSNAP, expected_diff_state);
+ test_diff_iterate(true, with, 0, CEPH_NOSNAP, expected_diff_state);
} else {
- test_deep_copy(load, 0, CEPH_NOSNAP, expected_diff_state);
+ test_deep_copy(false, load, 0, CEPH_NOSNAP, expected_diff_state);
+ test_deep_copy(true, load, 0, CEPH_NOSNAP, expected_diff_state);
}
}
expect_get_flags(mock_image_ctx, CEPH_NOSNAP, 0, 0);
expect_load_map(mock_image_ctx, CEPH_NOSNAP, object_map_head, 0);
};
- test_diff_iterate(load, 0, CEPH_NOSNAP, expected_diff_state);
+ auto with = [&](MockTestImageCtx& mock_image_ctx) {
+ expect_get_flags(mock_image_ctx, CEPH_NOSNAP, 0, 0);
+ expect_with_map(mock_image_ctx, object_map_head);
+ };
+ test_diff_iterate(false, load, 0, CEPH_NOSNAP, expected_diff_state);
+ test_diff_iterate(true, with, 0, CEPH_NOSNAP, expected_diff_state);
} else {
auto load = [&](MockTestImageCtx& mock_image_ctx) {
expect_get_flags(mock_image_ctx, 1, 0, 0);
expect_get_flags(mock_image_ctx, CEPH_NOSNAP, 0, 0);
expect_load_map(mock_image_ctx, CEPH_NOSNAP, object_map_head, 0);
};
- test_deep_copy(load, 0, CEPH_NOSNAP, expected_diff_state);
+ test_deep_copy(false, load, 0, CEPH_NOSNAP, expected_diff_state);
+ test_deep_copy(true, load, 0, CEPH_NOSNAP, expected_diff_state);
}
}
expect_get_flags(mock_image_ctx, CEPH_NOSNAP, 0, 0);
expect_load_map(mock_image_ctx, CEPH_NOSNAP, object_map_head, 0);
};
- test_diff_iterate(load, 0, CEPH_NOSNAP, expected_diff_state);
+ auto with = [&](MockTestImageCtx& mock_image_ctx) {
+ expect_get_flags(mock_image_ctx, CEPH_NOSNAP, 0, 0);
+ expect_with_map(mock_image_ctx, object_map_head);
+ };
+ test_diff_iterate(false, load, 0, CEPH_NOSNAP, expected_diff_state);
+ test_diff_iterate(true, with, 0, CEPH_NOSNAP, expected_diff_state);
} else {
auto load = [&](MockTestImageCtx& mock_image_ctx) {
expect_get_flags(mock_image_ctx, 1, 0, 0);
expect_get_flags(mock_image_ctx, CEPH_NOSNAP, 0, 0);
expect_load_map(mock_image_ctx, CEPH_NOSNAP, object_map_head, 0);
};
- test_deep_copy(load, 0, CEPH_NOSNAP, expected_diff_state);
+ test_deep_copy(false, load, 0, CEPH_NOSNAP, expected_diff_state);
+ test_deep_copy(true, load, 0, CEPH_NOSNAP, expected_diff_state);
}
}
expect_get_flags(mock_image_ctx, CEPH_NOSNAP, 0, 0);
expect_load_map(mock_image_ctx, CEPH_NOSNAP, object_map_head, 0);
};
- test_diff_iterate(load, 0, CEPH_NOSNAP, expected_diff_state);
+ auto with = [&](MockTestImageCtx& mock_image_ctx) {
+ expect_get_flags(mock_image_ctx, CEPH_NOSNAP, 0, 0);
+ expect_with_map(mock_image_ctx, object_map_head);
+ };
+ test_diff_iterate(false, load, 0, CEPH_NOSNAP, expected_diff_state);
+ test_diff_iterate(true, with, 0, CEPH_NOSNAP, expected_diff_state);
} else {
auto load = [&](MockTestImageCtx& mock_image_ctx) {
expect_get_flags(mock_image_ctx, 1, 0, 0);
expect_get_flags(mock_image_ctx, CEPH_NOSNAP, 0, 0);
expect_load_map(mock_image_ctx, CEPH_NOSNAP, object_map_head, 0);
};
- test_deep_copy(load, 0, CEPH_NOSNAP, expected_diff_state);
+ test_deep_copy(false, load, 0, CEPH_NOSNAP, expected_diff_state);
+ test_deep_copy(true, load, 0, CEPH_NOSNAP, expected_diff_state);
}
}
expect_get_flags(mock_image_ctx, CEPH_NOSNAP, 0, 0);
expect_load_map(mock_image_ctx, CEPH_NOSNAP, object_map_head, 0);
};
- test_diff_iterate(load, 0, CEPH_NOSNAP, expected_diff_state);
+ auto with = [&](MockTestImageCtx& mock_image_ctx) {
+ expect_get_flags(mock_image_ctx, CEPH_NOSNAP, 0, 0);
+ expect_with_map(mock_image_ctx, object_map_head);
+ };
+ test_diff_iterate(false, load, 0, CEPH_NOSNAP, expected_diff_state);
+ test_diff_iterate(true, with, 0, CEPH_NOSNAP, expected_diff_state);
} else {
auto load = [&](MockTestImageCtx& mock_image_ctx) {
expect_get_flags(mock_image_ctx, 1, 0, 0);
expect_get_flags(mock_image_ctx, CEPH_NOSNAP, 0, 0);
expect_load_map(mock_image_ctx, CEPH_NOSNAP, object_map_head, 0);
};
- test_deep_copy(load, 0, CEPH_NOSNAP, expected_diff_state);
+ test_deep_copy(false, load, 0, CEPH_NOSNAP, expected_diff_state);
+ test_deep_copy(true, load, 0, CEPH_NOSNAP, expected_diff_state);
}
}
expect_get_flags(mock_image_ctx, CEPH_NOSNAP, 0, 0);
expect_load_map(mock_image_ctx, CEPH_NOSNAP, object_map_head, 0);
};
- test_diff_iterate(load, 0, CEPH_NOSNAP, expected_diff_state);
+ auto with = [&](MockTestImageCtx& mock_image_ctx) {
+ expect_get_flags(mock_image_ctx, CEPH_NOSNAP, 0, 0);
+ expect_with_map(mock_image_ctx, object_map_head);
+ };
+ test_diff_iterate(false, load, 0, CEPH_NOSNAP, expected_diff_state);
+ test_diff_iterate(true, with, 0, CEPH_NOSNAP, expected_diff_state);
} else {
auto load = [&](MockTestImageCtx& mock_image_ctx) {
expect_get_flags(mock_image_ctx, 1, 0, 0);
expect_get_flags(mock_image_ctx, CEPH_NOSNAP, 0, 0);
expect_load_map(mock_image_ctx, CEPH_NOSNAP, object_map_head, 0);
};
- test_deep_copy(load, 0, CEPH_NOSNAP, expected_diff_state);
+ test_deep_copy(false, load, 0, CEPH_NOSNAP, expected_diff_state);
+ test_deep_copy(true, load, 0, CEPH_NOSNAP, expected_diff_state);
+ }
+}
+
+TEST_P(TestMockObjectMapDiffRequest, FromBeginningToUnsetHead) {
+ REQUIRE_FEATURE(RBD_FEATURE_FAST_DIFF);
+
+ uint32_t object_count = std::size(from_beginning_table);
+ m_image_ctx->size = object_count * (1 << m_image_ctx->order);
+
+ BitVector<2> object_map_head;
+ object_map_head.resize(object_count);
+ BitVector<2> expected_diff_state;
+ expected_diff_state.resize(object_count);
+ for (uint32_t i = 0; i < object_count; i++) {
+ object_map_head[i] = from_beginning_table[i][0];
+ expected_diff_state[i] = from_beginning_table[i][1];
+ }
+
+ auto load = [&](MockTestImageCtx& mock_image_ctx) {
+ mock_image_ctx.snap_id = 123;
+ expect_get_flags(mock_image_ctx, CEPH_NOSNAP, 0, 0);
+ expect_load_map(mock_image_ctx, CEPH_NOSNAP, object_map_head, 0);
+ };
+ if (is_diff_iterate()) {
+ test_diff_iterate(false, load, 0, CEPH_NOSNAP, expected_diff_state);
+ test_diff_iterate(true, load, 0, CEPH_NOSNAP, expected_diff_state);
+ } else {
+ test_deep_copy(false, load, 0, CEPH_NOSNAP, expected_diff_state);
+ test_deep_copy(true, load, 0, CEPH_NOSNAP, expected_diff_state);
}
}
expect_load_map(mock_image_ctx, 2, object_map_2, 0);
};
if (is_diff_iterate()) {
- test_diff_iterate(load, 1, 2, expected_diff_state);
+ test_diff_iterate(false, load, 1, 2, expected_diff_state);
+ test_diff_iterate(true, load, 1, 2, expected_diff_state);
} else {
- test_deep_copy(load, 1, 2, expected_diff_state);
+ test_deep_copy(false, load, 1, 2, expected_diff_state);
+ test_deep_copy(true, load, 1, 2, expected_diff_state);
}
}
expect_load_map(mock_image_ctx, 2, object_map_2, 0);
};
if (is_diff_iterate()) {
- test_diff_iterate(load, 1, 2, expected_diff_state);
+ test_diff_iterate(false, load, 1, 2, expected_diff_state);
+ test_diff_iterate(true, load, 1, 2, expected_diff_state);
} else {
- test_deep_copy(load, 1, 2, expected_diff_state);
+ test_deep_copy(false, load, 1, 2, expected_diff_state);
+ test_deep_copy(true, load, 1, 2, expected_diff_state);
}
}
expect_load_map(mock_image_ctx, 2, object_map_2, 0);
};
if (is_diff_iterate()) {
- test_diff_iterate(load, 1, 2, expected_diff_state);
+ test_diff_iterate(false, load, 1, 2, expected_diff_state);
+ test_diff_iterate(true, load, 1, 2, expected_diff_state);
} else {
- test_deep_copy(load, 1, 2, expected_diff_state);
+ test_deep_copy(false, load, 1, 2, expected_diff_state);
+ test_deep_copy(true, load, 1, 2, expected_diff_state);
}
}
expect_load_map(mock_image_ctx, 2, object_map_2, 0);
};
if (is_diff_iterate()) {
- test_diff_iterate(load, 1, 2, expected_diff_state);
+ test_diff_iterate(false, load, 1, 2, expected_diff_state);
+ test_diff_iterate(true, load, 1, 2, expected_diff_state);
} else {
- test_deep_copy(load, 1, 2, expected_diff_state);
+ test_deep_copy(false, load, 1, 2, expected_diff_state);
+ test_deep_copy(true, load, 1, 2, expected_diff_state);
}
}
expect_load_map(mock_image_ctx, 2, object_map_2, 0);
};
if (is_diff_iterate()) {
- test_diff_iterate(load, 1, 2, expected_diff_state);
+ test_diff_iterate(false, load, 1, 2, expected_diff_state);
+ test_diff_iterate(true, load, 1, 2, expected_diff_state);
} else {
- test_deep_copy(load, 1, 2, expected_diff_state);
+ test_deep_copy(false, load, 1, 2, expected_diff_state);
+ test_deep_copy(true, load, 1, 2, expected_diff_state);
}
}
expect_load_map(mock_image_ctx, 3, object_map_3, 0);
};
if (is_diff_iterate()) {
- test_diff_iterate(load, 1, 3, expected_diff_state);
+ test_diff_iterate(false, load, 1, 3, expected_diff_state);
+ test_diff_iterate(true, load, 1, 3, expected_diff_state);
} else {
- test_deep_copy(load, 1, 3, expected_diff_state);
+ test_deep_copy(false, load, 1, 3, expected_diff_state);
+ test_deep_copy(true, load, 1, 3, expected_diff_state);
}
}
expect_load_map(mock_image_ctx, CEPH_NOSNAP, object_map_head, 0);
};
if (is_diff_iterate()) {
- test_diff_iterate(load, 1, CEPH_NOSNAP, expected_diff_state);
+ test_diff_iterate(false, load, 1, CEPH_NOSNAP, expected_diff_state);
+ test_diff_iterate(true, load, 1, CEPH_NOSNAP, expected_diff_state);
} else {
- test_deep_copy(load, 1, CEPH_NOSNAP, expected_diff_state);
+ test_deep_copy(false, load, 1, CEPH_NOSNAP, expected_diff_state);
+ test_deep_copy(true, load, 1, CEPH_NOSNAP, expected_diff_state);
}
}
expect_load_map(mock_image_ctx, CEPH_NOSNAP, object_map_head, 0);
};
if (is_diff_iterate()) {
- test_diff_iterate(load, 1, CEPH_NOSNAP, expected_diff_state);
+ test_diff_iterate(false, load, 1, CEPH_NOSNAP, expected_diff_state);
+ test_diff_iterate(true, load, 1, CEPH_NOSNAP, expected_diff_state);
} else {
- test_deep_copy(load, 1, CEPH_NOSNAP, expected_diff_state);
+ test_deep_copy(false, load, 1, CEPH_NOSNAP, expected_diff_state);
+ test_deep_copy(true, load, 1, CEPH_NOSNAP, expected_diff_state);
}
}
expect_load_map(mock_image_ctx, CEPH_NOSNAP, object_map_head, 0);
};
if (is_diff_iterate()) {
- test_diff_iterate(load, 1, CEPH_NOSNAP, expected_diff_state);
+ test_diff_iterate(false, load, 1, CEPH_NOSNAP, expected_diff_state);
+ test_diff_iterate(true, load, 1, CEPH_NOSNAP, expected_diff_state);
} else {
- test_deep_copy(load, 1, CEPH_NOSNAP, expected_diff_state);
+ test_deep_copy(false, load, 1, CEPH_NOSNAP, expected_diff_state);
+ test_deep_copy(true, load, 1, CEPH_NOSNAP, expected_diff_state);
}
}
expect_load_map(mock_image_ctx, CEPH_NOSNAP, object_map_head, 0);
};
if (is_diff_iterate()) {
- test_diff_iterate(load, 1, CEPH_NOSNAP, expected_diff_state);
+ test_diff_iterate(false, load, 1, CEPH_NOSNAP, expected_diff_state);
+ test_diff_iterate(true, load, 1, CEPH_NOSNAP, expected_diff_state);
} else {
- test_deep_copy(load, 1, CEPH_NOSNAP, expected_diff_state);
+ test_deep_copy(false, load, 1, CEPH_NOSNAP, expected_diff_state);
+ test_deep_copy(true, load, 1, CEPH_NOSNAP, expected_diff_state);
}
}
expect_load_map(mock_image_ctx, CEPH_NOSNAP, object_map_head, 0);
};
if (is_diff_iterate()) {
- test_diff_iterate(load, 1, CEPH_NOSNAP, expected_diff_state);
+ test_diff_iterate(false, load, 1, CEPH_NOSNAP, expected_diff_state);
+ test_diff_iterate(true, load, 1, CEPH_NOSNAP, expected_diff_state);
} else {
- test_deep_copy(load, 1, CEPH_NOSNAP, expected_diff_state);
+ test_deep_copy(false, load, 1, CEPH_NOSNAP, expected_diff_state);
+ test_deep_copy(true, load, 1, CEPH_NOSNAP, expected_diff_state);
}
}
expect_load_map(mock_image_ctx, CEPH_NOSNAP, object_map_head, 0);
};
if (is_diff_iterate()) {
- test_diff_iterate(load, 1, CEPH_NOSNAP, expected_diff_state);
+ test_diff_iterate(false, load, 1, CEPH_NOSNAP, expected_diff_state);
+ test_diff_iterate(true, load, 1, CEPH_NOSNAP, expected_diff_state);
} else {
- test_deep_copy(load, 1, CEPH_NOSNAP, expected_diff_state);
+ test_deep_copy(false, load, 1, CEPH_NOSNAP, expected_diff_state);
+ test_deep_copy(true, load, 1, CEPH_NOSNAP, expected_diff_state);
}
}
};
if (is_diff_iterate()) {
- ASSERT_EQ(-ENOENT, do_diff(noop, 1, 2, 0, object_count));
+ ASSERT_EQ(-ENOENT, do_diff(false, noop, 1, 2, 0, object_count));
+ ASSERT_EQ(-ENOENT, do_diff(true, noop, 1, 2, 0, object_count));
} else {
- ASSERT_EQ(-ENOENT, do_diff(noop, 1, 2, 0, UINT64_MAX));
+ ASSERT_EQ(-ENOENT, do_diff(false, noop, 1, 2, 0, UINT64_MAX));
+ ASSERT_EQ(-ENOENT, do_diff(true, noop, 1, 2, 0, UINT64_MAX));
}
}
object_map_1.resize(object_count);
if (is_diff_iterate()) {
- ASSERT_EQ(-ENOENT, do_diff(noop, 0, 2, 0, object_count));
+ ASSERT_EQ(-ENOENT, do_diff(false, noop, 0, 2, 0, object_count));
+ ASSERT_EQ(-ENOENT, do_diff(true, noop, 0, 2, 0, object_count));
} else {
auto load = [&](MockTestImageCtx& mock_image_ctx) {
expect_get_flags(mock_image_ctx, 1, 0, 0);
expect_load_map(mock_image_ctx, 1, object_map_1, 0);
};
- ASSERT_EQ(-ENOENT, do_diff(load, 0, 2, 0, UINT64_MAX));
+ ASSERT_EQ(-ENOENT, do_diff(false, load, 0, 2, 0, UINT64_MAX));
+ ASSERT_EQ(-ENOENT, do_diff(true, load, 0, 2, 0, UINT64_MAX));
}
}
expect_get_flags(mock_image_ctx, CEPH_NOSNAP, 0, 0);
expect_load_map(mock_image_ctx, CEPH_NOSNAP, object_map_head, 0);
};
- test_diff_iterate(load, 0, CEPH_NOSNAP, expected_diff_state);
+ auto with = [&](MockTestImageCtx& mock_image_ctx) {
+ expect_get_flags(mock_image_ctx, CEPH_NOSNAP, 0, 0);
+ expect_with_map(mock_image_ctx, object_map_head);
+ };
+ test_diff_iterate(false, load, 0, CEPH_NOSNAP, expected_diff_state);
+ test_diff_iterate(true, with, 0, CEPH_NOSNAP, expected_diff_state);
} else {
auto load = [&](MockTestImageCtx& mock_image_ctx) {
expect_get_flags(mock_image_ctx, 1, 0, 0);
expect_get_flags(mock_image_ctx, CEPH_NOSNAP, 0, 0);
expect_load_map(mock_image_ctx, CEPH_NOSNAP, object_map_head, 0);
};
- test_deep_copy(load, 0, CEPH_NOSNAP, expected_diff_state);
+ test_deep_copy(false, load, 0, CEPH_NOSNAP, expected_diff_state);
+ test_deep_copy(true, load, 0, CEPH_NOSNAP, expected_diff_state);
}
}
expect_load_map(mock_image_ctx, CEPH_NOSNAP, object_map_head, 0);
};
if (is_diff_iterate()) {
- test_diff_iterate(load, 1, CEPH_NOSNAP, expected_diff_state);
+ test_diff_iterate(false, load, 1, CEPH_NOSNAP, expected_diff_state);
+ test_diff_iterate(true, load, 1, CEPH_NOSNAP, expected_diff_state);
} else {
- test_deep_copy(load, 1, CEPH_NOSNAP, expected_diff_state);
+ test_deep_copy(false, load, 1, CEPH_NOSNAP, expected_diff_state);
+ test_deep_copy(true, load, 1, CEPH_NOSNAP, expected_diff_state);
}
}
expect_load_map(mock_image_ctx, 1, object_map_1, -ENOENT);
};
if (is_diff_iterate()) {
- ASSERT_EQ(-ENOENT, do_diff(load, 1, 2, 0, object_count));
+ ASSERT_EQ(-ENOENT, do_diff(false, load, 1, 2, 0, object_count));
+ ASSERT_EQ(-ENOENT, do_diff(true, load, 1, 2, 0, object_count));
} else {
- ASSERT_EQ(-ENOENT, do_diff(load, 1, 2, 0, UINT64_MAX));
+ ASSERT_EQ(-ENOENT, do_diff(false, load, 1, 2, 0, UINT64_MAX));
+ ASSERT_EQ(-ENOENT, do_diff(true, load, 1, 2, 0, UINT64_MAX));
}
}
expect_get_flags(mock_image_ctx, 2, 0, 0);
expect_load_map(mock_image_ctx, 2, object_map_2, -ENOENT);
};
- ASSERT_EQ(-ENOENT, do_diff(load, 0, 2, 0, object_count));
+ auto with = [&](MockTestImageCtx& mock_image_ctx) {
+ expect_get_flags(mock_image_ctx, 2, 0, 0);
+ expect_with_map(mock_image_ctx, object_map_2);
+ };
+ ASSERT_EQ(-ENOENT, do_diff(false, load, 0, 2, 0, object_count));
+ test_diff_iterate(true, with, 0, 2, expected_diff_state);
} else {
auto load = [&](MockTestImageCtx& mock_image_ctx) {
expect_get_flags(mock_image_ctx, 1, 0, 0);
expect_get_flags(mock_image_ctx, 2, 0, 0);
expect_load_map(mock_image_ctx, 2, object_map_2, -ENOENT);
};
- ASSERT_EQ(-ENOENT, do_diff(load, 0, 2, 0, UINT64_MAX));
+ ASSERT_EQ(-ENOENT, do_diff(false, load, 0, 2, 0, UINT64_MAX));
+ ASSERT_EQ(-ENOENT, do_diff(true, load, 0, 2, 0, UINT64_MAX));
}
}
expect_get_flags(mock_image_ctx, CEPH_NOSNAP, 0, 0);
expect_load_map(mock_image_ctx, CEPH_NOSNAP, object_map_head, 0);
};
- test_diff_iterate(load, 0, CEPH_NOSNAP, expected_diff_state);
+ auto with = [&](MockTestImageCtx& mock_image_ctx) {
+ expect_get_flags(mock_image_ctx, CEPH_NOSNAP, 0, 0);
+ expect_with_map(mock_image_ctx, object_map_head);
+ };
+ test_diff_iterate(false, load, 0, CEPH_NOSNAP, expected_diff_state);
+ test_diff_iterate(true, with, 0, CEPH_NOSNAP, expected_diff_state);
} else {
auto load = [&](MockTestImageCtx& mock_image_ctx) {
expect_get_flags(mock_image_ctx, 1, 0, 0);
expect_get_flags(mock_image_ctx, CEPH_NOSNAP, 0, 0);
expect_load_map(mock_image_ctx, CEPH_NOSNAP, object_map_head, 0);
};
- test_deep_copy(load, 0, CEPH_NOSNAP, expected_diff_state);
+ test_deep_copy(false, load, 0, CEPH_NOSNAP, expected_diff_state);
+ test_deep_copy(true, load, 0, CEPH_NOSNAP, expected_diff_state);
}
}
expect_load_map(mock_image_ctx, CEPH_NOSNAP, object_map_head, 0);
};
if (is_diff_iterate()) {
- test_diff_iterate(load, 1, CEPH_NOSNAP, expected_diff_state);
+ test_diff_iterate(false, load, 1, CEPH_NOSNAP, expected_diff_state);
+ test_diff_iterate(true, load, 1, CEPH_NOSNAP, expected_diff_state);
} else {
- test_deep_copy(load, 1, CEPH_NOSNAP, expected_diff_state);
+ test_deep_copy(false, load, 1, CEPH_NOSNAP, expected_diff_state);
+ test_deep_copy(true, load, 1, CEPH_NOSNAP, expected_diff_state);
}
}
expect_get_flags(mock_image_ctx, 1, RBD_FLAG_FAST_DIFF_INVALID, 0);
};
if (is_diff_iterate()) {
- ASSERT_EQ(-EINVAL, do_diff(get_flags, 1, 2, 0, object_count));
+ ASSERT_EQ(-EINVAL, do_diff(false, get_flags, 1, 2, 0, object_count));
+ ASSERT_EQ(-EINVAL, do_diff(true, get_flags, 1, 2, 0, object_count));
} else {
- ASSERT_EQ(-EINVAL, do_diff(get_flags, 1, 2, 0, UINT64_MAX));
+ ASSERT_EQ(-EINVAL, do_diff(false, get_flags, 1, 2, 0, UINT64_MAX));
+ ASSERT_EQ(-EINVAL, do_diff(true, get_flags, 1, 2, 0, UINT64_MAX));
}
}
auto get_flags = [&](MockTestImageCtx& mock_image_ctx) {
expect_get_flags(mock_image_ctx, 2, RBD_FLAG_FAST_DIFF_INVALID, 0);
};
- ASSERT_EQ(-EINVAL, do_diff(get_flags, 0, 2, 0, object_count));
+ ASSERT_EQ(-EINVAL, do_diff(false, get_flags, 0, 2, 0, object_count));
+ ASSERT_EQ(-EINVAL, do_diff(true, get_flags, 0, 2, 0, object_count));
} else {
auto get_flags = [&](MockTestImageCtx& mock_image_ctx) {
expect_get_flags(mock_image_ctx, 1, 0, 0);
expect_load_map(mock_image_ctx, 1, object_map_1, 0);
expect_get_flags(mock_image_ctx, 2, RBD_FLAG_FAST_DIFF_INVALID, 0);
};
- ASSERT_EQ(-EINVAL, do_diff(get_flags, 0, 2, 0, UINT64_MAX));
+ ASSERT_EQ(-EINVAL, do_diff(false, get_flags, 0, 2, 0, UINT64_MAX));
+ ASSERT_EQ(-EINVAL, do_diff(true, get_flags, 0, 2, 0, UINT64_MAX));
}
}
expect_get_flags(mock_image_ctx, CEPH_NOSNAP, 0, 0);
expect_load_map(mock_image_ctx, CEPH_NOSNAP, object_map_head, 0);
};
- test_diff_iterate(load, 0, CEPH_NOSNAP, expected_diff_state);
+ auto with = [&](MockTestImageCtx& mock_image_ctx) {
+ expect_get_flags(mock_image_ctx, CEPH_NOSNAP, 0, 0);
+ expect_with_map(mock_image_ctx, object_map_head);
+ };
+ test_diff_iterate(false, load, 0, CEPH_NOSNAP, expected_diff_state);
+ test_diff_iterate(true, with, 0, CEPH_NOSNAP, expected_diff_state);
} else {
auto get_flags = [&](MockTestImageCtx& mock_image_ctx) {
expect_get_flags(mock_image_ctx, 1, RBD_FLAG_FAST_DIFF_INVALID, 0);
};
- ASSERT_EQ(-EINVAL, do_diff(get_flags, 0, CEPH_NOSNAP, 0, UINT64_MAX));
+ ASSERT_EQ(-EINVAL, do_diff(false, get_flags, 0, CEPH_NOSNAP, 0, UINT64_MAX));
+ ASSERT_EQ(-EINVAL, do_diff(true, get_flags, 0, CEPH_NOSNAP, 0, UINT64_MAX));
}
}
expect_get_flags(mock_image_ctx, 2, RBD_FLAG_FAST_DIFF_INVALID, 0);
};
if (is_diff_iterate()) {
- ASSERT_EQ(-EINVAL, do_diff(get_flags, 1, CEPH_NOSNAP, 0, object_count));
+ ASSERT_EQ(-EINVAL, do_diff(false, get_flags, 1, CEPH_NOSNAP, 0, object_count));
+ ASSERT_EQ(-EINVAL, do_diff(true, get_flags, 1, CEPH_NOSNAP, 0, object_count));
} else {
- ASSERT_EQ(-EINVAL, do_diff(get_flags, 1, CEPH_NOSNAP, 0, UINT64_MAX));
+ ASSERT_EQ(-EINVAL, do_diff(false, get_flags, 1, CEPH_NOSNAP, 0, UINT64_MAX));
+ ASSERT_EQ(-EINVAL, do_diff(true, get_flags, 1, CEPH_NOSNAP, 0, UINT64_MAX));
}
}
expect_load_map(mock_image_ctx, 1, object_map_1, -EPERM);
};
if (is_diff_iterate()) {
- ASSERT_EQ(-EPERM, do_diff(load, 1, 2, 0, object_count));
+ ASSERT_EQ(-EPERM, do_diff(false, load, 1, 2, 0, object_count));
+ ASSERT_EQ(-EPERM, do_diff(true, load, 1, 2, 0, object_count));
} else {
- ASSERT_EQ(-EPERM, do_diff(load, 1, 2, 0, UINT64_MAX));
+ ASSERT_EQ(-EPERM, do_diff(false, load, 1, 2, 0, UINT64_MAX));
+ ASSERT_EQ(-EPERM, do_diff(true, load, 1, 2, 0, UINT64_MAX));
}
}
expect_get_flags(mock_image_ctx, 2, 0, 0);
expect_load_map(mock_image_ctx, 2, object_map_2, -EPERM);
};
- ASSERT_EQ(-EPERM, do_diff(load, 0, 2, 0, object_count));
+ auto with = [&](MockTestImageCtx& mock_image_ctx) {
+ expect_get_flags(mock_image_ctx, 2, 0, 0);
+ expect_with_map(mock_image_ctx, object_map_2);
+ };
+ ASSERT_EQ(-EPERM, do_diff(false, load, 0, 2, 0, object_count));
+ test_diff_iterate(true, with, 0, 2, expected_diff_state);
} else {
auto load = [&](MockTestImageCtx& mock_image_ctx) {
expect_get_flags(mock_image_ctx, 1, 0, 0);
expect_get_flags(mock_image_ctx, 2, 0, 0);
expect_load_map(mock_image_ctx, 2, object_map_2, -EPERM);
};
- ASSERT_EQ(-EPERM, do_diff(load, 0, 2, 0, UINT64_MAX));
+ ASSERT_EQ(-EPERM, do_diff(false, load, 0, 2, 0, UINT64_MAX));
+ ASSERT_EQ(-EPERM, do_diff(true, load, 0, 2, 0, UINT64_MAX));
}
}
expect_get_flags(mock_image_ctx, CEPH_NOSNAP, 0, 0);
expect_load_map(mock_image_ctx, CEPH_NOSNAP, object_map_head, 0);
};
- test_diff_iterate(load, 0, CEPH_NOSNAP, expected_diff_state);
+ auto with = [&](MockTestImageCtx& mock_image_ctx) {
+ expect_get_flags(mock_image_ctx, CEPH_NOSNAP, 0, 0);
+ expect_with_map(mock_image_ctx, object_map_head);
+ };
+ test_diff_iterate(false, load, 0, CEPH_NOSNAP, expected_diff_state);
+ test_diff_iterate(true, with, 0, CEPH_NOSNAP, expected_diff_state);
} else {
auto load = [&](MockTestImageCtx& mock_image_ctx) {
expect_get_flags(mock_image_ctx, 1, 0, 0);
expect_load_map(mock_image_ctx, 1, object_map_1, -EPERM);
};
- ASSERT_EQ(-EPERM, do_diff(load, 0, CEPH_NOSNAP, 0, UINT64_MAX));
+ ASSERT_EQ(-EPERM, do_diff(false, load, 0, CEPH_NOSNAP, 0, UINT64_MAX));
+ ASSERT_EQ(-EPERM, do_diff(true, load, 0, CEPH_NOSNAP, 0, UINT64_MAX));
}
}
expect_load_map(mock_image_ctx, 2, object_map_2, -EPERM);
};
if (is_diff_iterate()) {
- ASSERT_EQ(-EPERM, do_diff(load, 1, CEPH_NOSNAP, 0, object_count));
+ ASSERT_EQ(-EPERM, do_diff(false, load, 1, CEPH_NOSNAP, 0, object_count));
+ ASSERT_EQ(-EPERM, do_diff(true, load, 1, CEPH_NOSNAP, 0, object_count));
} else {
- ASSERT_EQ(-EPERM, do_diff(load, 1, CEPH_NOSNAP, 0, UINT64_MAX));
+ ASSERT_EQ(-EPERM, do_diff(false, load, 1, CEPH_NOSNAP, 0, UINT64_MAX));
+ ASSERT_EQ(-EPERM, do_diff(true, load, 1, CEPH_NOSNAP, 0, UINT64_MAX));
}
}
expect_load_map(mock_image_ctx, 1, object_map_1, 0);
};
if (is_diff_iterate()) {
- ASSERT_EQ(-EINVAL, do_diff(load, 1, 2, 0, object_count));
+ ASSERT_EQ(-EINVAL, do_diff(false, load, 1, 2, 0, object_count));
+ ASSERT_EQ(-EINVAL, do_diff(true, load, 1, 2, 0, object_count));
} else {
- ASSERT_EQ(-EINVAL, do_diff(load, 1, 2, 0, UINT64_MAX));
+ ASSERT_EQ(-EINVAL, do_diff(false, load, 1, 2, 0, UINT64_MAX));
+ ASSERT_EQ(-EINVAL, do_diff(true, load, 1, 2, 0, UINT64_MAX));
}
}
expect_get_flags(mock_image_ctx, 2, 0, 0);
expect_load_map(mock_image_ctx, 2, object_map_2, 0);
};
- ASSERT_EQ(-EINVAL, do_diff(load, 0, 2, 0, object_count));
+ auto with = [&](MockTestImageCtx& mock_image_ctx) {
+ expect_get_flags(mock_image_ctx, 2, 0, 0);
+ expect_with_map(mock_image_ctx, object_map_2);
+ };
+ ASSERT_EQ(-EINVAL, do_diff(false, load, 0, 2, 0, object_count));
+ ASSERT_EQ(-EINVAL, do_diff(true, with, 0, 2, 0, object_count));
} else {
auto load = [&](MockTestImageCtx& mock_image_ctx) {
expect_get_flags(mock_image_ctx, 1, 0, 0);
expect_get_flags(mock_image_ctx, 2, 0, 0);
expect_load_map(mock_image_ctx, 2, object_map_2, 0);
};
- ASSERT_EQ(-EINVAL, do_diff(load, 0, 2, 0, UINT64_MAX));
+ ASSERT_EQ(-EINVAL, do_diff(false, load, 0, 2, 0, UINT64_MAX));
+ ASSERT_EQ(-EINVAL, do_diff(true, load, 0, 2, 0, UINT64_MAX));
}
}
expect_get_flags(mock_image_ctx, CEPH_NOSNAP, 0, 0);
expect_load_map(mock_image_ctx, CEPH_NOSNAP, object_map_head, 0);
};
- test_diff_iterate(load, 0, CEPH_NOSNAP, expected_diff_state);
+ auto with = [&](MockTestImageCtx& mock_image_ctx) {
+ expect_get_flags(mock_image_ctx, CEPH_NOSNAP, 0, 0);
+ expect_with_map(mock_image_ctx, object_map_head);
+ };
+ test_diff_iterate(false, load, 0, CEPH_NOSNAP, expected_diff_state);
+ test_diff_iterate(true, with, 0, CEPH_NOSNAP, expected_diff_state);
} else {
auto load = [&](MockTestImageCtx& mock_image_ctx) {
expect_get_flags(mock_image_ctx, 1, 0, 0);
expect_load_map(mock_image_ctx, 1, object_map_1, 0);
};
- ASSERT_EQ(-EINVAL, do_diff(load, 0, CEPH_NOSNAP, 0, UINT64_MAX));
+ ASSERT_EQ(-EINVAL, do_diff(false, load, 0, CEPH_NOSNAP, 0, UINT64_MAX));
+ ASSERT_EQ(-EINVAL, do_diff(true, load, 0, CEPH_NOSNAP, 0, UINT64_MAX));
}
}
expect_load_map(mock_image_ctx, 2, object_map_2, 0);
};
if (is_diff_iterate()) {
- ASSERT_EQ(-EINVAL, do_diff(load, 1, CEPH_NOSNAP, 0, object_count));
+ ASSERT_EQ(-EINVAL, do_diff(false, load, 1, CEPH_NOSNAP, 0, object_count));
+ ASSERT_EQ(-EINVAL, do_diff(true, load, 1, CEPH_NOSNAP, 0, object_count));
} else {
- ASSERT_EQ(-EINVAL, do_diff(load, 1, CEPH_NOSNAP, 0, UINT64_MAX));
+ ASSERT_EQ(-EINVAL, do_diff(false, load, 1, CEPH_NOSNAP, 0, UINT64_MAX));
+ ASSERT_EQ(-EINVAL, do_diff(true, load, 1, CEPH_NOSNAP, 0, UINT64_MAX));
}
}
expect_get_flags(mock_image_ctx, CEPH_NOSNAP, 0, 0);
expect_load_map(mock_image_ctx, CEPH_NOSNAP, object_map_head, 0);
};
- test_diff_iterate(load, 0, CEPH_NOSNAP, expected_diff_state);
+ auto with = [&](MockTestImageCtx& mock_image_ctx) {
+ expect_get_flags(mock_image_ctx, CEPH_NOSNAP, 0, 0);
+ expect_with_map(mock_image_ctx, object_map_head);
+ };
+ test_diff_iterate(false, load, 0, CEPH_NOSNAP, expected_diff_state);
+ test_diff_iterate(true, with, 0, CEPH_NOSNAP, expected_diff_state);
} else {
auto load = [&](MockTestImageCtx& mock_image_ctx) {
expect_get_flags(mock_image_ctx, 1, 0, 0);
expect_get_flags(mock_image_ctx, CEPH_NOSNAP, 0, 0);
expect_load_map(mock_image_ctx, CEPH_NOSNAP, object_map_head, 0);
};
- test_deep_copy(load, 0, CEPH_NOSNAP, expected_diff_state);
+ test_deep_copy(false, load, 0, CEPH_NOSNAP, expected_diff_state);
+ test_deep_copy(true, load, 0, CEPH_NOSNAP, expected_diff_state);
}
}