]> git.proxmox.com Git - ceph.git/blob - ceph/src/test/mon/test_mon_types.cc
update sources to ceph Nautilus 14.2.1
[ceph.git] / 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_A((1ULL << 1));
80 mon_feature_t FEATURE_B((1ULL << 2));
81 mon_feature_t FEATURE_C((1ULL << 3));
82 mon_feature_t FEATURE_D((1ULL << 4));
83
84 mon_feature_t FEATURE_ALL(
85 FEATURE_A | FEATURE_B |
86 FEATURE_C | FEATURE_D
87 );
88
89 mon_feature_t foo(FEATURE_A|FEATURE_B);
90 mon_feature_t bar(FEATURE_C|FEATURE_D);
91
92 ASSERT_TRUE(FEATURE_ALL.contains_all(foo));
93 ASSERT_TRUE(FEATURE_ALL.contains_all(bar));
94 ASSERT_TRUE(FEATURE_ALL.contains_all(foo|bar));
95
96 ASSERT_EQ(foo.diff(bar), foo);
97 ASSERT_EQ(bar.diff(foo), bar);
98 ASSERT_EQ(FEATURE_ALL.diff(foo), bar);
99 ASSERT_EQ(FEATURE_ALL.diff(bar), foo);
100
101 ASSERT_TRUE(foo.contains_any(FEATURE_A|bar));
102 ASSERT_TRUE(bar.contains_any(FEATURE_ALL));
103 ASSERT_TRUE(FEATURE_ALL.contains_any(foo));
104
105 mon_feature_t FEATURE_X((1ULL << 10));
106
107 ASSERT_FALSE(FEATURE_ALL.contains_any(FEATURE_X));
108 ASSERT_FALSE(FEATURE_ALL.contains_all(FEATURE_X));
109 ASSERT_EQ(FEATURE_ALL.diff(FEATURE_X), FEATURE_ALL);
110
111 ASSERT_EQ(foo.intersection(FEATURE_ALL), foo);
112 ASSERT_EQ(bar.intersection(FEATURE_ALL), bar);
113 }
114
115 TEST(mon_features, set_unset) {
116
117 mon_feature_t FEATURE_A((1ULL << 1));
118 mon_feature_t FEATURE_B((1ULL << 2));
119 mon_feature_t FEATURE_C((1ULL << 3));
120
121 mon_feature_t foo;
122 ASSERT_EQ(ceph::features::mon::FEATURE_NONE, foo);
123
124 foo.set_feature(FEATURE_A);
125 ASSERT_EQ(FEATURE_A, foo);
126 ASSERT_TRUE(foo.contains_all(FEATURE_A));
127
128 foo.set_feature(FEATURE_B|FEATURE_C);
129 ASSERT_EQ((FEATURE_A|FEATURE_B|FEATURE_C), foo);
130 ASSERT_TRUE(foo.contains_all((FEATURE_A|FEATURE_B|FEATURE_C)));
131
132 foo.unset_feature(FEATURE_A);
133 ASSERT_EQ((FEATURE_B|FEATURE_C), foo);
134 ASSERT_FALSE(foo.contains_any(FEATURE_A));
135 ASSERT_TRUE(foo.contains_all((FEATURE_B|FEATURE_C)));
136
137 foo.unset_feature(FEATURE_B|FEATURE_C);
138 ASSERT_EQ(ceph::features::mon::FEATURE_NONE, foo);
139 ASSERT_FALSE(foo.contains_any(FEATURE_A|FEATURE_B|FEATURE_C));
140 }