Re-sync with internal repository
[hiphop-php.git] / third-party / thrift / src / thrift / lib / cpp2 / test / ServerAttributeTest.cpp
blob6f051201b85719d1e68b53cc224e42f8a939c5b3
1 /*
2 * Copyright (c) Meta Platforms, Inc. and affiliates.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
17 #include <thrift/lib/cpp2/server/ServerAttribute.h>
19 #include <folly/experimental/observer/Observer.h>
20 #include <folly/portability/GTest.h>
22 using namespace apache::thrift;
24 TEST(ServerAttributeDynamic, BaselineFirst) {
25 ServerAttributeDynamic<int> a{0};
26 EXPECT_EQ(a.get(), 0);
27 folly::observer::SimpleObservable<std::optional<int>> baselineObservable{1};
28 folly::observer::SimpleObservable<std::optional<int>> overrideObservable{2};
29 a.set(baselineObservable.getObserver(), AttributeSource::BASELINE);
30 folly::observer_detail::ObserverManager::waitForAllUpdates();
31 EXPECT_EQ(a.get(), 1);
32 a.set(overrideObservable.getObserver(), AttributeSource::OVERRIDE);
33 EXPECT_EQ(a.get(), 2);
34 overrideObservable.setValue(std::nullopt);
35 folly::observer_detail::ObserverManager::waitForAllUpdates();
36 EXPECT_EQ(a.get(), 1);
38 baselineObservable.setValue(std::nullopt);
39 folly::observer_detail::ObserverManager::waitForAllUpdates();
40 EXPECT_EQ(a.get(), 0);
43 TEST(ServerAttributeDynamic, OverrideFirst) {
44 ServerAttributeDynamic<int> a{0};
45 EXPECT_EQ(a.get(), 0);
46 folly::observer::SimpleObservable<std::optional<int>> baselineObservable{1};
47 folly::observer::SimpleObservable<std::optional<int>> overrideObservable{2};
48 a.set(overrideObservable.getObserver(), AttributeSource::OVERRIDE);
49 folly::observer_detail::ObserverManager::waitForAllUpdates();
50 EXPECT_EQ(a.get(), 2);
51 a.set(baselineObservable.getObserver(), AttributeSource::BASELINE);
52 folly::observer_detail::ObserverManager::waitForAllUpdates();
53 // still return overrided value
54 EXPECT_EQ(a.get(), 2);
55 baselineObservable.setValue(std::nullopt);
56 folly::observer_detail::ObserverManager::waitForAllUpdates();
57 // still return overrided value
58 EXPECT_EQ(a.get(), 2);
59 overrideObservable.setValue(std::nullopt);
60 folly::observer_detail::ObserverManager::waitForAllUpdates();
61 EXPECT_EQ(a.get(), 0);
64 TEST(ServerAttributeDynamic, StringBaselineFirst) {
65 ServerAttributeDynamic<std::string> a{"a"};
66 EXPECT_EQ(a.get(), "a");
67 folly::observer::SimpleObservable<std::optional<std::string>>
68 baselineObservable{"b"};
69 folly::observer::SimpleObservable<std::optional<std::string>>
70 overrideObservable{"c"};
71 a.set(baselineObservable.getObserver(), AttributeSource::BASELINE);
72 folly::observer_detail::ObserverManager::waitForAllUpdates();
73 EXPECT_EQ(a.get(), "b");
74 a.set(overrideObservable.getObserver(), AttributeSource::OVERRIDE);
75 folly::observer_detail::ObserverManager::waitForAllUpdates();
76 EXPECT_EQ(a.get(), "c");
78 overrideObservable.setValue(std::nullopt);
79 folly::observer_detail::ObserverManager::waitForAllUpdates();
80 EXPECT_EQ(a.get(), "b");
81 baselineObservable.setValue(std::nullopt);
82 folly::observer_detail::ObserverManager::waitForAllUpdates();
83 EXPECT_EQ(a.get(), "a");
86 TEST(ServerAttributeDynamic, StringOverrideFirst) {
87 ServerAttributeDynamic<std::string> a{"a"};
88 EXPECT_EQ(a.get(), "a");
89 folly::observer::SimpleObservable<std::optional<std::string>>
90 baselineObservable{"b"};
91 folly::observer::SimpleObservable<std::optional<std::string>>
92 overrideObservable{"c"};
94 a.set(overrideObservable.getObserver(), AttributeSource::OVERRIDE);
95 folly::observer_detail::ObserverManager::waitForAllUpdates();
96 EXPECT_EQ(a.get(), "c");
97 a.set(baselineObservable.getObserver(), AttributeSource::BASELINE);
98 folly::observer_detail::ObserverManager::waitForAllUpdates();
99 // still return overrided value
100 EXPECT_EQ(a.get(), "c");
102 baselineObservable.setValue(std::nullopt);
103 folly::observer_detail::ObserverManager::waitForAllUpdates();
104 // still return overrided value
105 EXPECT_EQ(a.get(), "c");
106 overrideObservable.setValue(std::nullopt);
107 folly::observer_detail::ObserverManager::waitForAllUpdates();
108 EXPECT_EQ(a.get(), "a");
111 TEST(ServerAttributeDynamic, setDefault) {
112 ServerAttributeDynamic<int> a{0};
113 EXPECT_EQ(a.get(), 0);
114 folly::observer::SimpleObservable<std::optional<int>> baselineObservable{1};
115 folly::observer::SimpleObservable<std::optional<int>> overrideObservable{2};
116 folly::observer::SimpleObservable<int> defaultVal{3};
118 a.set(baselineObservable.getObserver(), AttributeSource::BASELINE);
119 folly::observer_detail::ObserverManager::waitForAllUpdates();
120 EXPECT_EQ(a.get(), 1);
121 a.set(overrideObservable.getObserver(), AttributeSource::OVERRIDE);
122 folly::observer_detail::ObserverManager::waitForAllUpdates();
123 EXPECT_EQ(a.get(), 2);
125 // update the default to 3 instead of 0
126 a.setDefault(defaultVal.getObserver());
128 // still gets override value
129 EXPECT_EQ(a.get(), 2);
131 overrideObservable.setValue(std::nullopt);
132 folly::observer_detail::ObserverManager::waitForAllUpdates();
133 EXPECT_EQ(a.get(), 1);
134 baselineObservable.setValue(std::nullopt);
135 folly::observer_detail::ObserverManager::waitForAllUpdates();
136 // should return the new set default value
137 EXPECT_EQ(a.get(), 3);
140 TEST(ServerAttributeDynamic, Observable) {
141 folly::observer::SimpleObservable<std::string> defaultObservable{"default"};
142 folly::observer::SimpleObservable<std::optional<std::string>>
143 baselineObservable{"baseline"};
144 folly::observer::SimpleObservable<std::optional<std::string>>
145 overrideObservable{"override"};
147 apache::thrift::detail::ServerAttributeObservable<std::string> attr{
148 defaultObservable.getObserver()};
149 auto observer = attr.getObserver();
151 attr.set(baselineObservable.getObserver(), AttributeSource::BASELINE);
152 folly::observer_detail::ObserverManager::waitForAllUpdates();
153 EXPECT_EQ(**observer, "baseline");
155 attr.set(overrideObservable.getObserver(), AttributeSource::OVERRIDE);
156 EXPECT_EQ(**observer, "override");
158 overrideObservable.setValue("override 2");
159 folly::observer_detail::ObserverManager::waitForAllUpdates();
160 EXPECT_EQ(**observer, "override 2");
162 baselineObservable.setValue("baseline 2");
163 overrideObservable.setValue(std::nullopt);
164 folly::observer_detail::ObserverManager::waitForAllUpdates();
166 EXPECT_EQ(**observer, "baseline 2");
167 baselineObservable.setValue("baseline 3");
168 folly::observer_detail::ObserverManager::waitForAllUpdates();
169 EXPECT_EQ(**observer, "baseline 3");
171 defaultObservable.setValue("default 2");
172 baselineObservable.setValue(std::nullopt);
173 folly::observer_detail::ObserverManager::waitForAllUpdates();
174 EXPECT_EQ(**observer, "default 2");
177 TEST(ServerAttributeDynamic, Atomic) {
178 ServerAttributeAtomic<int> attr{42};
179 folly::observer::SimpleObservable<std::optional<int>> baselineObservable{24};
180 folly::observer::SimpleObservable<std::optional<int>> overrideObservable{12};
181 auto observer = attr.getAtomicObserver();
182 EXPECT_EQ(*observer, 42);
184 attr.set(baselineObservable.getObserver(), AttributeSource::BASELINE);
185 folly::observer_detail::ObserverManager::waitForAllUpdates();
186 EXPECT_EQ(*observer, 24);
188 attr.set(overrideObservable.getObserver(), AttributeSource::OVERRIDE);
189 folly::observer_detail::ObserverManager::waitForAllUpdates();
190 EXPECT_EQ(*observer, 12);
192 overrideObservable.setValue(std::nullopt);
193 folly::observer_detail::ObserverManager::waitForAllUpdates();
194 EXPECT_EQ(*observer, 24);
197 TEST(ServerAttributeDynamic, ThreadLocal) {
198 ServerAttributeThreadLocal<int> attr{42};
199 folly::observer::SimpleObservable<std::optional<int>> baselineObservable{24};
200 folly::observer::SimpleObservable<std::optional<int>> overrideObservable{12};
201 auto observer = attr.getTLObserver();
202 EXPECT_EQ(**observer, 42);
204 attr.set(baselineObservable.getObserver(), AttributeSource::BASELINE);
205 folly::observer_detail::ObserverManager::waitForAllUpdates();
206 EXPECT_EQ(**observer, 24);
208 attr.set(overrideObservable.getObserver(), AttributeSource::OVERRIDE);
209 EXPECT_EQ(**observer, 12);
211 overrideObservable.setValue(std::nullopt);
212 folly::observer_detail::ObserverManager::waitForAllUpdates();
213 EXPECT_EQ(**observer, 24);
216 TEST(ServerAttributeStatic, Basic) {
217 ServerAttributeStatic<std::string> attr{"default"};
218 EXPECT_EQ(attr.get(), "default");
220 attr.set("baseline", AttributeSource::BASELINE);
221 EXPECT_EQ(attr.get(), "baseline");
222 attr.set("override", AttributeSource::OVERRIDE);
223 EXPECT_EQ(attr.get(), "override");
225 attr.reset(AttributeSource::OVERRIDE);
226 EXPECT_EQ(attr.get(), "baseline");
227 attr.reset(AttributeSource::BASELINE);
228 EXPECT_EQ(attr.get(), "default");
230 attr.set("override", AttributeSource::OVERRIDE);
231 EXPECT_EQ(attr.get(), "override");
232 attr.set("baseline", AttributeSource::BASELINE);
233 EXPECT_EQ(attr.get(), "override");
234 attr.reset(AttributeSource::BASELINE);
235 EXPECT_EQ(attr.get(), "override");
237 attr.reset(AttributeSource::OVERRIDE);
238 EXPECT_EQ(attr.get(), "default");