]>
git.proxmox.com Git - ceph.git/blob - 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
4 * Ceph - scalable distributed file system
6 * Copyright (C) 2012 Inktank
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.
15 #include "mon/mon_types.h"
17 #include "gtest/gtest.h"
19 TEST(mon_features
, supported_v_persistent
) {
21 mon_feature_t supported
= ceph::features::mon::get_supported();
22 mon_feature_t persistent
= ceph::features::mon::get_persistent();
24 ASSERT_EQ(supported
.intersection(persistent
), persistent
);
25 ASSERT_TRUE(supported
.contains_all(persistent
));
27 mon_feature_t diff
= supported
.diff(persistent
);
28 ASSERT_TRUE((persistent
| diff
) == supported
);
29 ASSERT_TRUE((supported
& persistent
) == persistent
);
32 TEST(mon_features
, binary_ops
) {
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));
40 mon_feature_t
FEATURE_ALL(
41 FEATURE_A
| FEATURE_B
|
45 mon_feature_t
foo(FEATURE_A
|FEATURE_B
);
46 mon_feature_t
bar(FEATURE_C
|FEATURE_D
);
48 ASSERT_EQ(FEATURE_A
|FEATURE_B
, foo
);
49 ASSERT_EQ(FEATURE_C
|FEATURE_D
, bar
);
51 ASSERT_NE(FEATURE_C
, foo
);
52 ASSERT_NE(FEATURE_B
, bar
);
53 ASSERT_NE(FEATURE_NONE
, foo
);
54 ASSERT_NE(FEATURE_NONE
, bar
);
56 ASSERT_FALSE(foo
.empty());
57 ASSERT_FALSE(bar
.empty());
58 ASSERT_TRUE(FEATURE_NONE
.empty());
60 ASSERT_EQ(FEATURE_ALL
, (foo
^ bar
));
61 ASSERT_EQ(FEATURE_NONE
, (foo
& bar
));
63 mon_feature_t baz
= foo
;
67 ASSERT_EQ(FEATURE_ALL
, baz
);
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
));
77 TEST(mon_features
, set_funcs
) {
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));
84 mon_feature_t
FEATURE_ALL(
85 FEATURE_A
| FEATURE_B
|
89 mon_feature_t
foo(FEATURE_A
|FEATURE_B
);
90 mon_feature_t
bar(FEATURE_C
|FEATURE_D
);
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
));
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
);
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
));
105 mon_feature_t
FEATURE_X((1ULL << 10));
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
);
111 ASSERT_EQ(foo
.intersection(FEATURE_ALL
), foo
);
112 ASSERT_EQ(bar
.intersection(FEATURE_ALL
), bar
);
115 TEST(mon_features
, set_unset
) {
117 mon_feature_t
FEATURE_A((1ULL << 1));
118 mon_feature_t
FEATURE_B((1ULL << 2));
119 mon_feature_t
FEATURE_C((1ULL << 3));
122 ASSERT_EQ(ceph::features::mon::FEATURE_NONE
, foo
);
124 foo
.set_feature(FEATURE_A
);
125 ASSERT_EQ(FEATURE_A
, foo
);
126 ASSERT_TRUE(foo
.contains_all(FEATURE_A
));
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
)));
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
)));
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
));