Fix some bugs when testing opensds ansible
[stor4nfv.git] / src / 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 }