]> git.proxmox.com Git - ceph.git/blame - ceph/src/test/test_addrs.cc
buildsys: switch source download to quincy
[ceph.git] / ceph / src / test / test_addrs.cc
CommitLineData
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) 2011 New Dream Network
7 *
8 * This is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU General Public
10 * License version 2, as published by the Free Software
11 * Foundation. See file COPYING.
12 *
13 */
14
15#include "include/types.h"
11fdf7f2 16#include "include/stringify.h"
7c673cae
FG
17#include "msg/msg_types.h"
18#include "gtest/gtest.h"
19
20#include <sstream>
21
22// input, parsed+printed addr output, leftover
23// if the parse fails, output + leftover should both be blank.
24const char *addr_checks[][3] = {
11fdf7f2
TL
25 { "127.0.0.1", "v2:127.0.0.1:0/0", "" },
26 { "127.0.0.1 foo", "v2:127.0.0.1:0/0", " foo" },
27 { "127.0.0.1:1234 foo", "v2:127.0.0.1:1234/0", " foo" },
28 { "127.0.0.1:1234/5678 foo", "v2:127.0.0.1:1234/5678", " foo" },
29 { "1.2.3:4 a", "", "1.2.3:4 a" },
30 { "2607:f298:4:2243::5522", "v2:[2607:f298:4:2243::5522]:0/0", "" },
31 { "[2607:f298:4:2243::5522]", "v2:[2607:f298:4:2243::5522]:0/0", "" },
32 { "2607:f298:4:2243::5522a", "", "2607:f298:4:2243::5522a" },
33 { "[2607:f298:4:2243::5522]a", "v2:[2607:f298:4:2243::5522]:0/0", "a" },
34 { "[2607:f298:4:2243::5522]:1234a", "v2:[2607:f298:4:2243::5522]:1234/0", "a" },
35 { "2001:0db8:85a3:0000:0000:8a2e:0370:7334", "v2:[2001:db8:85a3::8a2e:370:7334]:0/0", "" },
36 { "2001:2db8:85a3:4334:4324:8a2e:1370:7334", "v2:[2001:2db8:85a3:4334:4324:8a2e:1370:7334]:0/0", "" },
37 { "::", "v2:[::]:0/0", "" },
38 { "::zz", "v2:[::]:0/0", "zz" },
39 { ":: 12:34", "v2:[::]:0/0", " 12:34" },
7c673cae
FG
40 { "-", "-", "" },
41 { "-asdf", "-", "asdf" },
11fdf7f2
TL
42 { "v1:1.2.3.4", "v1:1.2.3.4:0/0", "" },
43 { "v1:1.2.3.4:12", "v1:1.2.3.4:12/0", "" },
44 { "v1:1.2.3.4:12/34", "v1:1.2.3.4:12/34", "" },
45 { "v2:1.2.3.4", "v2:1.2.3.4:0/0", "" },
46 { "v2:1.2.3.4:12", "v2:1.2.3.4:12/0", "" },
47 { "v2:1.2.3.4:12/34", "v2:1.2.3.4:12/34", "" },
7c673cae
FG
48 { NULL, NULL, NULL },
49};
50
11fdf7f2
TL
51const char *addr_only_checks[][3] = {
52 // we shouldn't parse an addrvec...
53 { "[v2:1.2.3.4:111/0,v1:5.6.7.8:222/0]", "", "[v2:1.2.3.4:111/0,v1:5.6.7.8:222/0]" },
54 { NULL, NULL, NULL },
55};
56
57
58
7c673cae
FG
59TEST(Msgr, TestAddrParsing)
60{
11fdf7f2
TL
61 for (auto& addr_checks : { addr_checks, addr_only_checks }) {
62 for (unsigned i = 0; addr_checks[i][0]; ++i) {
63 entity_addr_t a;
64 const char *end = "";
65 bool ok = a.parse(addr_checks[i][0], &end);
66 string out;
67 if (ok) {
68 stringstream ss;
69 ss << a;
70 getline(ss, out);
71 }
72 string left = end;
7c673cae 73
11fdf7f2 74 cout << "'" << addr_checks[i][0] << "' -> '" << out << "' + '" << left << "'" << std::endl;
7c673cae 75
11fdf7f2
TL
76 ASSERT_EQ(out, addr_checks[i][1]);
77 ASSERT_EQ(left, addr_checks[i][2]);
78 if (addr_checks[i][0] == end) {
79 ASSERT_FALSE(ok);
80 } else {
81 ASSERT_TRUE(ok);
82 }
83 }
7c673cae
FG
84 }
85}
86
11fdf7f2
TL
87// check that legacy encoding to new decoding behaves
88
7c673cae 89const char *addr_checks2[][3] = {
11fdf7f2
TL
90 { "v1:127.0.0.1", "v1:127.0.0.1:0/0", "" },
91 { "v1:127.0.0.1 foo", "v1:127.0.0.1:0/0", " foo" },
92 { "v1:127.0.0.1:1234 foo", "v1:127.0.0.1:1234/0", " foo" },
93 { "v1:127.0.0.1:1234/5678 foo", "v1:127.0.0.1:1234/5678", " foo" },
94 { "v1:2607:f298:4:2243::5522", "v1:[2607:f298:4:2243::5522]:0/0", "" },
95 { "v1:[2607:f298:4:2243::5522]", "v1:[2607:f298:4:2243::5522]:0/0", "" },
96 { "v1:[2607:f298:4:2243::5522]a", "v1:[2607:f298:4:2243::5522]:0/0", "a" },
97 { "v1:[2607:f298:4:2243::5522]:1234a", "v1:[2607:f298:4:2243::5522]:1234/0", "a" },
98 { "v1:2001:0db8:85a3:0000:0000:8a2e:0370:7334", "v1:[2001:db8:85a3::8a2e:370:7334]:0/0", "" },
99 { "v1:2001:2db8:85a3:4334:4324:8a2e:1370:7334", "v1:[2001:2db8:85a3:4334:4324:8a2e:1370:7334]:0/0", "" },
100 { "v1:1.2.3.4", "v1:1.2.3.4:0/0", "" },
101 { "v1:1.2.3.4:12", "v1:1.2.3.4:12/0", "" },
102 { "v1:1.2.3.4:12/34", "v1:1.2.3.4:12/34", "" },
7c673cae
FG
103 { NULL, NULL, NULL },
104};
105
106TEST(Msgr, TestAddrEncodeAddrvecDecode)
107{
108 for (unsigned i = 0; addr_checks2[i][0]; ++i) {
109 entity_addr_t addr;
110 entity_addrvec_t addrvec;
7c673cae
FG
111 const char *end = "";
112 bool ok = addr.parse(addr_checks2[i][0], &end);
113 ASSERT_TRUE(ok);
114 bufferlist bl;
115 addr.encode(bl, 0);
11fdf7f2 116 auto bli = bl.cbegin();
7c673cae 117 addrvec.decode(bli);
11fdf7f2 118 cout << addr_checks2[i][0] << " " << addr << " " << addrvec << std::endl;
7c673cae 119 ASSERT_EQ(addr, addrvec.v[0]);
11fdf7f2
TL
120 if (addr_checks2[i][0] == end) {
121 ASSERT_FALSE(ok);
122 } else {
123 ASSERT_TRUE(ok);
124 }
7c673cae
FG
125 }
126}
127
128TEST(Msgr, TestAddrvec0EncodeAddrDecode)
129{
130 for (unsigned i = 0; addr_checks2[i][0]; ++i) {
131 entity_addr_t addr;
132 entity_addrvec_t addrvec;
133 bufferlist bl;
7c673cae
FG
134 const char *end = "";
135 bool ok = addr.parse(addr_checks2[i][0], &end);
136 ASSERT_TRUE(ok);
137 addrvec.v.push_back(addr);
138 addrvec.encode(bl, 0);
11fdf7f2 139 auto bli = bl.cbegin();
7c673cae
FG
140 entity_addr_t a;
141 a.decode(bli);
142 ASSERT_EQ(addr, a);
143 }
144}
145
146TEST(Msgr, TestEmptyAddrvecEncodeAddrDecode)
147{
148 entity_addrvec_t addrvec;
149 entity_addr_t addr;
150 bufferlist bl;
7c673cae 151 addrvec.encode(bl, 0);
11fdf7f2 152 auto bli = bl.cbegin();
7c673cae 153 addr.decode(bli);
11fdf7f2 154 ASSERT_EQ(addr, entity_addr_t());
7c673cae
FG
155}
156
157const char *addrvec_checks[][4] = {
11fdf7f2
TL
158 { "v1:1.2.3.4", "v2:1.2.3.4", "v1:1.2.3.4", "v2:1.2.3.4" },
159 { "v2:1.2.3.5", "v1:1.2.3.5", "v1:1.2.3.5", "v2:1.2.3.5" },
160 { "v2:1.2.3.6", "v2:1.2.3.6", "v1:1.2.3.6", "v2:1.2.3.6" },
161 { "v2:1.2.3.7", "v1:1.2.3.7", "v1:1.2.3.7", "v2:1.2.3.7" },
7c673cae
FG
162 { NULL, NULL, NULL, NULL },
163};
164
165/*
166 * multiple addrs where one is legacy and others are not
167 * legacy addr is in position 0
168 */
169TEST(Msgr, TestAddrvecEncodeAddrDecode0)
170{
171 entity_addr_t addr;
172 entity_addrvec_t addrvec;
173 bufferlist bl;
7c673cae
FG
174
175 for (unsigned i = 0; addrvec_checks[i][0]; ++i) {
176 const char *end = "";
177 bool ok = addr.parse(addrvec_checks[i][0], &end);
178 ASSERT_TRUE(ok);
179 addrvec.v.push_back(addr);
180 }
181
182 addrvec.encode(bl, 0);
11fdf7f2 183 auto bli = bl.cbegin();
7c673cae
FG
184
185 addr.decode(bli);
186
187 ASSERT_EQ(addr, addrvec.v[0]);
188}
189
190/*
191 * multiple addrs where one is legacy and others are not
192 * legacy addr is not in position 0
193 */
194TEST(Msgr, TestAddrvecEncodeAddrDecode1)
195{
196 entity_addr_t addr, a;
197 entity_addrvec_t addrvec;
198 bufferlist bl;
7c673cae
FG
199 bool flag = true;
200
201 for (unsigned i = 0; addrvec_checks[i][1]; ++i) {
202 const char *end = "";
203 bool ok = addr.parse(addrvec_checks[i][1], &end);
204 ASSERT_TRUE(ok);
205 if (addr.type == entity_addr_t::TYPE_LEGACY && flag) {
206 a = addr;
207 flag = !flag;
208 }
209 addrvec.v.push_back(addr);
210 }
211
212 addrvec.encode(bl, 0);
11fdf7f2 213 auto bli = bl.cbegin();
7c673cae
FG
214
215 addr.decode(bli);
216
217 ASSERT_EQ(addr, a);
218}
219
220/* multiple legacy addrs */
221TEST(Msgr, TestAddrvecEncodeAddrDecode2)
222{
223 entity_addr_t addr;
224 entity_addrvec_t addrvec;
225 bufferlist bl;
7c673cae
FG
226
227 for (unsigned i = 0; addrvec_checks[i][2]; ++i) {
228 const char *end = "";
229 bool ok = addr.parse(addrvec_checks[i][2], &end);
230 ASSERT_TRUE(ok);
231 addrvec.v.push_back(addr);
232 }
233
234 addrvec.encode(bl, 0);
11fdf7f2 235 auto bli = bl.cbegin();
7c673cae
FG
236
237 addr.decode(bli);
238
239 ASSERT_EQ(addr, addrvec.v[0]);
240}
241
242/* all non-legacy addrs */
243TEST(Msgr, TestAddrvecEncodeAddrDecode3)
244{
245 entity_addr_t addr;
246 entity_addrvec_t addrvec;
247 bufferlist bl;
7c673cae
FG
248
249 for (unsigned i = 0; addrvec_checks[i][3]; ++i) {
250 const char *end = "";
251 bool ok = addr.parse(addrvec_checks[i][3], &end);
252 ASSERT_TRUE(ok);
253 addrvec.v.push_back(addr);
254 }
255
256 addrvec.encode(bl, 0);
11fdf7f2 257 auto bli = bl.cbegin();
7c673cae
FG
258
259 addr.decode(bli);
11fdf7f2
TL
260 //cout << addrvec << " (legacy " << addrvec.legacy_addr()
261 //<< ") -> " << addr << std::endl;
7c673cae
FG
262
263 ASSERT_NE(addr, addrvec.v[0]); // it's not the first addr(which is non-legacy)
11fdf7f2
TL
264 ASSERT_EQ(addr, entity_addr_t()); // it's not a blank addr either
265}
266
267const char *addrvec_parse_checks[][3] = {
268 { "", "", "" },
269 { "foo", "", "foo" },
270 { " foo", "", " foo" },
271 { "127.0.0.1", "v2:127.0.0.1:0/0", "" },
272 { "127.0.0.1 foo", "v2:127.0.0.1:0/0", " foo" },
273 { "[127.0.0.1]", "v2:127.0.0.1:0/0", "" },
274 { "[127.0.0.1] foo", "v2:127.0.0.1:0/0", " foo" },
275 { "127.0.0.1,::,- foo", "v2:127.0.0.1:0/0", ",::,- foo" },
276 { "[127.0.0.1,::,-] foo", "[v2:127.0.0.1:0/0,v2:[::]:0/0,-]", " foo" },
277 { "[127.0.0.1,::],- foo", "[v2:127.0.0.1:0/0,v2:[::]:0/0]", ",- foo" },
278 { "[1.2.3.4,::,foo]", "", "[1.2.3.4,::,foo]" },
279 { "[1.2.3.4,::,- foo", "", "[1.2.3.4,::,- foo" },
280 { "[[::],1.2.3.4]", "[v2:[::]:0/0,v2:1.2.3.4:0/0]", "" },
281 { "[::],1.2.3.4", "v2:[::]:0/0", ",1.2.3.4" },
282 { NULL, NULL, NULL },
283};
284
285TEST(entity_addrvec_t, parse)
286{
287 entity_addrvec_t addrvec;
288
289 for (auto v : { addr_checks, addr_checks2, addrvec_parse_checks }) {
290 for (unsigned i = 0; v[i][0]; ++i) {
291 const char *end = "";
292 bool ret = addrvec.parse(v[i][0], &end);
293 string out = stringify(addrvec);
294 string left = end;
295 cout << "'" << v[i][0] << "' -> '" << out << "' + '" << left << "'"
296 << std::endl;
297 ASSERT_EQ(out, v[i][1]);
298 ASSERT_EQ(left, v[i][2]);
299 ASSERT_TRUE(out.empty() || ret);
300 }
301 }
302}
303
304TEST(entity_addrvec_t, legacy_equals)
305{
306 entity_addr_t a1, a2;
307 ASSERT_TRUE(a1.parse("v1:1.2.3.4:567/890"));
308 ASSERT_TRUE(a2.parse("v2:1.2.3.4:567/890"));
309 entity_addrvec_t av1(a1);
310 entity_addrvec_t av21;
311 av21.v.push_back(a2);
312 av21.v.push_back(a1);
313 ASSERT_TRUE(av1.legacy_equals(av1));
314 ASSERT_TRUE(av21.legacy_equals(av21));
315 ASSERT_TRUE(av1.legacy_equals(av21));
316 ASSERT_TRUE(av21.legacy_equals(av1));
317
318 entity_addr_t b1, b2;
319 ASSERT_TRUE(b1.parse("v1:1.2.3.5:567/8"));
320 ASSERT_TRUE(b2.parse("v2:1.2.3.5:567/8"));
321 entity_addrvec_t bv1(b1);
322 entity_addrvec_t bv21;
323 bv21.v.push_back(b2);
324 bv21.v.push_back(b1);
325 ASSERT_TRUE(bv1.legacy_equals(bv21));
326 ASSERT_TRUE(bv21.legacy_equals(bv1));
327
328 ASSERT_FALSE(av1.legacy_equals(bv1));
329 ASSERT_FALSE(av21.legacy_equals(bv21));
330 ASSERT_FALSE(av21.legacy_equals(bv1));
331 ASSERT_FALSE(av1.legacy_equals(bv21));
7c673cae 332}