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 E : : 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 : // The backdrop isn't used, but can't be null. Simply generate a dummy
68 : // address.
69 : LinkedEventTest()
70 E : : empty_backdrop_(reinterpret_cast<void*>(0xBAADF00D)),
71 E : linked_event1_(std::unique_ptr<EventInterface>(new TestEvent())),
72 E : linked_event2_(std::unique_ptr<EventInterface>(new TestEvent())),
73 E : linked_event3_(std::unique_ptr<EventInterface>(new TestEvent())),
74 E : runner1_(&linked_event1_, empty_backdrop_),
75 E : runner2_(&linked_event2_, empty_backdrop_),
76 E : runner3_(&linked_event3_, empty_backdrop_) {}
77 :
78 : protected:
79 : void* empty_backdrop_;
80 :
81 : LinkedEvent linked_event1_;
82 : LinkedEvent linked_event2_;
83 : LinkedEvent linked_event3_;
84 :
85 : TestRunner runner1_;
86 : TestRunner runner2_;
87 : TestRunner runner3_;
88 : };
89 :
90 : } // namespace
91 :
92 E : TEST_F(LinkedEventTest, TestOneLink) {
93 E : base::DelegateSimpleThread thread1(&runner1_, "First Thread");
94 E : base::DelegateSimpleThread thread2(&runner2_, "Second Thread");
95 :
96 E : linked_event2_.AddDep(&linked_event1_);
97 :
98 E : thread2.Start();
99 :
100 E : EXPECT_FALSE(
101 E : reinterpret_cast<const TestEvent*>(linked_event1_.event())->played());
102 E : EXPECT_FALSE(
103 E : reinterpret_cast<const TestEvent*>(linked_event2_.event())->played());
104 :
105 E : thread1.Start();
106 E : thread1.Join();
107 :
108 E : thread2.Join();
109 :
110 E : EXPECT_TRUE(
111 E : reinterpret_cast<const TestEvent*>(linked_event1_.event())->played());
112 E : EXPECT_TRUE(
113 E : reinterpret_cast<const TestEvent*>(linked_event2_.event())->played());
114 E : }
115 :
116 E : TEST_F(LinkedEventTest, TestChainLink) {
117 E : base::DelegateSimpleThread thread1(&runner1_, "First Thread");
118 E : base::DelegateSimpleThread thread2(&runner2_, "Second Thread");
119 E : base::DelegateSimpleThread thread3(&runner3_, "Third Thread");
120 :
121 E : linked_event2_.AddDep(&linked_event1_);
122 E : linked_event3_.AddDep(&linked_event2_);
123 :
124 E : thread3.Start();
125 :
126 E : EXPECT_FALSE(
127 E : reinterpret_cast<const TestEvent*>(linked_event1_.event())->played());
128 E : EXPECT_FALSE(
129 E : reinterpret_cast<const TestEvent*>(linked_event2_.event())->played());
130 E : EXPECT_FALSE(
131 E : reinterpret_cast<const TestEvent*>(linked_event3_.event())->played());
132 :
133 E : thread2.Start();
134 :
135 E : EXPECT_FALSE(
136 E : reinterpret_cast<const TestEvent*>(linked_event1_.event())->played());
137 E : EXPECT_FALSE(
138 E : reinterpret_cast<const TestEvent*>(linked_event2_.event())->played());
139 E : EXPECT_FALSE(
140 E : reinterpret_cast<const TestEvent*>(linked_event3_.event())->played());
141 :
142 E : thread1.Start();
143 E : thread1.Join();
144 E : thread2.Join();
145 E : thread3.Join();
146 :
147 E : EXPECT_TRUE(
148 E : reinterpret_cast<const TestEvent*>(linked_event1_.event())->played());
149 E : EXPECT_TRUE(
150 E : reinterpret_cast<const TestEvent*>(linked_event2_.event())->played());
151 E : EXPECT_TRUE(
152 E : reinterpret_cast<const TestEvent*>(linked_event3_.event())->played());
153 E : }
154 :
155 E : TEST_F(LinkedEventTest, TestMultipleDependency) {
156 E : base::DelegateSimpleThread thread1(&runner1_, "First Thread");
157 E : base::DelegateSimpleThread thread2(&runner2_, "Second Thread");
158 E : base::DelegateSimpleThread thread3(&runner3_, "Third Thread");
159 :
160 E : linked_event3_.AddDep(&linked_event1_);
161 E : linked_event3_.AddDep(&linked_event2_);
162 :
163 E : thread3.Start();
164 :
165 E : EXPECT_FALSE(
166 E : reinterpret_cast<const TestEvent*>(linked_event1_.event())->played());
167 E : EXPECT_FALSE(
168 E : reinterpret_cast<const TestEvent*>(linked_event2_.event())->played());
169 E : EXPECT_FALSE(
170 E : reinterpret_cast<const TestEvent*>(linked_event3_.event())->played());
171 :
172 E : thread2.Start();
173 :
174 E : EXPECT_FALSE(
175 E : reinterpret_cast<const TestEvent*>(linked_event1_.event())->played());
176 E : EXPECT_TRUE(
177 E : reinterpret_cast<const TestEvent*>(linked_event2_.event())->played());
178 E : EXPECT_FALSE(
179 E : reinterpret_cast<const TestEvent*>(linked_event3_.event())->played());
180 :
181 E : thread1.Start();
182 E : thread1.Join();
183 E : thread2.Join();
184 E : thread3.Join();
185 :
186 E : EXPECT_TRUE(
187 E : reinterpret_cast<const TestEvent*>(linked_event1_.event())->played());
188 E : EXPECT_TRUE(
189 E : reinterpret_cast<const TestEvent*>(linked_event2_.event())->played());
190 E : EXPECT_TRUE(
191 E : reinterpret_cast<const TestEvent*>(linked_event3_.event())->played());
192 E : }
193 :
194 : } // namespace events
195 : } // namespace bard
|