1 // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2 // vim: ts=8 sw=2 smarttab
4 #include "cls/rbd/cls_rbd_client.h"
5 #include "cls/rbd/cls_rbd_types.h"
6 #include "test/librbd/test_fixture.h"
7 #include "test/librbd/test_support.h"
8 #include "librbd/api/Trash.h"
12 void register_test_trash() {
17 static bool operator==(const trash_image_info_t
& lhs
,
18 const trash_image_info_t
& rhs
) {
19 return (lhs
.id
== rhs
.id
&&
20 lhs
.name
== rhs
.name
&&
21 lhs
.source
== rhs
.source
);
24 static bool operator==(const image_spec_t
& lhs
,
25 const image_spec_t
& rhs
) {
26 return (lhs
.id
== rhs
.id
&& lhs
.name
== rhs
.name
);
29 class TestTrash
: public TestFixture
{
35 TEST_F(TestTrash
, UserRemovingSource
) {
38 auto compare_lambda
= [](const trash_image_info_t
& lhs
,
39 const trash_image_info_t
& rhs
) {
40 if (lhs
.id
!= rhs
.id
) {
41 return lhs
.id
< rhs
.id
;
42 } else if (lhs
.name
!= rhs
.name
) {
43 return lhs
.name
< rhs
.name
;
45 return lhs
.source
< rhs
.source
;
47 typedef std::set
<trash_image_info_t
, decltype(compare_lambda
)> TrashEntries
;
51 auto image_name1
= m_image_name
;
52 std::string image_id1
;
53 ASSERT_EQ(0, rbd
.open(m_ioctx
, image
, image_name1
.c_str()));
54 ASSERT_EQ(0, image
.get_id(&image_id1
));
55 ASSERT_EQ(0, image
.close());
57 auto image_name2
= get_temp_image_name();
58 ASSERT_EQ(0, create_image_pp(m_rbd
, m_ioctx
, image_name2
, m_image_size
));
60 std::string image_id2
;
61 ASSERT_EQ(0, rbd
.open(m_ioctx
, image
, image_name2
.c_str()));
62 ASSERT_EQ(0, image
.get_id(&image_id2
));
63 ASSERT_EQ(0, image
.close());
65 ASSERT_EQ(0, api::Trash
<>::move(m_ioctx
, RBD_TRASH_IMAGE_SOURCE_USER
,
66 image_name1
, image_id1
, 0));
67 ASSERT_EQ(0, api::Trash
<>::move(m_ioctx
, RBD_TRASH_IMAGE_SOURCE_REMOVING
,
68 image_name2
, image_id2
, 0));
70 TrashEntries trash_entries
{compare_lambda
};
71 TrashEntries expected_trash_entries
{compare_lambda
};
73 std::vector
<trash_image_info_t
> entries
;
74 ASSERT_EQ(0, api::Trash
<>::list(m_ioctx
, entries
, true));
75 trash_entries
.insert(entries
.begin(), entries
.end());
77 expected_trash_entries
= {
80 .source
= RBD_TRASH_IMAGE_SOURCE_USER
},
82 ASSERT_EQ(expected_trash_entries
, trash_entries
);
84 std::vector
<image_spec_t
> expected_images
= {
85 {.id
= image_id2
, .name
= image_name2
}
87 std::vector
<image_spec_t
> images
;
88 ASSERT_EQ(0, rbd
.list2(m_ioctx
, &images
));
89 ASSERT_EQ(expected_images
, images
);
92 TEST_F(TestTrash
, RestoreMirroringSource
) {
98 ASSERT_EQ(0, rbd
.open(m_ioctx
, image
, m_image_name
.c_str()));
99 ASSERT_EQ(0, image
.get_id(&image_id
));
100 ASSERT_EQ(0, image
.close());
102 ASSERT_EQ(0, api::Trash
<>::move(m_ioctx
, RBD_TRASH_IMAGE_SOURCE_MIRRORING
,
104 ASSERT_EQ(0, rbd
.trash_restore(m_ioctx
, image_id
.c_str(),
105 m_image_name
.c_str()));
108 } // namespace librbd