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");