1*6777b538SAndroid Build Coastguard Worker // Copyright 2020 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker
5*6777b538SAndroid Build Coastguard Worker #include "base/scoped_observation.h"
6*6777b538SAndroid Build Coastguard Worker
7*6777b538SAndroid Build Coastguard Worker #include "base/containers/contains.h"
8*6777b538SAndroid Build Coastguard Worker #include "base/memory/raw_ptr.h"
9*6777b538SAndroid Build Coastguard Worker #include "base/ranges/algorithm.h"
10*6777b538SAndroid Build Coastguard Worker #include "base/scoped_observation_traits.h"
11*6777b538SAndroid Build Coastguard Worker #include "testing/gtest/include/gtest/gtest.h"
12*6777b538SAndroid Build Coastguard Worker
13*6777b538SAndroid Build Coastguard Worker namespace base {
14*6777b538SAndroid Build Coastguard Worker namespace {
15*6777b538SAndroid Build Coastguard Worker
16*6777b538SAndroid Build Coastguard Worker class TestSourceObserver {
17*6777b538SAndroid Build Coastguard Worker public:
18*6777b538SAndroid Build Coastguard Worker virtual ~TestSourceObserver() = default;
19*6777b538SAndroid Build Coastguard Worker };
20*6777b538SAndroid Build Coastguard Worker
21*6777b538SAndroid Build Coastguard Worker class TestSource {
22*6777b538SAndroid Build Coastguard Worker public:
23*6777b538SAndroid Build Coastguard Worker void AddObserver(TestSourceObserver* observer);
24*6777b538SAndroid Build Coastguard Worker void RemoveObserver(TestSourceObserver* observer);
25*6777b538SAndroid Build Coastguard Worker
26*6777b538SAndroid Build Coastguard Worker bool HasObserver(TestSourceObserver* observer) const;
num_observers() const27*6777b538SAndroid Build Coastguard Worker size_t num_observers() const { return observers_.size(); }
28*6777b538SAndroid Build Coastguard Worker
29*6777b538SAndroid Build Coastguard Worker private:
30*6777b538SAndroid Build Coastguard Worker std::vector<raw_ptr<TestSourceObserver, VectorExperimental>> observers_;
31*6777b538SAndroid Build Coastguard Worker };
32*6777b538SAndroid Build Coastguard Worker
AddObserver(TestSourceObserver * observer)33*6777b538SAndroid Build Coastguard Worker void TestSource::AddObserver(TestSourceObserver* observer) {
34*6777b538SAndroid Build Coastguard Worker observers_.push_back(observer);
35*6777b538SAndroid Build Coastguard Worker }
36*6777b538SAndroid Build Coastguard Worker
RemoveObserver(TestSourceObserver * observer)37*6777b538SAndroid Build Coastguard Worker void TestSource::RemoveObserver(TestSourceObserver* observer) {
38*6777b538SAndroid Build Coastguard Worker auto it = base::ranges::find(observers_, observer);
39*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(it != observers_.end());
40*6777b538SAndroid Build Coastguard Worker observers_.erase(it);
41*6777b538SAndroid Build Coastguard Worker }
42*6777b538SAndroid Build Coastguard Worker
HasObserver(TestSourceObserver * observer) const43*6777b538SAndroid Build Coastguard Worker bool TestSource::HasObserver(TestSourceObserver* observer) const {
44*6777b538SAndroid Build Coastguard Worker return base::Contains(observers_, observer);
45*6777b538SAndroid Build Coastguard Worker }
46*6777b538SAndroid Build Coastguard Worker
47*6777b538SAndroid Build Coastguard Worker using TestScopedObservation = ScopedObservation<TestSource, TestSourceObserver>;
48*6777b538SAndroid Build Coastguard Worker
49*6777b538SAndroid Build Coastguard Worker } // namespace
50*6777b538SAndroid Build Coastguard Worker
TEST(ScopedObservationTest,RemovesObservationOnDestruction)51*6777b538SAndroid Build Coastguard Worker TEST(ScopedObservationTest, RemovesObservationOnDestruction) {
52*6777b538SAndroid Build Coastguard Worker TestSource s1;
53*6777b538SAndroid Build Coastguard Worker
54*6777b538SAndroid Build Coastguard Worker {
55*6777b538SAndroid Build Coastguard Worker TestSourceObserver o1;
56*6777b538SAndroid Build Coastguard Worker TestScopedObservation obs(&o1);
57*6777b538SAndroid Build Coastguard Worker const TestScopedObservation& cobs = obs;
58*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(0u, s1.num_observers());
59*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(s1.HasObserver(&o1));
60*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(obs.GetSource(), nullptr);
61*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(cobs.GetSource(), nullptr);
62*6777b538SAndroid Build Coastguard Worker
63*6777b538SAndroid Build Coastguard Worker obs.Observe(&s1);
64*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(1u, s1.num_observers());
65*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(s1.HasObserver(&o1));
66*6777b538SAndroid Build Coastguard Worker TestSource* const got_source = obs.GetSource();
67*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(got_source, &s1);
68*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(cobs.GetSource(), &s1);
69*6777b538SAndroid Build Coastguard Worker }
70*6777b538SAndroid Build Coastguard Worker
71*6777b538SAndroid Build Coastguard Worker // Test that the observation is removed when it goes out of scope.
72*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(0u, s1.num_observers());
73*6777b538SAndroid Build Coastguard Worker }
74*6777b538SAndroid Build Coastguard Worker
TEST(ScopedObservationTest,Reset)75*6777b538SAndroid Build Coastguard Worker TEST(ScopedObservationTest, Reset) {
76*6777b538SAndroid Build Coastguard Worker TestSource s1;
77*6777b538SAndroid Build Coastguard Worker TestSourceObserver o1;
78*6777b538SAndroid Build Coastguard Worker TestScopedObservation obs(&o1);
79*6777b538SAndroid Build Coastguard Worker const TestScopedObservation& cobs = obs;
80*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(0u, s1.num_observers());
81*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(obs.GetSource(), nullptr);
82*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(cobs.GetSource(), nullptr);
83*6777b538SAndroid Build Coastguard Worker obs.Reset();
84*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(obs.GetSource(), nullptr);
85*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(cobs.GetSource(), nullptr);
86*6777b538SAndroid Build Coastguard Worker
87*6777b538SAndroid Build Coastguard Worker obs.Observe(&s1);
88*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(1u, s1.num_observers());
89*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(s1.HasObserver(&o1));
90*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(obs.GetSource(), &s1);
91*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(cobs.GetSource(), &s1);
92*6777b538SAndroid Build Coastguard Worker
93*6777b538SAndroid Build Coastguard Worker obs.Reset();
94*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(0u, s1.num_observers());
95*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(obs.GetSource(), nullptr);
96*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(cobs.GetSource(), nullptr);
97*6777b538SAndroid Build Coastguard Worker
98*6777b538SAndroid Build Coastguard Worker // Safe to call with no observation.
99*6777b538SAndroid Build Coastguard Worker obs.Reset();
100*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(0u, s1.num_observers());
101*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(obs.GetSource(), nullptr);
102*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(cobs.GetSource(), nullptr);
103*6777b538SAndroid Build Coastguard Worker }
104*6777b538SAndroid Build Coastguard Worker
TEST(ScopedObservationTest,IsObserving)105*6777b538SAndroid Build Coastguard Worker TEST(ScopedObservationTest, IsObserving) {
106*6777b538SAndroid Build Coastguard Worker TestSource s1;
107*6777b538SAndroid Build Coastguard Worker TestSourceObserver o1;
108*6777b538SAndroid Build Coastguard Worker TestScopedObservation obs(&o1);
109*6777b538SAndroid Build Coastguard Worker const TestScopedObservation& cobs = obs;
110*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(cobs.IsObserving());
111*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(obs.GetSource(), nullptr);
112*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(cobs.GetSource(), nullptr);
113*6777b538SAndroid Build Coastguard Worker
114*6777b538SAndroid Build Coastguard Worker obs.Observe(&s1);
115*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(cobs.IsObserving());
116*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(obs.GetSource(), &s1);
117*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(cobs.GetSource(), &s1);
118*6777b538SAndroid Build Coastguard Worker
119*6777b538SAndroid Build Coastguard Worker obs.Reset();
120*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(cobs.IsObserving());
121*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(obs.GetSource(), nullptr);
122*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(cobs.GetSource(), nullptr);
123*6777b538SAndroid Build Coastguard Worker }
124*6777b538SAndroid Build Coastguard Worker
TEST(ScopedObservationTest,IsObservingSource)125*6777b538SAndroid Build Coastguard Worker TEST(ScopedObservationTest, IsObservingSource) {
126*6777b538SAndroid Build Coastguard Worker TestSource s1;
127*6777b538SAndroid Build Coastguard Worker TestSource s2;
128*6777b538SAndroid Build Coastguard Worker TestSourceObserver o1;
129*6777b538SAndroid Build Coastguard Worker TestScopedObservation obs(&o1);
130*6777b538SAndroid Build Coastguard Worker const TestScopedObservation& cobs = obs;
131*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(cobs.IsObservingSource(&s1));
132*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(cobs.IsObservingSource(&s2));
133*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(obs.GetSource(), nullptr);
134*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(cobs.GetSource(), nullptr);
135*6777b538SAndroid Build Coastguard Worker
136*6777b538SAndroid Build Coastguard Worker obs.Observe(&s1);
137*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(cobs.IsObservingSource(&s1));
138*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(cobs.IsObservingSource(&s2));
139*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(obs.GetSource(), &s1);
140*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(cobs.GetSource(), &s1);
141*6777b538SAndroid Build Coastguard Worker
142*6777b538SAndroid Build Coastguard Worker obs.Reset();
143*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(cobs.IsObservingSource(&s1));
144*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(cobs.IsObservingSource(&s2));
145*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(obs.GetSource(), nullptr);
146*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(cobs.GetSource(), nullptr);
147*6777b538SAndroid Build Coastguard Worker }
148*6777b538SAndroid Build Coastguard Worker
149*6777b538SAndroid Build Coastguard Worker namespace {
150*6777b538SAndroid Build Coastguard Worker
151*6777b538SAndroid Build Coastguard Worker // A test source with oddly named Add/Remove functions.
152*6777b538SAndroid Build Coastguard Worker class TestSourceWithNonDefaultNames {
153*6777b538SAndroid Build Coastguard Worker public:
AddFoo(TestSourceObserver * observer)154*6777b538SAndroid Build Coastguard Worker void AddFoo(TestSourceObserver* observer) { impl_.AddObserver(observer); }
RemoveFoo(TestSourceObserver * observer)155*6777b538SAndroid Build Coastguard Worker void RemoveFoo(TestSourceObserver* observer) {
156*6777b538SAndroid Build Coastguard Worker impl_.RemoveObserver(observer);
157*6777b538SAndroid Build Coastguard Worker }
158*6777b538SAndroid Build Coastguard Worker
impl() const159*6777b538SAndroid Build Coastguard Worker const TestSource& impl() const { return impl_; }
160*6777b538SAndroid Build Coastguard Worker
161*6777b538SAndroid Build Coastguard Worker private:
162*6777b538SAndroid Build Coastguard Worker TestSource impl_;
163*6777b538SAndroid Build Coastguard Worker };
164*6777b538SAndroid Build Coastguard Worker
165*6777b538SAndroid Build Coastguard Worker using TestScopedObservationWithNonDefaultNames =
166*6777b538SAndroid Build Coastguard Worker ScopedObservation<TestSourceWithNonDefaultNames, TestSourceObserver>;
167*6777b538SAndroid Build Coastguard Worker
168*6777b538SAndroid Build Coastguard Worker } // namespace
169*6777b538SAndroid Build Coastguard Worker
170*6777b538SAndroid Build Coastguard Worker template <>
171*6777b538SAndroid Build Coastguard Worker struct ScopedObservationTraits<TestSourceWithNonDefaultNames,
172*6777b538SAndroid Build Coastguard Worker TestSourceObserver> {
AddObserverbase::ScopedObservationTraits173*6777b538SAndroid Build Coastguard Worker static void AddObserver(TestSourceWithNonDefaultNames* source,
174*6777b538SAndroid Build Coastguard Worker TestSourceObserver* observer) {
175*6777b538SAndroid Build Coastguard Worker source->AddFoo(observer);
176*6777b538SAndroid Build Coastguard Worker }
RemoveObserverbase::ScopedObservationTraits177*6777b538SAndroid Build Coastguard Worker static void RemoveObserver(TestSourceWithNonDefaultNames* source,
178*6777b538SAndroid Build Coastguard Worker TestSourceObserver* observer) {
179*6777b538SAndroid Build Coastguard Worker source->RemoveFoo(observer);
180*6777b538SAndroid Build Coastguard Worker }
181*6777b538SAndroid Build Coastguard Worker };
182*6777b538SAndroid Build Coastguard Worker
TEST(ScopedObservationTest,NonDefaultNames)183*6777b538SAndroid Build Coastguard Worker TEST(ScopedObservationTest, NonDefaultNames) {
184*6777b538SAndroid Build Coastguard Worker TestSourceWithNonDefaultNames s1;
185*6777b538SAndroid Build Coastguard Worker TestSourceObserver o1;
186*6777b538SAndroid Build Coastguard Worker
187*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(0u, s1.impl().num_observers());
188*6777b538SAndroid Build Coastguard Worker {
189*6777b538SAndroid Build Coastguard Worker TestScopedObservationWithNonDefaultNames obs(&o1);
190*6777b538SAndroid Build Coastguard Worker obs.Observe(&s1);
191*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(1u, s1.impl().num_observers());
192*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(s1.impl().HasObserver(&o1));
193*6777b538SAndroid Build Coastguard Worker }
194*6777b538SAndroid Build Coastguard Worker
195*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(0u, s1.impl().num_observers());
196*6777b538SAndroid Build Coastguard Worker }
197*6777b538SAndroid Build Coastguard Worker
198*6777b538SAndroid Build Coastguard Worker namespace {
199*6777b538SAndroid Build Coastguard Worker
200*6777b538SAndroid Build Coastguard Worker // A forward-declared test source.
201*6777b538SAndroid Build Coastguard Worker
202*6777b538SAndroid Build Coastguard Worker class TestSourceFwd;
203*6777b538SAndroid Build Coastguard Worker
204*6777b538SAndroid Build Coastguard Worker class ObservationHolder : public TestSourceObserver {
205*6777b538SAndroid Build Coastguard Worker public:
206*6777b538SAndroid Build Coastguard Worker // Declared but not defined since TestSourceFwd is not yet defined.
207*6777b538SAndroid Build Coastguard Worker explicit ObservationHolder(TestSourceFwd* source);
208*6777b538SAndroid Build Coastguard Worker
209*6777b538SAndroid Build Coastguard Worker private:
210*6777b538SAndroid Build Coastguard Worker // ScopedObservation<> is instantiated with a forward-declared parameter.
211*6777b538SAndroid Build Coastguard Worker ScopedObservation<TestSourceFwd, TestSourceObserver> obs_{this};
212*6777b538SAndroid Build Coastguard Worker };
213*6777b538SAndroid Build Coastguard Worker
214*6777b538SAndroid Build Coastguard Worker // TestSourceFwd gets an actual definition!
215*6777b538SAndroid Build Coastguard Worker class TestSourceFwd : public TestSource {};
216*6777b538SAndroid Build Coastguard Worker
217*6777b538SAndroid Build Coastguard Worker // Calling ScopedObservation::Observe() requires an actual definition rather
218*6777b538SAndroid Build Coastguard Worker // than just a forward declaration; make sure it compiles now that there is a
219*6777b538SAndroid Build Coastguard Worker // definition.
ObservationHolder(TestSourceFwd * source)220*6777b538SAndroid Build Coastguard Worker ObservationHolder::ObservationHolder(TestSourceFwd* source) {
221*6777b538SAndroid Build Coastguard Worker obs_.Observe(source);
222*6777b538SAndroid Build Coastguard Worker }
223*6777b538SAndroid Build Coastguard Worker
224*6777b538SAndroid Build Coastguard Worker } // namespace
225*6777b538SAndroid Build Coastguard Worker
TEST(ScopedObservationTest,ForwardDeclaredSource)226*6777b538SAndroid Build Coastguard Worker TEST(ScopedObservationTest, ForwardDeclaredSource) {
227*6777b538SAndroid Build Coastguard Worker TestSourceFwd s;
228*6777b538SAndroid Build Coastguard Worker ASSERT_EQ(s.num_observers(), 0U);
229*6777b538SAndroid Build Coastguard Worker {
230*6777b538SAndroid Build Coastguard Worker ObservationHolder o(&s);
231*6777b538SAndroid Build Coastguard Worker ASSERT_EQ(s.num_observers(), 1U);
232*6777b538SAndroid Build Coastguard Worker }
233*6777b538SAndroid Build Coastguard Worker ASSERT_EQ(s.num_observers(), 0U);
234*6777b538SAndroid Build Coastguard Worker }
235*6777b538SAndroid Build Coastguard Worker
236*6777b538SAndroid Build Coastguard Worker namespace {
237*6777b538SAndroid Build Coastguard Worker
238*6777b538SAndroid Build Coastguard Worker class TestSourceWithNonDefaultNamesFwd;
239*6777b538SAndroid Build Coastguard Worker
240*6777b538SAndroid Build Coastguard Worker class ObservationWithNonDefaultNamesHolder : public TestSourceObserver {
241*6777b538SAndroid Build Coastguard Worker public:
242*6777b538SAndroid Build Coastguard Worker // Declared but not defined since TestSourceWithNonDefaultNamesFwd is not yet
243*6777b538SAndroid Build Coastguard Worker // defined.
244*6777b538SAndroid Build Coastguard Worker explicit ObservationWithNonDefaultNamesHolder(
245*6777b538SAndroid Build Coastguard Worker TestSourceWithNonDefaultNamesFwd* source);
246*6777b538SAndroid Build Coastguard Worker
247*6777b538SAndroid Build Coastguard Worker private:
248*6777b538SAndroid Build Coastguard Worker // ScopedObservation<> is instantiated with a forward-declared parameter.
249*6777b538SAndroid Build Coastguard Worker ScopedObservation<TestSourceWithNonDefaultNamesFwd, TestSourceObserver> obs_{
250*6777b538SAndroid Build Coastguard Worker this};
251*6777b538SAndroid Build Coastguard Worker };
252*6777b538SAndroid Build Coastguard Worker
253*6777b538SAndroid Build Coastguard Worker // TestSourceWithNonDefaultNamesFwd gets an actual definition!
254*6777b538SAndroid Build Coastguard Worker class TestSourceWithNonDefaultNamesFwd : public TestSourceWithNonDefaultNames {
255*6777b538SAndroid Build Coastguard Worker };
256*6777b538SAndroid Build Coastguard Worker
257*6777b538SAndroid Build Coastguard Worker } // namespace
258*6777b538SAndroid Build Coastguard Worker
259*6777b538SAndroid Build Coastguard Worker // Now we define the corresponding traits. ScopedObservationTraits
260*6777b538SAndroid Build Coastguard Worker // specializations must be defined in base::, since that is where the primary
261*6777b538SAndroid Build Coastguard Worker // template definition lives.
262*6777b538SAndroid Build Coastguard Worker template <>
263*6777b538SAndroid Build Coastguard Worker struct ScopedObservationTraits<TestSourceWithNonDefaultNamesFwd,
264*6777b538SAndroid Build Coastguard Worker TestSourceObserver> {
AddObserverbase::ScopedObservationTraits265*6777b538SAndroid Build Coastguard Worker static void AddObserver(TestSourceWithNonDefaultNamesFwd* source,
266*6777b538SAndroid Build Coastguard Worker TestSourceObserver* observer) {
267*6777b538SAndroid Build Coastguard Worker source->AddFoo(observer);
268*6777b538SAndroid Build Coastguard Worker }
RemoveObserverbase::ScopedObservationTraits269*6777b538SAndroid Build Coastguard Worker static void RemoveObserver(TestSourceWithNonDefaultNamesFwd* source,
270*6777b538SAndroid Build Coastguard Worker TestSourceObserver* observer) {
271*6777b538SAndroid Build Coastguard Worker source->RemoveFoo(observer);
272*6777b538SAndroid Build Coastguard Worker }
273*6777b538SAndroid Build Coastguard Worker };
274*6777b538SAndroid Build Coastguard Worker
275*6777b538SAndroid Build Coastguard Worker namespace {
276*6777b538SAndroid Build Coastguard Worker
277*6777b538SAndroid Build Coastguard Worker // Calling ScopedObservation::Observe() requires an actual definition rather
278*6777b538SAndroid Build Coastguard Worker // than just a forward declaration; make sure it compiles now that there is
279*6777b538SAndroid Build Coastguard Worker // a definition.
ObservationWithNonDefaultNamesHolder(TestSourceWithNonDefaultNamesFwd * source)280*6777b538SAndroid Build Coastguard Worker ObservationWithNonDefaultNamesHolder::ObservationWithNonDefaultNamesHolder(
281*6777b538SAndroid Build Coastguard Worker TestSourceWithNonDefaultNamesFwd* source) {
282*6777b538SAndroid Build Coastguard Worker obs_.Observe(source);
283*6777b538SAndroid Build Coastguard Worker }
284*6777b538SAndroid Build Coastguard Worker
285*6777b538SAndroid Build Coastguard Worker } // namespace
286*6777b538SAndroid Build Coastguard Worker
TEST(ScopedObservationTest,ForwardDeclaredSourceWithNonDefaultNames)287*6777b538SAndroid Build Coastguard Worker TEST(ScopedObservationTest, ForwardDeclaredSourceWithNonDefaultNames) {
288*6777b538SAndroid Build Coastguard Worker TestSourceWithNonDefaultNamesFwd s;
289*6777b538SAndroid Build Coastguard Worker ASSERT_EQ(s.impl().num_observers(), 0U);
290*6777b538SAndroid Build Coastguard Worker {
291*6777b538SAndroid Build Coastguard Worker ObservationWithNonDefaultNamesHolder o(&s);
292*6777b538SAndroid Build Coastguard Worker ASSERT_EQ(s.impl().num_observers(), 1U);
293*6777b538SAndroid Build Coastguard Worker }
294*6777b538SAndroid Build Coastguard Worker ASSERT_EQ(s.impl().num_observers(), 0U);
295*6777b538SAndroid Build Coastguard Worker }
296*6777b538SAndroid Build Coastguard Worker
297*6777b538SAndroid Build Coastguard Worker } // namespace base
298