]>
Commit | Line | Data |
---|---|---|
7c673cae FG |
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 | ||
f67539c2 | 25 | namespace rbd_replay { |
7c673cae FG |
26 | std::ostream& operator<<(std::ostream& o, const rbd_loc& name) { |
27 | return o << "('" << name.pool << "', '" << name.image << "', '" << name.snap << "')"; | |
28 | } | |
f67539c2 TL |
29 | } |
30 | ||
31 | using namespace rbd_replay; | |
7c673cae FG |
32 | |
33 | static void add_mapping(ImageNameMap *map, std::string mapping_string) { | |
34 | ImageNameMap::Mapping mapping; | |
35 | if (!map->parse_mapping(mapping_string, &mapping)) { | |
36 | ASSERT_TRUE(false) << "Failed to parse mapping string '" << mapping_string << "'"; | |
37 | } | |
38 | map->add_mapping(mapping); | |
39 | } | |
40 | ||
41 | TEST(RBDReplay, ImageNameMap) { | |
42 | ImageNameMap m; | |
43 | add_mapping(&m, "x@y=y@x"); | |
44 | add_mapping(&m, "a\\=b@c=h@i"); | |
45 | add_mapping(&m, "a@b\\=c=j@k"); | |
46 | add_mapping(&m, "a\\@b@c=d@e"); | |
47 | add_mapping(&m, "a@b\\@c=f@g"); | |
48 | add_mapping(&m, "image@snap_1=image_1"); | |
49 | ImageNameMap::Mapping mapping; | |
50 | EXPECT_FALSE(m.parse_mapping("bad=@@@", &mapping)); | |
51 | EXPECT_FALSE(m.parse_mapping("bad==stuff", &mapping)); | |
52 | EXPECT_EQ(rbd_loc("", "y", "x"), m.map(rbd_loc("", "x", "y"))); | |
53 | EXPECT_EQ(rbd_loc("", "h", "i"), m.map(rbd_loc("", "a=b", "c"))); | |
54 | EXPECT_EQ(rbd_loc("", "j", "k"), m.map(rbd_loc("", "a", "b=c"))); | |
55 | EXPECT_EQ(rbd_loc("", "d", "e"), m.map(rbd_loc("", "a@b", "c"))); | |
56 | EXPECT_EQ(rbd_loc("", "f", "g"), m.map(rbd_loc("", "a", "b@c"))); | |
57 | EXPECT_EQ(rbd_loc("", "image_1", ""), m.map(rbd_loc("", "image", "snap_1"))); | |
58 | } | |
59 | ||
60 | TEST(RBDReplay, rbd_loc_str) { | |
61 | EXPECT_EQ("", rbd_loc("", "", "").str()); | |
62 | EXPECT_EQ("a/", rbd_loc("a", "", "").str()); | |
63 | EXPECT_EQ("b", rbd_loc("", "b", "").str()); | |
64 | EXPECT_EQ("a/b", rbd_loc("a", "b", "").str()); | |
65 | EXPECT_EQ("@c", rbd_loc("", "", "c").str()); | |
66 | EXPECT_EQ("a/@c", rbd_loc("a", "", "c").str()); | |
67 | EXPECT_EQ("b@c", rbd_loc("", "b", "c").str()); | |
68 | EXPECT_EQ("a/b@c", rbd_loc("a", "b", "c").str()); | |
69 | EXPECT_EQ("a\\@x/b\\@y@c\\@z", rbd_loc("a@x", "b@y", "c@z").str()); | |
70 | EXPECT_EQ("a\\/x/b\\/y@c\\/z", rbd_loc("a/x", "b/y", "c/z").str()); | |
71 | EXPECT_EQ("a\\\\x/b\\\\y@c\\\\z", rbd_loc("a\\x", "b\\y", "c\\z").str()); | |
72 | } | |
73 | ||
74 | TEST(RBDReplay, rbd_loc_parse) { | |
75 | rbd_loc m("x", "y", "z"); | |
76 | ||
77 | EXPECT_TRUE(m.parse("")); | |
78 | EXPECT_EQ("", m.pool); | |
79 | EXPECT_EQ("", m.image); | |
80 | EXPECT_EQ("", m.snap); | |
81 | ||
82 | EXPECT_TRUE(m.parse("a/")); | |
83 | EXPECT_EQ("a", m.pool); | |
84 | EXPECT_EQ("", m.image); | |
85 | EXPECT_EQ("", m.snap); | |
86 | ||
87 | EXPECT_TRUE(m.parse("b")); | |
88 | EXPECT_EQ("", m.pool); | |
89 | EXPECT_EQ("b", m.image); | |
90 | EXPECT_EQ("", m.snap); | |
91 | ||
92 | EXPECT_TRUE(m.parse("a/b")); | |
93 | EXPECT_EQ("a", m.pool); | |
94 | EXPECT_EQ("b", m.image); | |
95 | EXPECT_EQ("", m.snap); | |
96 | ||
97 | EXPECT_TRUE(m.parse("@c")); | |
98 | EXPECT_EQ("", m.pool); | |
99 | EXPECT_EQ("", m.image); | |
100 | EXPECT_EQ("c", m.snap); | |
101 | ||
102 | EXPECT_TRUE(m.parse("a/@c")); | |
103 | EXPECT_EQ("a", m.pool); | |
104 | EXPECT_EQ("", m.image); | |
105 | EXPECT_EQ("c", m.snap); | |
106 | ||
107 | EXPECT_TRUE(m.parse("b@c")); | |
108 | EXPECT_EQ("", m.pool); | |
109 | EXPECT_EQ("b", m.image); | |
110 | EXPECT_EQ("c", m.snap); | |
111 | ||
112 | EXPECT_TRUE(m.parse("a/b@c")); | |
113 | EXPECT_EQ("a", m.pool); | |
114 | EXPECT_EQ("b", m.image); | |
115 | EXPECT_EQ("c", m.snap); | |
116 | ||
117 | EXPECT_TRUE(m.parse("a\\@x/b\\@y@c\\@z")); | |
118 | EXPECT_EQ("a@x", m.pool); | |
119 | EXPECT_EQ("b@y", m.image); | |
120 | EXPECT_EQ("c@z", m.snap); | |
121 | ||
122 | EXPECT_TRUE(m.parse("a\\/x/b\\/y@c\\/z")); | |
123 | EXPECT_EQ("a/x", m.pool); | |
124 | EXPECT_EQ("b/y", m.image); | |
125 | EXPECT_EQ("c/z", m.snap); | |
126 | ||
127 | EXPECT_TRUE(m.parse("a\\\\x/b\\\\y@c\\\\z")); | |
128 | EXPECT_EQ("a\\x", m.pool); | |
129 | EXPECT_EQ("b\\y", m.image); | |
130 | EXPECT_EQ("c\\z", m.snap); | |
131 | ||
132 | EXPECT_FALSE(m.parse("a@b@c")); | |
133 | EXPECT_FALSE(m.parse("a/b/c")); | |
134 | EXPECT_FALSE(m.parse("a@b/c")); | |
135 | } | |
136 |