]> git.proxmox.com Git - ceph.git/blob - ceph/src/test/ceph_compatset.cc
add subtree-ish sources for 12.0.3
[ceph.git] / ceph / src / test / ceph_compatset.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) 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 Lesser General Public
10 * License version 2.1, as published by the Free Software
11 * Foundation. See file COPYING.
12 *
13 */
14
15 #include <fstream>
16 #include <iostream>
17 #include <errno.h>
18 #include <sys/stat.h>
19 #include <signal.h>
20 #include <ctype.h>
21 #include <boost/scoped_ptr.hpp>
22 #include <string>
23
24 #include "include/types.h"
25 #include "include/compat.h"
26 #include "include/coredumpctl.h"
27
28 //#undef assert
29 //#define assert(foo) if (!(foo)) abort();
30
31 #include "include/CompatSet.h"
32
33 #include "gtest/gtest.h"
34 #include <vector>
35
36 TEST(CephCompatSet, AllSet) {
37 CompatSet::FeatureSet compat;
38 CompatSet::FeatureSet ro;
39 CompatSet::FeatureSet incompat;
40
41 {
42 PrCtl unset_dumpable;
43 EXPECT_DEATH(compat.insert(CompatSet::Feature(0, "test")), "");
44 EXPECT_DEATH(compat.insert(CompatSet::Feature(64, "test")), "");
45 }
46
47 for (int i = 1; i < 64; i++) {
48 stringstream cname;
49 cname << string("c") << i;
50 compat.insert(CompatSet::Feature(i,cname.str().c_str()));
51 stringstream roname;
52 roname << string("r") << i;
53 ro.insert(CompatSet::Feature(i,roname.str().c_str()));
54 stringstream iname;
55 iname << string("i") << i;
56 incompat.insert(CompatSet::Feature(i,iname.str().c_str()));
57 }
58 CompatSet tcs(compat, ro, incompat);
59
60 //cout << tcs << std::endl;
61
62 //Due to a workaround for a bug bit 0 is always set even though it is
63 //not a legal feature.
64 EXPECT_EQ(tcs.compat.mask, (uint64_t)0xffffffffffffffff);
65 EXPECT_EQ(tcs.ro_compat.mask, (uint64_t)0xffffffffffffffff);
66 EXPECT_EQ(tcs.incompat.mask, (uint64_t)0xffffffffffffffff);
67
68 for (int i = 1; i < 64; i++) {
69 EXPECT_TRUE(tcs.compat.contains(i));
70 stringstream cname;
71 cname << string("c") << i;
72 EXPECT_TRUE(tcs.compat.contains(CompatSet::Feature(i,cname.str().c_str())));
73 tcs.compat.remove(i);
74
75 EXPECT_TRUE(tcs.ro_compat.contains(i));
76 stringstream roname;
77 roname << string("r") << i;
78 EXPECT_TRUE(tcs.ro_compat.contains(CompatSet::Feature(i,roname.str().c_str())));
79 tcs.ro_compat.remove(i);
80
81 EXPECT_TRUE(tcs.incompat.contains(i));
82 stringstream iname;
83 iname << string("i") << i;
84 EXPECT_TRUE(tcs.incompat.contains(CompatSet::Feature(i,iname.str().c_str())));
85 tcs.incompat.remove(i);
86 }
87 //Due to a workaround for a bug bit 0 is always set even though it is
88 //not a legal feature.
89 EXPECT_EQ(tcs.compat.mask, (uint64_t)1);
90 EXPECT_TRUE(tcs.compat.names.empty());
91 EXPECT_EQ(tcs.ro_compat.mask, (uint64_t)1);
92 EXPECT_TRUE(tcs.ro_compat.names.empty());
93 EXPECT_EQ(tcs.incompat.mask, (uint64_t)1);
94 EXPECT_TRUE(tcs.incompat.names.empty());
95 }
96
97 TEST(CephCompatSet, other) {
98 CompatSet s1, s2, s1dup;
99
100 s1.compat.insert(CompatSet::Feature(1, "c1"));
101 s1.compat.insert(CompatSet::Feature(2, "c2"));
102 s1.compat.insert(CompatSet::Feature(32, "c32"));
103 s1.ro_compat.insert(CompatSet::Feature(63, "r63"));
104 s1.incompat.insert(CompatSet::Feature(1, "i1"));
105
106 s2.compat.insert(CompatSet::Feature(1, "c1"));
107 s2.compat.insert(CompatSet::Feature(32, "c32"));
108 s2.ro_compat.insert(CompatSet::Feature(63, "r63"));
109 s2.incompat.insert(CompatSet::Feature(1, "i1"));
110
111 s1dup = s1;
112
113 //Check exact match
114 EXPECT_EQ(s1.compare(s1dup), 0);
115
116 //Check superset
117 EXPECT_EQ(s1.compare(s2), 1);
118
119 //Check missing features
120 EXPECT_EQ(s2.compare(s1), -1);
121
122 CompatSet diff = s2.unsupported(s1);
123 EXPECT_EQ(diff.compat.mask, (uint64_t)1<<2 | 1);
124 EXPECT_EQ(diff.ro_compat.mask, (uint64_t)1);
125 EXPECT_EQ(diff.incompat.mask, (uint64_t)1);
126
127 CompatSet s3 = s1;
128 s3.incompat.insert(CompatSet::Feature(4, "i4"));
129
130 diff = s1.unsupported(s3);
131 EXPECT_EQ(diff.compat.mask, (uint64_t)1);
132 EXPECT_EQ(diff.ro_compat.mask, (uint64_t)1);
133 EXPECT_EQ(diff.incompat.mask, (uint64_t)1<<4 | 1);
134 }
135
136 TEST(CephCompatSet, merge) {
137 CompatSet s1, s2, s1dup, s2dup;
138
139 s1.compat.insert(CompatSet::Feature(1, "c1"));
140 s1.compat.insert(CompatSet::Feature(2, "c2"));
141 s1.compat.insert(CompatSet::Feature(32, "c32"));
142 s1.ro_compat.insert(CompatSet::Feature(63, "r63"));
143 s1.incompat.insert(CompatSet::Feature(1, "i1"));
144
145 s1dup = s1;
146
147 s2.compat.insert(CompatSet::Feature(1, "c1"));
148 s2.compat.insert(CompatSet::Feature(32, "c32"));
149 s2.ro_compat.insert(CompatSet::Feature(1, "r1"));
150 s2.ro_compat.insert(CompatSet::Feature(63, "r63"));
151 s2.incompat.insert(CompatSet::Feature(1, "i1"));
152
153 s2dup = s2;
154
155 //Nothing to merge if they are the same
156 EXPECT_FALSE(s1.merge(s1dup));
157 EXPECT_FALSE(s2.merge(s2dup));
158
159 EXPECT_TRUE(s1.merge(s2));
160 EXPECT_EQ(s1.compat.mask, (uint64_t)1<<1 | (uint64_t)1<<2 | (uint64_t)1<<32 | 1);
161 EXPECT_EQ(s1.ro_compat.mask, (uint64_t)1<<1 | (uint64_t)1<<63 | 1);
162 EXPECT_EQ(s1.incompat.mask, (uint64_t)1<<1 | 1);
163
164 EXPECT_TRUE(s2.merge(s1dup));
165 EXPECT_EQ(s2.compat.mask, (uint64_t)1<<1 | (uint64_t)1<<2 | (uint64_t)1<<32 | 1);
166 EXPECT_EQ(s2.ro_compat.mask, (uint64_t)1<<1 | (uint64_t)1<<63 | 1);
167 EXPECT_EQ(s2.incompat.mask, (uint64_t)1<<1 | 1);
168 }