Fix some bugs when testing opensds ansible
[stor4nfv.git] / src / ceph / src / test / test_rbd_replay.cc
1 // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2 // vim: ts=8 sw=2 smarttab
3 /*
4  * Ceph - scalable distributed file system
5  *
6  * Copyright (C) 2014 Adam Crume <adamcrume@gmail.com>
7  *
8  * This is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU Lesser General Public
10  * License version 2.1, as published by the Free Software
11  * Foundation.  See file COPYING.
12  *
13  */
14
15 #include "common/escape.h"
16 #include "gtest/gtest.h"
17 #include <stdint.h>
18 #include <boost/foreach.hpp>
19 #include <cstdarg>
20 #include "rbd_replay/ImageNameMap.hpp"
21 #include "rbd_replay/ios.hpp"
22 #include "rbd_replay/rbd_loc.hpp"
23
24
25 using namespace rbd_replay;
26
27 std::ostream& operator<<(std::ostream& o, const rbd_loc& name) {
28   return o << "('" << name.pool << "', '" << name.image << "', '" << name.snap << "')";
29 }
30
31 static void add_mapping(ImageNameMap *map, std::string mapping_string) {
32   ImageNameMap::Mapping mapping;
33   if (!map->parse_mapping(mapping_string, &mapping)) {
34     ASSERT_TRUE(false) << "Failed to parse mapping string '" << mapping_string << "'";
35   }
36   map->add_mapping(mapping);
37 }
38
39 TEST(RBDReplay, ImageNameMap) {
40   ImageNameMap m;
41   add_mapping(&m, "x@y=y@x");
42   add_mapping(&m, "a\\=b@c=h@i");
43   add_mapping(&m, "a@b\\=c=j@k");
44   add_mapping(&m, "a\\@b@c=d@e");
45   add_mapping(&m, "a@b\\@c=f@g");
46   add_mapping(&m, "image@snap_1=image_1");
47   ImageNameMap::Mapping mapping;
48   EXPECT_FALSE(m.parse_mapping("bad=@@@", &mapping));
49   EXPECT_FALSE(m.parse_mapping("bad==stuff", &mapping));
50   EXPECT_EQ(rbd_loc("", "y", "x"), m.map(rbd_loc("", "x", "y")));
51   EXPECT_EQ(rbd_loc("", "h", "i"), m.map(rbd_loc("", "a=b", "c")));
52   EXPECT_EQ(rbd_loc("", "j", "k"), m.map(rbd_loc("", "a", "b=c")));
53   EXPECT_EQ(rbd_loc("", "d", "e"), m.map(rbd_loc("", "a@b", "c")));
54   EXPECT_EQ(rbd_loc("", "f", "g"), m.map(rbd_loc("", "a", "b@c")));
55   EXPECT_EQ(rbd_loc("", "image_1", ""), m.map(rbd_loc("", "image", "snap_1")));
56 }
57
58 TEST(RBDReplay, rbd_loc_str) {
59   EXPECT_EQ("", rbd_loc("", "", "").str());
60   EXPECT_EQ("a/", rbd_loc("a", "", "").str());
61   EXPECT_EQ("b", rbd_loc("", "b", "").str());
62   EXPECT_EQ("a/b", rbd_loc("a", "b", "").str());
63   EXPECT_EQ("@c", rbd_loc("", "", "c").str());
64   EXPECT_EQ("a/@c", rbd_loc("a", "", "c").str());
65   EXPECT_EQ("b@c", rbd_loc("", "b", "c").str());
66   EXPECT_EQ("a/b@c", rbd_loc("a", "b", "c").str());
67   EXPECT_EQ("a\\@x/b\\@y@c\\@z", rbd_loc("a@x", "b@y", "c@z").str());
68   EXPECT_EQ("a\\/x/b\\/y@c\\/z", rbd_loc("a/x", "b/y", "c/z").str());
69   EXPECT_EQ("a\\\\x/b\\\\y@c\\\\z", rbd_loc("a\\x", "b\\y", "c\\z").str());
70 }
71
72 TEST(RBDReplay, rbd_loc_parse) {
73   rbd_loc m("x", "y", "z");
74
75   EXPECT_TRUE(m.parse(""));
76   EXPECT_EQ("", m.pool);
77   EXPECT_EQ("", m.image);
78   EXPECT_EQ("", m.snap);
79
80   EXPECT_TRUE(m.parse("a/"));
81   EXPECT_EQ("a", m.pool);
82   EXPECT_EQ("", m.image);
83   EXPECT_EQ("", m.snap);
84
85   EXPECT_TRUE(m.parse("b"));
86   EXPECT_EQ("", m.pool);
87   EXPECT_EQ("b", m.image);
88   EXPECT_EQ("", m.snap);
89
90   EXPECT_TRUE(m.parse("a/b"));
91   EXPECT_EQ("a", m.pool);
92   EXPECT_EQ("b", m.image);
93   EXPECT_EQ("", m.snap);
94
95   EXPECT_TRUE(m.parse("@c"));
96   EXPECT_EQ("", m.pool);
97   EXPECT_EQ("", m.image);
98   EXPECT_EQ("c", m.snap);
99
100   EXPECT_TRUE(m.parse("a/@c"));
101   EXPECT_EQ("a", m.pool);
102   EXPECT_EQ("", m.image);
103   EXPECT_EQ("c", m.snap);
104
105   EXPECT_TRUE(m.parse("b@c"));
106   EXPECT_EQ("", m.pool);
107   EXPECT_EQ("b", m.image);
108   EXPECT_EQ("c", m.snap);
109
110   EXPECT_TRUE(m.parse("a/b@c"));
111   EXPECT_EQ("a", m.pool);
112   EXPECT_EQ("b", m.image);
113   EXPECT_EQ("c", m.snap);
114
115   EXPECT_TRUE(m.parse("a\\@x/b\\@y@c\\@z"));
116   EXPECT_EQ("a@x", m.pool);
117   EXPECT_EQ("b@y", m.image);
118   EXPECT_EQ("c@z", m.snap);
119
120   EXPECT_TRUE(m.parse("a\\/x/b\\/y@c\\/z"));
121   EXPECT_EQ("a/x", m.pool);
122   EXPECT_EQ("b/y", m.image);
123   EXPECT_EQ("c/z", m.snap);
124
125   EXPECT_TRUE(m.parse("a\\\\x/b\\\\y@c\\\\z"));
126   EXPECT_EQ("a\\x", m.pool);
127   EXPECT_EQ("b\\y", m.image);
128   EXPECT_EQ("c\\z", m.snap);
129
130   EXPECT_FALSE(m.parse("a@b@c"));
131   EXPECT_FALSE(m.parse("a/b/c"));
132   EXPECT_FALSE(m.parse("a@b/c"));
133 }
134