1 // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2 // vim: ts=8 sw=2 smarttab
4 #include "test/librbd/test_mock_fixture.h"
5 #include "test/librbd/test_support.h"
6 #include "test/librbd/mock/MockImageCtx.h"
7 #include "test/librbd/mock/MockContextWQ.h"
8 #include "test/librados_test_stub/MockTestMemIoCtxImpl.h"
9 #include "librbd/image/AttachParentRequest.h"
10 #include "gmock/gmock.h"
11 #include "gtest/gtest.h"
16 struct MockTestImageCtx
: public MockImageCtx
{
17 MockTestImageCtx(ImageCtx
&image_ctx
) : MockImageCtx(image_ctx
) {
21 } // anonymous namespace
24 // template definitions
25 #include "librbd/image/AttachParentRequest.cc"
31 using ::testing::InSequence
;
32 using ::testing::Return
;
33 using ::testing::StrEq
;
35 class TestMockImageAttachParentRequest
: public TestMockFixture
{
37 typedef AttachParentRequest
<MockTestImageCtx
> MockAttachParentRequest
;
39 void SetUp() override
{
40 TestMockFixture::SetUp();
42 ASSERT_EQ(0, open_image(m_image_name
, &image_ctx
));
45 void expect_parent_attach(MockImageCtx
&mock_image_ctx
, int r
) {
46 EXPECT_CALL(get_mock_io_ctx(mock_image_ctx
.md_ctx
),
47 exec(mock_image_ctx
.header_oid
, _
, StrEq("rbd"),
48 StrEq("parent_attach"), _
, _
, _
, _
))
52 void expect_set_parent(MockImageCtx
&mock_image_ctx
, int r
) {
53 EXPECT_CALL(get_mock_io_ctx(mock_image_ctx
.md_ctx
),
54 exec(mock_image_ctx
.header_oid
, _
, StrEq("rbd"),
55 StrEq("set_parent"), _
, _
, _
, _
))
59 librbd::ImageCtx
*image_ctx
;
62 TEST_F(TestMockImageAttachParentRequest
, ParentAttachSuccess
) {
63 REQUIRE_FEATURE(RBD_FEATURE_LAYERING
);
65 MockTestImageCtx
mock_image_ctx(*image_ctx
);
68 expect_parent_attach(mock_image_ctx
, 0);
70 cls::rbd::ParentImageSpec parent_image_spec
{
71 1, "ns", "image id", 123};
74 auto req
= MockAttachParentRequest::create(mock_image_ctx
, parent_image_spec
,
77 ASSERT_EQ(0, ctx
.wait());
80 TEST_F(TestMockImageAttachParentRequest
, SetParentSuccess
) {
81 REQUIRE_FEATURE(RBD_FEATURE_LAYERING
);
83 MockTestImageCtx
mock_image_ctx(*image_ctx
);
86 expect_parent_attach(mock_image_ctx
, -EOPNOTSUPP
);
87 expect_set_parent(mock_image_ctx
, 0);
89 cls::rbd::ParentImageSpec parent_image_spec
{
90 1, "", "image id", 123};
93 auto req
= MockAttachParentRequest::create(mock_image_ctx
, parent_image_spec
,
96 ASSERT_EQ(0, ctx
.wait());
99 TEST_F(TestMockImageAttachParentRequest
, ParentAttachError
) {
100 REQUIRE_FEATURE(RBD_FEATURE_LAYERING
);
102 MockTestImageCtx
mock_image_ctx(*image_ctx
);
105 expect_parent_attach(mock_image_ctx
, -EPERM
);
107 cls::rbd::ParentImageSpec parent_image_spec
{
108 1, "", "image id", 123};
111 auto req
= MockAttachParentRequest::create(mock_image_ctx
, parent_image_spec
,
114 ASSERT_EQ(-EPERM
, ctx
.wait());
117 TEST_F(TestMockImageAttachParentRequest
, SetParentError
) {
118 REQUIRE_FEATURE(RBD_FEATURE_LAYERING
);
120 MockTestImageCtx
mock_image_ctx(*image_ctx
);
123 expect_parent_attach(mock_image_ctx
, -EOPNOTSUPP
);
124 expect_set_parent(mock_image_ctx
, -EINVAL
);
126 cls::rbd::ParentImageSpec parent_image_spec
{
127 1, "", "image id", 123};
130 auto req
= MockAttachParentRequest::create(mock_image_ctx
, parent_image_spec
,
133 ASSERT_EQ(-EINVAL
, ctx
.wait());
136 TEST_F(TestMockImageAttachParentRequest
, NamespaceUnsupported
) {
137 REQUIRE_FEATURE(RBD_FEATURE_LAYERING
);
139 MockTestImageCtx
mock_image_ctx(*image_ctx
);
142 expect_parent_attach(mock_image_ctx
, -EOPNOTSUPP
);
144 cls::rbd::ParentImageSpec parent_image_spec
{
145 1, "ns", "image id", 123};
148 auto req
= MockAttachParentRequest::create(mock_image_ctx
, parent_image_spec
,
151 ASSERT_EQ(-EXDEV
, ctx
.wait());
155 } // namespace librbd