]>
git.proxmox.com Git - ceph.git/blob - 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
4 * Ceph - scalable distributed file system
6 * Copyright (C) 2011 New Dream Network
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.
21 #include <boost/scoped_ptr.hpp>
24 #include "include/types.h"
25 #include "include/compat.h"
26 #include "include/coredumpctl.h"
29 //#define assert(foo) if (!(foo)) abort();
31 #include "include/CompatSet.h"
33 #include "gtest/gtest.h"
36 TEST(CephCompatSet
, AllSet
) {
37 CompatSet::FeatureSet compat
;
38 CompatSet::FeatureSet ro
;
39 CompatSet::FeatureSet incompat
;
43 EXPECT_DEATH(compat
.insert(CompatSet::Feature(0, "test")), "");
44 EXPECT_DEATH(compat
.insert(CompatSet::Feature(64, "test")), "");
47 for (int i
= 1; i
< 64; i
++) {
49 cname
<< string("c") << i
;
50 compat
.insert(CompatSet::Feature(i
,cname
.str().c_str()));
52 roname
<< string("r") << i
;
53 ro
.insert(CompatSet::Feature(i
,roname
.str().c_str()));
55 iname
<< string("i") << i
;
56 incompat
.insert(CompatSet::Feature(i
,iname
.str().c_str()));
58 CompatSet
tcs(compat
, ro
, incompat
);
60 //cout << tcs << std::endl;
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);
68 for (int i
= 1; i
< 64; i
++) {
69 EXPECT_TRUE(tcs
.compat
.contains(i
));
71 cname
<< string("c") << i
;
72 EXPECT_TRUE(tcs
.compat
.contains(CompatSet::Feature(i
,cname
.str().c_str())));
75 EXPECT_TRUE(tcs
.ro_compat
.contains(i
));
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
);
81 EXPECT_TRUE(tcs
.incompat
.contains(i
));
83 iname
<< string("i") << i
;
84 EXPECT_TRUE(tcs
.incompat
.contains(CompatSet::Feature(i
,iname
.str().c_str())));
85 tcs
.incompat
.remove(i
);
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());
97 TEST(CephCompatSet
, other
) {
98 CompatSet s1
, s2
, s1dup
;
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"));
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"));
114 EXPECT_EQ(s1
.compare(s1dup
), 0);
117 EXPECT_EQ(s1
.compare(s2
), 1);
119 //Check missing features
120 EXPECT_EQ(s2
.compare(s1
), -1);
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);
128 s3
.incompat
.insert(CompatSet::Feature(4, "i4"));
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);
136 TEST(CephCompatSet
, merge
) {
137 CompatSet s1
, s2
, s1dup
, s2dup
;
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"));
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"));
155 //Nothing to merge if they are the same
156 EXPECT_FALSE(s1
.merge(s1dup
));
157 EXPECT_FALSE(s2
.merge(s2dup
));
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);
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);