1 : // Copyright 2015 Google Inc. All Rights Reserved.
2 : //
3 : // Licensed under the Apache License, Version 2.0 (the "License");
4 : // you may not use this file except in compliance with the License.
5 : // You may obtain a copy of the License at
6 : //
7 : // http://www.apache.org/licenses/LICENSE-2.0
8 : //
9 : // Unless required by applicable law or agreed to in writing, software
10 : // distributed under the License is distributed on an "AS IS" BASIS,
11 : // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 : // See the License for the specific language governing permissions and
13 : // limitations under the License.
14 :
15 : #include "syzygy/bard/events/linked_event.h"
16 :
17 : #include "base/synchronization/lock.h"
18 : #include "base/threading/simple_thread.h"
19 : #include "gtest/gtest.h"
20 :
21 : namespace bard {
22 : namespace events {
23 :
24 : namespace {
25 :
26 : class TestEvent : public EventInterface {
27 : public:
28 E : TestEvent() : played_(false) {}
29 :
30 i : EventType type() const override { return static_cast<EventType>(0); }
31 :
32 E : bool Play(void* backdrop) override {
33 E : base::AutoLock auto_lock(lock_);
34 E : played_ = true;
35 E : return true;
36 E : }
37 :
38 i : bool Equals(const EventInterface* rhs) const override {
39 i : NOTREACHED();
40 i : return false;
41 i : }
42 :
43 E : bool played() const {
44 E : base::AutoLock auto_lock(const_cast<base::Lock&>(lock_));
45 E : return played_;
46 E : }
47 :
48 : protected:
49 : base::Lock lock_;
50 : bool played_;
51 : };
52 :
53 : class TestRunner : public base::DelegateSimpleThread::Delegate {
54 : public:
55 E : TestRunner(LinkedEvent* event, void* backdrop)
56 : : test_event_(event), test_backdrop_(backdrop) {}
57 :
58 E : void Run() override { test_event_->Play(test_backdrop_); }
59 :
60 : protected:
61 : LinkedEvent* test_event_;
62 : void* test_backdrop_;
63 : };
64 :
65 : class LinkedEventTest : public testing::Test {
66 : public:
67 : LinkedEventTest()
68 : : linked_event1_(scoped_ptr<EventInterface>(new TestEvent())),
69 : linked_event2_(scoped_ptr<EventInterface>(new TestEvent())),
70 : linked_event3_(scoped_ptr<EventInterface>(new TestEvent())),
71 : runner1_(&linked_event1_, empty_backdrop_),
72 : runner2_(&linked_event2_, empty_backdrop_),
73 E : runner3_(&linked_event3_, empty_backdrop_) {}
74 :
75 : protected:
76 : void* empty_backdrop_;
77 :
78 : LinkedEvent linked_event1_;
79 : LinkedEvent linked_event2_;
80 : LinkedEvent linked_event3_;
81 :
82 : TestRunner runner1_;
83 : TestRunner runner2_;
84 : TestRunner runner3_;
85 : };
86 :
87 : } // namespace
88 :
89 E : TEST_F(LinkedEventTest, TestOneLink) {
90 E : base::DelegateSimpleThread thread1(&runner1_, "First Thread");
91 E : base::DelegateSimpleThread thread2(&runner2_, "Second Thread");
92 :
93 E : linked_event2_.AddDep(&linked_event1_);
94 :
95 E : thread2.Start();
96 :
97 : EXPECT_FALSE(
98 E : reinterpret_cast<const TestEvent*>(linked_event1_.event())->played());
99 : EXPECT_FALSE(
100 E : reinterpret_cast<const TestEvent*>(linked_event2_.event())->played());
101 :
102 E : thread1.Start();
103 E : thread1.Join();
104 :
105 E : thread2.Join();
106 :
107 : EXPECT_TRUE(
108 E : reinterpret_cast<const TestEvent*>(linked_event1_.event())->played());
109 : EXPECT_TRUE(
110 E : reinterpret_cast<const TestEvent*>(linked_event2_.event())->played());
111 E : }
112 :
113 E : TEST_F(LinkedEventTest, TestChainLink) {
114 E : base::DelegateSimpleThread thread1(&runner1_, "First Thread");
115 E : base::DelegateSimpleThread thread2(&runner2_, "Second Thread");
116 E : base::DelegateSimpleThread thread3(&runner3_, "Third Thread");
117 :
118 E : linked_event2_.AddDep(&linked_event1_);
119 E : linked_event3_.AddDep(&linked_event2_);
120 :
121 E : thread3.Start();
122 :
123 : EXPECT_FALSE(
124 E : reinterpret_cast<const TestEvent*>(linked_event1_.event())->played());
125 : EXPECT_FALSE(
126 E : reinterpret_cast<const TestEvent*>(linked_event2_.event())->played());
127 : EXPECT_FALSE(
128 E : reinterpret_cast<const TestEvent*>(linked_event3_.event())->played());
129 :
130 E : thread2.Start();
131 :
132 : EXPECT_FALSE(
133 E : reinterpret_cast<const TestEvent*>(linked_event1_.event())->played());
134 : EXPECT_FALSE(
135 E : reinterpret_cast<const TestEvent*>(linked_event2_.event())->played());
136 : EXPECT_FALSE(
137 E : reinterpret_cast<const TestEvent*>(linked_event3_.event())->played());
138 :
139 E : thread1.Start();
140 E : thread1.Join();
141 E : thread2.Join();
142 E : thread3.Join();
143 :
144 : EXPECT_TRUE(
145 E : reinterpret_cast<const TestEvent*>(linked_event1_.event())->played());
146 : EXPECT_TRUE(
147 E : reinterpret_cast<const TestEvent*>(linked_event2_.event())->played());
148 : EXPECT_TRUE(
149 E : reinterpret_cast<const TestEvent*>(linked_event3_.event())->played());
150 E : }
151 :
152 E : TEST_F(LinkedEventTest, TestMultipleDependency) {
153 E : base::DelegateSimpleThread thread1(&runner1_, "First Thread");
154 E : base::DelegateSimpleThread thread2(&runner2_, "Second Thread");
155 E : base::DelegateSimpleThread thread3(&runner3_, "Third Thread");
156 :
157 E : linked_event3_.AddDep(&linked_event1_);
158 E : linked_event3_.AddDep(&linked_event2_);
159 :
160 E : thread3.Start();
161 :
162 : EXPECT_FALSE(
163 E : reinterpret_cast<const TestEvent*>(linked_event1_.event())->played());
164 : EXPECT_FALSE(
165 E : reinterpret_cast<const TestEvent*>(linked_event2_.event())->played());
166 : EXPECT_FALSE(
167 E : reinterpret_cast<const TestEvent*>(linked_event3_.event())->played());
168 :
169 E : thread2.Start();
170 :
171 : EXPECT_FALSE(
172 E : reinterpret_cast<const TestEvent*>(linked_event1_.event())->played());
173 : EXPECT_TRUE(
174 E : reinterpret_cast<const TestEvent*>(linked_event2_.event())->played());
175 : EXPECT_FALSE(
176 E : reinterpret_cast<const TestEvent*>(linked_event3_.event())->played());
177 :
178 E : thread1.Start();
179 E : thread1.Join();
180 E : thread2.Join();
181 E : thread3.Join();
182 :
183 : EXPECT_TRUE(
184 E : reinterpret_cast<const TestEvent*>(linked_event1_.event())->played());
185 : EXPECT_TRUE(
186 E : reinterpret_cast<const TestEvent*>(linked_event2_.event())->played());
187 : EXPECT_TRUE(
188 E : reinterpret_cast<const TestEvent*>(linked_event3_.event())->played());
189 E : }
190 :
191 : } // namespace events
192 : } // namespace bard
|