OLD | NEW |
1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chromecast/base/component/component.h" | 5 #include "chromecast/base/component/component.h" |
6 | 6 |
| 7 #include <memory> |
| 8 |
7 #include "base/location.h" | 9 #include "base/location.h" |
8 #include "base/memory/scoped_ptr.h" | |
9 #include "base/message_loop/message_loop.h" | 10 #include "base/message_loop/message_loop.h" |
10 #include "base/run_loop.h" | 11 #include "base/run_loop.h" |
11 #include "base/thread_task_runner_handle.h" | 12 #include "base/thread_task_runner_handle.h" |
12 #include "testing/gtest/include/gtest/gtest.h" | 13 #include "testing/gtest/include/gtest/gtest.h" |
13 | 14 |
14 namespace chromecast { | 15 namespace chromecast { |
15 | 16 |
16 class ComponentTest : public ::testing::Test { | 17 class ComponentTest : public ::testing::Test { |
17 protected: | 18 protected: |
18 ComponentTest() : message_loop_(new base::MessageLoop()) {} | 19 ComponentTest() : message_loop_(new base::MessageLoop()) {} |
19 | 20 |
20 const scoped_ptr<base::MessageLoop> message_loop_; | 21 const std::unique_ptr<base::MessageLoop> message_loop_; |
21 }; | 22 }; |
22 | 23 |
23 using ComponentDeathTest = ComponentTest; | 24 using ComponentDeathTest = ComponentTest; |
24 | 25 |
25 class ComponentB; | 26 class ComponentB; |
26 class ComponentC; | 27 class ComponentC; |
27 class ComponentA : public Component<ComponentA> { | 28 class ComponentA : public Component<ComponentA> { |
28 public: | 29 public: |
29 void MakeSelfDependency() { | 30 void MakeSelfDependency() { |
30 a_.reset(new Component<ComponentA>::Dependency(GetRef(), this)); | 31 a_.reset(new Component<ComponentA>::Dependency(GetRef(), this)); |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
63 EXPECT_FALSE(fail_enable_); | 64 EXPECT_FALSE(fail_enable_); |
64 } | 65 } |
65 | 66 |
66 bool enabled() const { return enabled_; } | 67 bool enabled() const { return enabled_; } |
67 void FailEnable() { fail_enable_ = true; } | 68 void FailEnable() { fail_enable_ = true; } |
68 | 69 |
69 private: | 70 private: |
70 bool enabled_ = false; | 71 bool enabled_ = false; |
71 bool fail_enable_ = false; | 72 bool fail_enable_ = false; |
72 | 73 |
73 scoped_ptr<Component<ComponentA>::Dependency> a_; | 74 std::unique_ptr<Component<ComponentA>::Dependency> a_; |
74 scoped_ptr<Component<ComponentB>::Dependency> b_; | 75 std::unique_ptr<Component<ComponentB>::Dependency> b_; |
75 scoped_ptr<Component<ComponentC>::Dependency> c_; | 76 std::unique_ptr<Component<ComponentC>::Dependency> c_; |
76 }; | 77 }; |
77 | 78 |
78 class ComponentB : public Component<ComponentB> { | 79 class ComponentB : public Component<ComponentB> { |
79 public: | 80 public: |
80 explicit ComponentB(const ComponentA::WeakRef& a) : a_(a, this) {} | 81 explicit ComponentB(const ComponentA::WeakRef& a) : a_(a, this) {} |
81 | 82 |
82 void OnEnable() override { | 83 void OnEnable() override { |
83 if (!fail_enable_) { | 84 if (!fail_enable_) { |
84 enabled_ = true; | 85 enabled_ = true; |
85 Test(); | 86 Test(); |
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
172 ComponentA a; | 173 ComponentA a; |
173 ComponentB b(a.GetRef()); | 174 ComponentB b(a.GetRef()); |
174 ComponentC c(b.GetRef()); | 175 ComponentC c(b.GetRef()); |
175 EXPECT_DEATH(a.MakeTransitiveCircularDependency(c.GetRef()), | 176 EXPECT_DEATH(a.MakeTransitiveCircularDependency(c.GetRef()), |
176 "Circular dependency"); | 177 "Circular dependency"); |
177 } | 178 } |
178 #endif // (!defined(NDEBUG) || defined(DCHECK_ALWAYS_ON)) && | 179 #endif // (!defined(NDEBUG) || defined(DCHECK_ALWAYS_ON)) && |
179 // GTEST_HAS_DEATH_TEST | 180 // GTEST_HAS_DEATH_TEST |
180 | 181 |
181 TEST_F(ComponentTest, SimpleEnable) { | 182 TEST_F(ComponentTest, SimpleEnable) { |
182 scoped_ptr<ComponentA> a(new ComponentA()); | 183 std::unique_ptr<ComponentA> a(new ComponentA()); |
183 a->Enable(); | 184 a->Enable(); |
184 message_loop_->RunUntilIdle(); | 185 message_loop_->RunUntilIdle(); |
185 EXPECT_TRUE(a->enabled()); | 186 EXPECT_TRUE(a->enabled()); |
186 a.release()->Destroy(); | 187 a.release()->Destroy(); |
187 } | 188 } |
188 | 189 |
189 TEST_F(ComponentTest, TransitiveEnable) { | 190 TEST_F(ComponentTest, TransitiveEnable) { |
190 scoped_ptr<ComponentA> a(new ComponentA()); | 191 std::unique_ptr<ComponentA> a(new ComponentA()); |
191 scoped_ptr<ComponentB> b(new ComponentB(a->GetRef())); | 192 std::unique_ptr<ComponentB> b(new ComponentB(a->GetRef())); |
192 scoped_ptr<ComponentC> c(new ComponentC(b->GetRef())); | 193 std::unique_ptr<ComponentC> c(new ComponentC(b->GetRef())); |
193 c->Enable(); | 194 c->Enable(); |
194 message_loop_->RunUntilIdle(); | 195 message_loop_->RunUntilIdle(); |
195 EXPECT_TRUE(a->enabled()); | 196 EXPECT_TRUE(a->enabled()); |
196 EXPECT_TRUE(b->enabled()); | 197 EXPECT_TRUE(b->enabled()); |
197 EXPECT_TRUE(c->enabled()); | 198 EXPECT_TRUE(c->enabled()); |
198 a.release()->Destroy(); | 199 a.release()->Destroy(); |
199 b.release()->Destroy(); | 200 b.release()->Destroy(); |
200 c.release()->Destroy(); | 201 c.release()->Destroy(); |
201 } | 202 } |
202 | 203 |
203 TEST_F(ComponentTest, FailEnable) { | 204 TEST_F(ComponentTest, FailEnable) { |
204 scoped_ptr<ComponentA> a(new ComponentA()); | 205 std::unique_ptr<ComponentA> a(new ComponentA()); |
205 a->FailEnable(); | 206 a->FailEnable(); |
206 a->Enable(); | 207 a->Enable(); |
207 message_loop_->RunUntilIdle(); | 208 message_loop_->RunUntilIdle(); |
208 EXPECT_FALSE(a->enabled()); | 209 EXPECT_FALSE(a->enabled()); |
209 a.release()->Destroy(); | 210 a.release()->Destroy(); |
210 } | 211 } |
211 | 212 |
212 TEST_F(ComponentTest, TransitiveFailEnable) { | 213 TEST_F(ComponentTest, TransitiveFailEnable) { |
213 scoped_ptr<ComponentA> a(new ComponentA()); | 214 std::unique_ptr<ComponentA> a(new ComponentA()); |
214 scoped_ptr<ComponentB> b(new ComponentB(a->GetRef())); | 215 std::unique_ptr<ComponentB> b(new ComponentB(a->GetRef())); |
215 scoped_ptr<ComponentC> c(new ComponentC(b->GetRef())); | 216 std::unique_ptr<ComponentC> c(new ComponentC(b->GetRef())); |
216 a->FailEnable(); | 217 a->FailEnable(); |
217 c->Enable(); | 218 c->Enable(); |
218 message_loop_->RunUntilIdle(); | 219 message_loop_->RunUntilIdle(); |
219 EXPECT_FALSE(a->enabled()); | 220 EXPECT_FALSE(a->enabled()); |
220 EXPECT_FALSE(b->enabled()); | 221 EXPECT_FALSE(b->enabled()); |
221 EXPECT_FALSE(c->enabled()); | 222 EXPECT_FALSE(c->enabled()); |
222 a.release()->Destroy(); | 223 a.release()->Destroy(); |
223 b.release()->Destroy(); | 224 b.release()->Destroy(); |
224 c.release()->Destroy(); | 225 c.release()->Destroy(); |
225 } | 226 } |
226 | 227 |
227 TEST_F(ComponentTest, DisableWhileEnabling) { | 228 TEST_F(ComponentTest, DisableWhileEnabling) { |
228 scoped_ptr<ComponentA> a(new ComponentA()); | 229 std::unique_ptr<ComponentA> a(new ComponentA()); |
229 a->Enable(); | 230 a->Enable(); |
230 a->Disable(); | 231 a->Disable(); |
231 message_loop_->RunUntilIdle(); | 232 message_loop_->RunUntilIdle(); |
232 EXPECT_FALSE(a->enabled()); | 233 EXPECT_FALSE(a->enabled()); |
233 a.release()->Destroy(); | 234 a.release()->Destroy(); |
234 } | 235 } |
235 | 236 |
236 TEST_F(ComponentTest, EnableTwice) { | 237 TEST_F(ComponentTest, EnableTwice) { |
237 scoped_ptr<ComponentA> a(new ComponentA()); | 238 std::unique_ptr<ComponentA> a(new ComponentA()); |
238 a->Enable(); | 239 a->Enable(); |
239 a->Enable(); | 240 a->Enable(); |
240 message_loop_->RunUntilIdle(); | 241 message_loop_->RunUntilIdle(); |
241 EXPECT_TRUE(a->enabled()); | 242 EXPECT_TRUE(a->enabled()); |
242 a.release()->Destroy(); | 243 a.release()->Destroy(); |
243 } | 244 } |
244 | 245 |
245 TEST_F(ComponentTest, DisableTwice) { | 246 TEST_F(ComponentTest, DisableTwice) { |
246 scoped_ptr<ComponentA> a(new ComponentA()); | 247 std::unique_ptr<ComponentA> a(new ComponentA()); |
247 a->Enable(); | 248 a->Enable(); |
248 message_loop_->RunUntilIdle(); | 249 message_loop_->RunUntilIdle(); |
249 EXPECT_TRUE(a->enabled()); | 250 EXPECT_TRUE(a->enabled()); |
250 a->Disable(); | 251 a->Disable(); |
251 message_loop_->RunUntilIdle(); | 252 message_loop_->RunUntilIdle(); |
252 EXPECT_FALSE(a->enabled()); | 253 EXPECT_FALSE(a->enabled()); |
253 a->Disable(); | 254 a->Disable(); |
254 message_loop_->RunUntilIdle(); | 255 message_loop_->RunUntilIdle(); |
255 EXPECT_FALSE(a->enabled()); | 256 EXPECT_FALSE(a->enabled()); |
256 a.release()->Destroy(); | 257 a.release()->Destroy(); |
257 } | 258 } |
258 | 259 |
259 TEST_F(ComponentTest, DisableAfterFailedEnable) { | 260 TEST_F(ComponentTest, DisableAfterFailedEnable) { |
260 scoped_ptr<ComponentA> a(new ComponentA()); | 261 std::unique_ptr<ComponentA> a(new ComponentA()); |
261 a->FailEnable(); | 262 a->FailEnable(); |
262 a->Enable(); | 263 a->Enable(); |
263 message_loop_->RunUntilIdle(); | 264 message_loop_->RunUntilIdle(); |
264 EXPECT_FALSE(a->enabled()); | 265 EXPECT_FALSE(a->enabled()); |
265 a->Disable(); | 266 a->Disable(); |
266 message_loop_->RunUntilIdle(); | 267 message_loop_->RunUntilIdle(); |
267 EXPECT_FALSE(a->enabled()); | 268 EXPECT_FALSE(a->enabled()); |
268 a.release()->Destroy(); | 269 a.release()->Destroy(); |
269 } | 270 } |
270 | 271 |
271 TEST_F(ComponentTest, DisableAfterNeverEnabled) { | 272 TEST_F(ComponentTest, DisableAfterNeverEnabled) { |
272 scoped_ptr<ComponentA> a(new ComponentA()); | 273 std::unique_ptr<ComponentA> a(new ComponentA()); |
273 a->Disable(); | 274 a->Disable(); |
274 message_loop_->RunUntilIdle(); | 275 message_loop_->RunUntilIdle(); |
275 EXPECT_FALSE(a->enabled()); | 276 EXPECT_FALSE(a->enabled()); |
276 a.release()->Destroy(); | 277 a.release()->Destroy(); |
277 } | 278 } |
278 | 279 |
279 TEST_F(ComponentTest, DisableDependencyWhileEnabling) { | 280 TEST_F(ComponentTest, DisableDependencyWhileEnabling) { |
280 scoped_ptr<ComponentA> a(new ComponentA()); | 281 std::unique_ptr<ComponentA> a(new ComponentA()); |
281 scoped_ptr<ComponentB> b(new ComponentB(a->GetRef())); | 282 std::unique_ptr<ComponentB> b(new ComponentB(a->GetRef())); |
282 scoped_ptr<ComponentC> c(new ComponentC(b->GetRef())); | 283 std::unique_ptr<ComponentC> c(new ComponentC(b->GetRef())); |
283 b->Enable(); | 284 b->Enable(); |
284 message_loop_->RunUntilIdle(); | 285 message_loop_->RunUntilIdle(); |
285 c->Enable(); | 286 c->Enable(); |
286 a->Disable(); | 287 a->Disable(); |
287 message_loop_->RunUntilIdle(); | 288 message_loop_->RunUntilIdle(); |
288 EXPECT_FALSE(a->enabled()); | 289 EXPECT_FALSE(a->enabled()); |
289 EXPECT_FALSE(b->enabled()); | 290 EXPECT_FALSE(b->enabled()); |
290 EXPECT_FALSE(c->enabled()); | 291 EXPECT_FALSE(c->enabled()); |
291 a.release()->Destroy(); | 292 a.release()->Destroy(); |
292 b.release()->Destroy(); | 293 b.release()->Destroy(); |
293 c.release()->Destroy(); | 294 c.release()->Destroy(); |
294 } | 295 } |
295 | 296 |
296 TEST_F(ComponentTest, EnableDisableEnable) { | 297 TEST_F(ComponentTest, EnableDisableEnable) { |
297 scoped_ptr<ComponentA> a(new ComponentA()); | 298 std::unique_ptr<ComponentA> a(new ComponentA()); |
298 a->Enable(); | 299 a->Enable(); |
299 a->Disable(); | 300 a->Disable(); |
300 a->Enable(); | 301 a->Enable(); |
301 message_loop_->RunUntilIdle(); | 302 message_loop_->RunUntilIdle(); |
302 EXPECT_TRUE(a->enabled()); | 303 EXPECT_TRUE(a->enabled()); |
303 a.release()->Destroy(); | 304 a.release()->Destroy(); |
304 } | 305 } |
305 | 306 |
306 TEST_F(ComponentTest, DisableEnableDisable) { | 307 TEST_F(ComponentTest, DisableEnableDisable) { |
307 scoped_ptr<ComponentA> a(new ComponentA()); | 308 std::unique_ptr<ComponentA> a(new ComponentA()); |
308 a->Enable(); | 309 a->Enable(); |
309 message_loop_->RunUntilIdle(); | 310 message_loop_->RunUntilIdle(); |
310 EXPECT_TRUE(a->enabled()); | 311 EXPECT_TRUE(a->enabled()); |
311 a->Disable(); | 312 a->Disable(); |
312 a->Enable(); | 313 a->Enable(); |
313 a->Disable(); | 314 a->Disable(); |
314 message_loop_->RunUntilIdle(); | 315 message_loop_->RunUntilIdle(); |
315 EXPECT_FALSE(a->enabled()); | 316 EXPECT_FALSE(a->enabled()); |
316 a.release()->Destroy(); | 317 a.release()->Destroy(); |
317 } | 318 } |
318 | 319 |
319 TEST_F(ComponentTest, TransitiveEnableDisableEnable) { | 320 TEST_F(ComponentTest, TransitiveEnableDisableEnable) { |
320 scoped_ptr<ComponentA> a(new ComponentA()); | 321 std::unique_ptr<ComponentA> a(new ComponentA()); |
321 scoped_ptr<ComponentB> b(new ComponentB(a->GetRef())); | 322 std::unique_ptr<ComponentB> b(new ComponentB(a->GetRef())); |
322 scoped_ptr<ComponentC> c(new ComponentC(b->GetRef())); | 323 std::unique_ptr<ComponentC> c(new ComponentC(b->GetRef())); |
323 a->Enable(); | 324 a->Enable(); |
324 message_loop_->RunUntilIdle(); | 325 message_loop_->RunUntilIdle(); |
325 c->Enable(); | 326 c->Enable(); |
326 a->Disable(); | 327 a->Disable(); |
327 message_loop_->RunUntilIdle(); | 328 message_loop_->RunUntilIdle(); |
328 EXPECT_FALSE(a->enabled()); | 329 EXPECT_FALSE(a->enabled()); |
329 EXPECT_FALSE(b->enabled()); | 330 EXPECT_FALSE(b->enabled()); |
330 EXPECT_FALSE(c->enabled()); | 331 EXPECT_FALSE(c->enabled()); |
331 c->Enable(); | 332 c->Enable(); |
332 message_loop_->RunUntilIdle(); | 333 message_loop_->RunUntilIdle(); |
333 EXPECT_TRUE(a->enabled()); | 334 EXPECT_TRUE(a->enabled()); |
334 EXPECT_TRUE(b->enabled()); | 335 EXPECT_TRUE(b->enabled()); |
335 EXPECT_TRUE(c->enabled()); | 336 EXPECT_TRUE(c->enabled()); |
336 a.release()->Destroy(); | 337 a.release()->Destroy(); |
337 b.release()->Destroy(); | 338 b.release()->Destroy(); |
338 c.release()->Destroy(); | 339 c.release()->Destroy(); |
339 } | 340 } |
340 | 341 |
341 TEST_F(ComponentTest, WeakRefs) { | 342 TEST_F(ComponentTest, WeakRefs) { |
342 scoped_ptr<ComponentA> a(new ComponentA()); | 343 std::unique_ptr<ComponentA> a(new ComponentA()); |
343 ComponentA::WeakRef weak = a->GetRef(); | 344 ComponentA::WeakRef weak = a->GetRef(); |
344 EXPECT_FALSE(weak.Try()); | 345 EXPECT_FALSE(weak.Try()); |
345 a->Enable(); | 346 a->Enable(); |
346 EXPECT_FALSE(weak.Try()); | 347 EXPECT_FALSE(weak.Try()); |
347 message_loop_->RunUntilIdle(); | 348 message_loop_->RunUntilIdle(); |
348 EXPECT_TRUE(weak.Try()); | 349 EXPECT_TRUE(weak.Try()); |
349 weak.Try()->Test(); | 350 weak.Try()->Test(); |
350 a->Disable(); | 351 a->Disable(); |
351 message_loop_->RunUntilIdle(); | 352 message_loop_->RunUntilIdle(); |
352 EXPECT_FALSE(weak.Try()); | 353 EXPECT_FALSE(weak.Try()); |
353 a.release()->Destroy(); | 354 a.release()->Destroy(); |
354 } | 355 } |
355 | 356 |
356 TEST_F(ComponentTest, WeakRefsKeepEnabled) { | 357 TEST_F(ComponentTest, WeakRefsKeepEnabled) { |
357 scoped_ptr<ComponentA> a(new ComponentA()); | 358 std::unique_ptr<ComponentA> a(new ComponentA()); |
358 ComponentA::WeakRef weak = a->GetRef(); | 359 ComponentA::WeakRef weak = a->GetRef(); |
359 EXPECT_FALSE(weak.Try()); | 360 EXPECT_FALSE(weak.Try()); |
360 a->Enable(); | 361 a->Enable(); |
361 EXPECT_FALSE(weak.Try()); | 362 EXPECT_FALSE(weak.Try()); |
362 message_loop_->RunUntilIdle(); | 363 message_loop_->RunUntilIdle(); |
363 { | 364 { |
364 auto held_ref = weak.Try(); | 365 auto held_ref = weak.Try(); |
365 EXPECT_TRUE(held_ref); | 366 EXPECT_TRUE(held_ref); |
366 held_ref->Test(); | 367 held_ref->Test(); |
367 a->Disable(); | 368 a->Disable(); |
368 message_loop_->RunUntilIdle(); | 369 message_loop_->RunUntilIdle(); |
369 // The held ref keeps |a| enabled until it goes out of scope. | 370 // The held ref keeps |a| enabled until it goes out of scope. |
370 EXPECT_TRUE(a->enabled()); | 371 EXPECT_TRUE(a->enabled()); |
371 } | 372 } |
372 message_loop_->RunUntilIdle(); | 373 message_loop_->RunUntilIdle(); |
373 EXPECT_FALSE(a->enabled()); | 374 EXPECT_FALSE(a->enabled()); |
374 EXPECT_FALSE(weak.Try()); | 375 EXPECT_FALSE(weak.Try()); |
375 a.release()->Destroy(); | 376 a.release()->Destroy(); |
376 } | 377 } |
377 | 378 |
378 } // namespace chromecast | 379 } // namespace chromecast |
OLD | NEW |