Fix some bugs when testing opensds ansible
[stor4nfv.git] / src / ceph / src / test / mon / test_mon_types.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) 2012 Inktank
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 #include <iostream>
15 #include "mon/mon_types.h"
16
17 #include "gtest/gtest.h"
18
19 TEST(mon_features, supported_v_persistent) {
20
21   mon_feature_t supported = ceph::features::mon::get_supported();
22   mon_feature_t persistent = ceph::features::mon::get_persistent();
23
24   ASSERT_EQ(supported.intersection(persistent), persistent);
25   ASSERT_TRUE(supported.contains_all(persistent));
26
27   mon_feature_t diff = supported.diff(persistent);
28   ASSERT_TRUE((persistent | diff) == supported);
29   ASSERT_TRUE((supported & persistent) == persistent);
30 }
31
32 TEST(mon_features, binary_ops) {
33
34   mon_feature_t FEATURE_NONE(0ULL);
35   mon_feature_t FEATURE_A((1ULL << 1));
36   mon_feature_t FEATURE_B((1ULL << 2));
37   mon_feature_t FEATURE_C((1ULL << 3));
38   mon_feature_t FEATURE_D((1ULL << 4));
39
40   mon_feature_t FEATURE_ALL(
41       FEATURE_A | FEATURE_B |
42       FEATURE_C | FEATURE_D
43   );
44
45   mon_feature_t foo(FEATURE_A|FEATURE_B);
46   mon_feature_t bar(FEATURE_C|FEATURE_D);
47
48   ASSERT_EQ(FEATURE_A|FEATURE_B, foo);
49   ASSERT_EQ(FEATURE_C|FEATURE_D, bar);
50
51   ASSERT_NE(FEATURE_C, foo);
52   ASSERT_NE(FEATURE_B, bar);
53   ASSERT_NE(FEATURE_NONE, foo);
54   ASSERT_NE(FEATURE_NONE, bar);
55
56   ASSERT_FALSE(foo.empty());
57   ASSERT_FALSE(bar.empty());
58   ASSERT_TRUE(FEATURE_NONE.empty());
59
60   ASSERT_EQ(FEATURE_ALL, (foo ^ bar));
61   ASSERT_EQ(FEATURE_NONE, (foo & bar));
62
63   mon_feature_t baz = foo;
64   ASSERT_EQ(baz, foo);
65
66   baz |= bar;
67   ASSERT_EQ(FEATURE_ALL, baz);
68   baz ^= foo;
69   ASSERT_EQ(baz, bar);
70
71   baz |= FEATURE_A;
72   ASSERT_EQ(FEATURE_C, baz & FEATURE_C);
73   ASSERT_EQ((FEATURE_A|FEATURE_D), baz & (FEATURE_A|FEATURE_D));
74   ASSERT_EQ(FEATURE_B|FEATURE_C|FEATURE_D, (baz ^ foo));
75 }
76
77 TEST(mon_features, set_funcs) {
78
79   mon_feature_t FEATURE_NONE(0ULL);
80   mon_feature_t FEATURE_A((1ULL << 1));
81   mon_feature_t FEATURE_B((1ULL << 2));
82   mon_feature_t FEATURE_C((1ULL << 3));
83   mon_feature_t FEATURE_D((1ULL << 4));
84
85   mon_feature_t FEATURE_ALL(
86       FEATURE_A | FEATURE_B |
87       FEATURE_C | FEATURE_D
88   );
89
90   mon_feature_t foo(FEATURE_A|FEATURE_B);
91   mon_feature_t bar(FEATURE_C|FEATURE_D);
92
93   ASSERT_TRUE(FEATURE_ALL.contains_all(foo));
94   ASSERT_TRUE(FEATURE_ALL.contains_all(bar));
95   ASSERT_TRUE(FEATURE_ALL.contains_all(foo|bar));
96
97   ASSERT_EQ(foo.diff(bar), foo);
98   ASSERT_EQ(bar.diff(foo), bar);
99   ASSERT_EQ(FEATURE_ALL.diff(foo), bar);
100   ASSERT_EQ(FEATURE_ALL.diff(bar), foo);
101
102   ASSERT_TRUE(foo.contains_any(FEATURE_A|bar));
103   ASSERT_TRUE(bar.contains_any(FEATURE_ALL));
104   ASSERT_TRUE(FEATURE_ALL.contains_any(foo));
105
106   mon_feature_t FEATURE_X((1ULL << 10));
107
108   ASSERT_FALSE(FEATURE_ALL.contains_any(FEATURE_X));
109   ASSERT_FALSE(FEATURE_ALL.contains_all(FEATURE_X));
110   ASSERT_EQ(FEATURE_ALL.diff(FEATURE_X), FEATURE_ALL);
111
112   ASSERT_EQ(foo.intersection(FEATURE_ALL), foo);
113   ASSERT_EQ(bar.intersection(FEATURE_ALL), bar);
114 }
115
116 TEST(mon_features, set_unset) {
117
118   mon_feature_t FEATURE_A((1ULL << 1));
119   mon_feature_t FEATURE_B((1ULL << 2));
120   mon_feature_t FEATURE_C((1ULL << 3));
121
122   mon_feature_t foo;
123   ASSERT_EQ(ceph::features::mon::FEATURE_NONE, foo);
124
125   foo.set_feature(FEATURE_A);
126   ASSERT_EQ(FEATURE_A, foo);
127   ASSERT_TRUE(foo.contains_all(FEATURE_A));
128
129   foo.set_feature(FEATURE_B|FEATURE_C);
130   ASSERT_EQ((FEATURE_A|FEATURE_B|FEATURE_C), foo);
131   ASSERT_TRUE(foo.contains_all((FEATURE_A|FEATURE_B|FEATURE_C)));
132
133   foo.unset_feature(FEATURE_A);
134   ASSERT_EQ((FEATURE_B|FEATURE_C), foo);
135   ASSERT_FALSE(foo.contains_any(FEATURE_A));
136   ASSERT_TRUE(foo.contains_all((FEATURE_B|FEATURE_C)));
137
138   foo.unset_feature(FEATURE_B|FEATURE_C);
139   ASSERT_EQ(ceph::features::mon::FEATURE_NONE, foo);
140   ASSERT_FALSE(foo.contains_any(FEATURE_A|FEATURE_B|FEATURE_C));
141 }