1 // Copyright 2018 The Fuchsia Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include <utility>
6 
7 #include <zircon/assert.h>
8 #include <zxtest/base/event-broadcaster.h>
9 
10 namespace zxtest {
11 namespace internal {
12 
13 namespace {
14 
15 template <auto Fn, typename ObserverList, typename... Args>
Broadcast(ObserverList * observers,Args &&...args)16 void Broadcast(ObserverList* observers, Args&&... args) {
17     for (auto& observer : *observers) {
18         (observer->*Fn)(std::forward<Args>(args)...);
19     }
20 }
21 
22 } // namespace
23 
24 EventBroadcaster::EventBroadcaster() = default;
25 EventBroadcaster::EventBroadcaster(EventBroadcaster&&) = default;
26 EventBroadcaster::~EventBroadcaster() = default;
27 
28 // Reports before every TestCase is set up.
OnTestCaseStart(const TestCase & test_case)29 void EventBroadcaster::OnTestCaseStart(const TestCase& test_case) {
30     Broadcast<&LifecycleObserver::OnTestCaseStart>(&lifecycle_observers_, test_case);
31 }
32 
33 // Reports before every test starts.
OnTestStart(const TestCase & test_case,const TestInfo & test)34 void EventBroadcaster::OnTestStart(const TestCase& test_case, const TestInfo& test) {
35     Broadcast<&LifecycleObserver::OnTestStart>(&lifecycle_observers_, test_case, test);
36 }
37 
38 // Reports before every test starts.
OnTestSkip(const TestCase & test_case,const TestInfo & test)39 void EventBroadcaster::OnTestSkip(const TestCase& test_case, const TestInfo& test) {
40     Broadcast<&LifecycleObserver::OnTestSkip>(&lifecycle_observers_, test_case, test);
41 }
42 
43 // Reports before every TestCase is set up.
OnTestFailure(const TestCase & test_case,const TestInfo & test)44 void EventBroadcaster::OnTestFailure(const TestCase& test_case, const TestInfo& test) {
45     Broadcast<&LifecycleObserver::OnTestFailure>(&lifecycle_observers_, test_case, test);
46 }
47 
48 // Reports before every TestCase is set up.
OnTestSuccess(const TestCase & test_case,const TestInfo & test)49 void EventBroadcaster::OnTestSuccess(const TestCase& test_case, const TestInfo& test) {
50     Broadcast<&LifecycleObserver::OnTestSuccess>(&lifecycle_observers_, test_case, test);
51 }
52 // Reports before every TestCase is torn down.
OnTestCaseEnd(const TestCase & test_case)53 void EventBroadcaster::OnTestCaseEnd(const TestCase& test_case) {
54     Broadcast<&LifecycleObserver::OnTestCaseEnd>(&lifecycle_observers_, test_case);
55 }
56 
57 // Adds a lifecycle observer to the registered list of observers.
Subscribe(LifecycleObserver * observer)58 void EventBroadcaster::Subscribe(LifecycleObserver* observer) {
59     ZX_DEBUG_ASSERT_MSG(observer != this, "EventBroadcaster cannot observe itself.");
60     ZX_DEBUG_ASSERT_MSG(observer != nullptr, "Canno register nullptr as a LifecycleObserver");
61     lifecycle_observers_.push_back(observer);
62 }
63 
64 } // namespace internal
65 } // namespace zxtest
66