Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(409)

Side by Side Diff: mojo/edk/system/waiter_unittest.cc

Issue 2076263003: Plumb the handle signals state to Awakable::Awake(). (Closed) Base URL: https://github.com/domokit/mojo.git@work794_wait_set_4.2
Patch Set: Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « mojo/edk/system/waiter.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 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 // NOTE(vtl): Some of these tests are inherently flaky (e.g., if run on a 5 // NOTE(vtl): Some of these tests are inherently flaky (e.g., if run on a
6 // heavily-loaded system). Sorry. |test::EpsilonTimeout()| may be increased to 6 // heavily-loaded system). Sorry. |test::EpsilonTimeout()| may be increased to
7 // increase tolerance and reduce observed flakiness (though doing so reduces the 7 // increase tolerance and reduce observed flakiness (though doing so reduces the
8 // meaningfulness of the test). 8 // meaningfulness of the test).
9 9
10 #include "mojo/edk/system/waiter.h" 10 #include "mojo/edk/system/waiter.h"
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after
98 MojoResult result; 98 MojoResult result;
99 uint64_t context; 99 uint64_t context;
100 MojoDeadline elapsed; 100 MojoDeadline elapsed;
101 101
102 // Finite deadline. 102 // Finite deadline.
103 103
104 // Awake immediately after thread start. 104 // Awake immediately after thread start.
105 { 105 {
106 WaitingThread thread(10 * test::EpsilonTimeout()); 106 WaitingThread thread(10 * test::EpsilonTimeout());
107 thread.Start(); 107 thread.Start();
108 thread.waiter()->Awake(MOJO_RESULT_OK, 1); 108 thread.waiter()->Awake(1, Awakable::AwakeReason::SATISFIED,
109 HandleSignalsState());
109 thread.WaitUntilDone(&result, &context, &elapsed); 110 thread.WaitUntilDone(&result, &context, &elapsed);
110 EXPECT_EQ(MOJO_RESULT_OK, result); 111 EXPECT_EQ(MOJO_RESULT_OK, result);
111 EXPECT_EQ(1u, context); 112 EXPECT_EQ(1u, context);
112 EXPECT_LT(elapsed, test::EpsilonTimeout()); 113 EXPECT_LT(elapsed, test::EpsilonTimeout());
113 } 114 }
114 115
115 // Awake before after thread start. 116 // Awake before after thread start.
116 { 117 {
117 WaitingThread thread(10 * test::EpsilonTimeout()); 118 WaitingThread thread(10 * test::EpsilonTimeout());
118 thread.waiter()->Awake(MOJO_RESULT_CANCELLED, 2); 119 thread.waiter()->Awake(2, Awakable::AwakeReason::CANCELLED,
120 HandleSignalsState());
119 thread.Start(); 121 thread.Start();
120 thread.WaitUntilDone(&result, &context, &elapsed); 122 thread.WaitUntilDone(&result, &context, &elapsed);
121 EXPECT_EQ(MOJO_RESULT_CANCELLED, result); 123 EXPECT_EQ(MOJO_RESULT_CANCELLED, result);
122 EXPECT_EQ(2u, context); 124 EXPECT_EQ(2u, context);
123 EXPECT_LT(elapsed, test::EpsilonTimeout()); 125 EXPECT_LT(elapsed, test::EpsilonTimeout());
124 } 126 }
125 127
126 // Awake some time after thread start. 128 // Awake some time after thread start.
127 { 129 {
128 WaitingThread thread(10 * test::EpsilonTimeout()); 130 WaitingThread thread(10 * test::EpsilonTimeout());
129 thread.Start(); 131 thread.Start();
130 ThreadSleep(2 * test::EpsilonTimeout()); 132 ThreadSleep(2 * test::EpsilonTimeout());
131 thread.waiter()->Awake(1, 3); 133 thread.waiter()->Awake(3, Awakable::AwakeReason::SATISFIED,
134 HandleSignalsState());
132 thread.WaitUntilDone(&result, &context, &elapsed); 135 thread.WaitUntilDone(&result, &context, &elapsed);
133 EXPECT_EQ(1u, result); 136 EXPECT_EQ(MOJO_RESULT_OK, result);
134 EXPECT_EQ(3u, context); 137 EXPECT_EQ(3u, context);
135 EXPECT_GT(elapsed, (2 - 1) * test::EpsilonTimeout()); 138 EXPECT_GT(elapsed, (2 - 1) * test::EpsilonTimeout());
136 EXPECT_LT(elapsed, (2 + 1) * test::EpsilonTimeout()); 139 EXPECT_LT(elapsed, (2 + 1) * test::EpsilonTimeout());
137 } 140 }
138 141
139 // Awake some longer time after thread start. 142 // Awake some longer time after thread start.
140 { 143 {
141 WaitingThread thread(10 * test::EpsilonTimeout()); 144 WaitingThread thread(10 * test::EpsilonTimeout());
142 thread.Start(); 145 thread.Start();
143 ThreadSleep(5 * test::EpsilonTimeout()); 146 ThreadSleep(5 * test::EpsilonTimeout());
144 thread.waiter()->Awake(2, 4); 147 thread.waiter()->Awake(4, Awakable::AwakeReason::UNSATISFIABLE,
148 HandleSignalsState());
145 thread.WaitUntilDone(&result, &context, &elapsed); 149 thread.WaitUntilDone(&result, &context, &elapsed);
146 EXPECT_EQ(2u, result); 150 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, result);
147 EXPECT_EQ(4u, context); 151 EXPECT_EQ(4u, context);
148 EXPECT_GT(elapsed, (5 - 1) * test::EpsilonTimeout()); 152 EXPECT_GT(elapsed, (5 - 1) * test::EpsilonTimeout());
149 EXPECT_LT(elapsed, (5 + 1) * test::EpsilonTimeout()); 153 EXPECT_LT(elapsed, (5 + 1) * test::EpsilonTimeout());
150 } 154 }
151 155
152 // Don't awake -- time out (on another thread). 156 // Don't awake -- time out (on another thread).
153 { 157 {
154 WaitingThread thread(2 * test::EpsilonTimeout()); 158 WaitingThread thread(2 * test::EpsilonTimeout());
155 thread.Start(); 159 thread.Start();
156 thread.WaitUntilDone(&result, &context, &elapsed); 160 thread.WaitUntilDone(&result, &context, &elapsed);
157 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, result); 161 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, result);
158 EXPECT_EQ(static_cast<uint64_t>(-1), context); 162 EXPECT_EQ(static_cast<uint64_t>(-1), context);
159 EXPECT_GT(elapsed, (2 - 1) * test::EpsilonTimeout()); 163 EXPECT_GT(elapsed, (2 - 1) * test::EpsilonTimeout());
160 EXPECT_LT(elapsed, (2 + 1) * test::EpsilonTimeout()); 164 EXPECT_LT(elapsed, (2 + 1) * test::EpsilonTimeout());
161 } 165 }
162 166
163 // No (indefinite) deadline. 167 // No (indefinite) deadline.
164 168
165 // Awake immediately after thread start. 169 // Awake immediately after thread start.
166 { 170 {
167 WaitingThread thread(MOJO_DEADLINE_INDEFINITE); 171 WaitingThread thread(MOJO_DEADLINE_INDEFINITE);
168 thread.Start(); 172 thread.Start();
169 thread.waiter()->Awake(MOJO_RESULT_OK, 5); 173 thread.waiter()->Awake(5, Awakable::AwakeReason::SATISFIED,
174 HandleSignalsState());
170 thread.WaitUntilDone(&result, &context, &elapsed); 175 thread.WaitUntilDone(&result, &context, &elapsed);
171 EXPECT_EQ(MOJO_RESULT_OK, result); 176 EXPECT_EQ(MOJO_RESULT_OK, result);
172 EXPECT_EQ(5u, context); 177 EXPECT_EQ(5u, context);
173 EXPECT_LT(elapsed, test::EpsilonTimeout()); 178 EXPECT_LT(elapsed, test::EpsilonTimeout());
174 } 179 }
175 180
176 // Awake before after thread start. 181 // Awake before after thread start.
177 { 182 {
178 WaitingThread thread(MOJO_DEADLINE_INDEFINITE); 183 WaitingThread thread(MOJO_DEADLINE_INDEFINITE);
179 thread.waiter()->Awake(MOJO_RESULT_CANCELLED, 6); 184 thread.waiter()->Awake(6, Awakable::AwakeReason::CANCELLED,
185 HandleSignalsState());
180 thread.Start(); 186 thread.Start();
181 thread.WaitUntilDone(&result, &context, &elapsed); 187 thread.WaitUntilDone(&result, &context, &elapsed);
182 EXPECT_EQ(MOJO_RESULT_CANCELLED, result); 188 EXPECT_EQ(MOJO_RESULT_CANCELLED, result);
183 EXPECT_EQ(6u, context); 189 EXPECT_EQ(6u, context);
184 EXPECT_LT(elapsed, test::EpsilonTimeout()); 190 EXPECT_LT(elapsed, test::EpsilonTimeout());
185 } 191 }
186 192
187 // Awake some time after thread start. 193 // Awake some time after thread start.
188 { 194 {
189 WaitingThread thread(MOJO_DEADLINE_INDEFINITE); 195 WaitingThread thread(MOJO_DEADLINE_INDEFINITE);
190 thread.Start(); 196 thread.Start();
191 ThreadSleep(2 * test::EpsilonTimeout()); 197 ThreadSleep(2 * test::EpsilonTimeout());
192 thread.waiter()->Awake(1, 7); 198 thread.waiter()->Awake(7, Awakable::AwakeReason::UNSATISFIABLE,
199 HandleSignalsState());
193 thread.WaitUntilDone(&result, &context, &elapsed); 200 thread.WaitUntilDone(&result, &context, &elapsed);
194 EXPECT_EQ(1u, result); 201 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, result);
195 EXPECT_EQ(7u, context); 202 EXPECT_EQ(7u, context);
196 EXPECT_GT(elapsed, (2 - 1) * test::EpsilonTimeout()); 203 EXPECT_GT(elapsed, (2 - 1) * test::EpsilonTimeout());
197 EXPECT_LT(elapsed, (2 + 1) * test::EpsilonTimeout()); 204 EXPECT_LT(elapsed, (2 + 1) * test::EpsilonTimeout());
198 } 205 }
199 206
200 // Awake some longer time after thread start. 207 // Awake some longer time after thread start.
201 { 208 {
202 WaitingThread thread(MOJO_DEADLINE_INDEFINITE); 209 WaitingThread thread(MOJO_DEADLINE_INDEFINITE);
203 thread.Start(); 210 thread.Start();
204 ThreadSleep(5 * test::EpsilonTimeout()); 211 ThreadSleep(5 * test::EpsilonTimeout());
205 thread.waiter()->Awake(2, 8); 212 thread.waiter()->Awake(8, Awakable::AwakeReason::CANCELLED,
213 HandleSignalsState());
206 thread.WaitUntilDone(&result, &context, &elapsed); 214 thread.WaitUntilDone(&result, &context, &elapsed);
207 EXPECT_EQ(2u, result); 215 EXPECT_EQ(MOJO_RESULT_CANCELLED, result);
208 EXPECT_EQ(8u, context); 216 EXPECT_EQ(8u, context);
209 EXPECT_GT(elapsed, (5 - 1) * test::EpsilonTimeout()); 217 EXPECT_GT(elapsed, (5 - 1) * test::EpsilonTimeout());
210 EXPECT_LT(elapsed, (5 + 1) * test::EpsilonTimeout()); 218 EXPECT_LT(elapsed, (5 + 1) * test::EpsilonTimeout());
211 } 219 }
212 } 220 }
213 221
214 TEST(WaiterTest, TimeOut) { 222 TEST(WaiterTest, TimeOut) {
215 Stopwatch stopwatch; 223 Stopwatch stopwatch;
216 MojoDeadline elapsed; 224 MojoDeadline elapsed;
217 225
(...skipping 28 matching lines...) Expand all
246 254
247 // The first |Awake()| should always win. 255 // The first |Awake()| should always win.
248 TEST(WaiterTest, MultipleAwakes) { 256 TEST(WaiterTest, MultipleAwakes) {
249 MojoResult result; 257 MojoResult result;
250 uint64_t context; 258 uint64_t context;
251 MojoDeadline elapsed; 259 MojoDeadline elapsed;
252 260
253 { 261 {
254 WaitingThread thread(MOJO_DEADLINE_INDEFINITE); 262 WaitingThread thread(MOJO_DEADLINE_INDEFINITE);
255 thread.Start(); 263 thread.Start();
256 thread.waiter()->Awake(MOJO_RESULT_OK, 1); 264 thread.waiter()->Awake(1, Awakable::AwakeReason::SATISFIED,
257 thread.waiter()->Awake(1, 2); 265 HandleSignalsState());
266 thread.waiter()->Awake(2, Awakable::AwakeReason::UNSATISFIABLE,
267 HandleSignalsState());
258 thread.WaitUntilDone(&result, &context, &elapsed); 268 thread.WaitUntilDone(&result, &context, &elapsed);
259 EXPECT_EQ(MOJO_RESULT_OK, result); 269 EXPECT_EQ(MOJO_RESULT_OK, result);
260 EXPECT_EQ(1u, context); 270 EXPECT_EQ(1u, context);
261 EXPECT_LT(elapsed, test::EpsilonTimeout()); 271 EXPECT_LT(elapsed, test::EpsilonTimeout());
262 } 272 }
263 273
264 { 274 {
265 WaitingThread thread(MOJO_DEADLINE_INDEFINITE); 275 WaitingThread thread(MOJO_DEADLINE_INDEFINITE);
266 thread.waiter()->Awake(1, 3); 276 thread.waiter()->Awake(3, Awakable::AwakeReason::UNSATISFIABLE,
277 HandleSignalsState());
267 thread.Start(); 278 thread.Start();
268 thread.waiter()->Awake(MOJO_RESULT_OK, 4); 279 thread.waiter()->Awake(4, Awakable::AwakeReason::SATISFIED,
280 HandleSignalsState());
269 thread.WaitUntilDone(&result, &context, &elapsed); 281 thread.WaitUntilDone(&result, &context, &elapsed);
270 EXPECT_EQ(1u, result); 282 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, result);
271 EXPECT_EQ(3u, context); 283 EXPECT_EQ(3u, context);
272 EXPECT_LT(elapsed, test::EpsilonTimeout()); 284 EXPECT_LT(elapsed, test::EpsilonTimeout());
273 } 285 }
274 286
275 { 287 {
276 WaitingThread thread(MOJO_DEADLINE_INDEFINITE); 288 WaitingThread thread(MOJO_DEADLINE_INDEFINITE);
277 thread.Start(); 289 thread.Start();
278 thread.waiter()->Awake(10, 5); 290 thread.waiter()->Awake(5, Awakable::AwakeReason::CANCELLED,
291 HandleSignalsState());
279 ThreadSleep(2 * test::EpsilonTimeout()); 292 ThreadSleep(2 * test::EpsilonTimeout());
280 thread.waiter()->Awake(20, 6); 293 thread.waiter()->Awake(6, Awakable::AwakeReason::UNSATISFIABLE,
294 HandleSignalsState());
281 thread.WaitUntilDone(&result, &context, &elapsed); 295 thread.WaitUntilDone(&result, &context, &elapsed);
282 EXPECT_EQ(10u, result); 296 EXPECT_EQ(MOJO_RESULT_CANCELLED, result);
283 EXPECT_EQ(5u, context); 297 EXPECT_EQ(5u, context);
284 EXPECT_LT(elapsed, test::EpsilonTimeout()); 298 EXPECT_LT(elapsed, test::EpsilonTimeout());
285 } 299 }
286 300
287 { 301 {
288 WaitingThread thread(10 * test::EpsilonTimeout()); 302 WaitingThread thread(10 * test::EpsilonTimeout());
289 thread.Start(); 303 thread.Start();
290 ThreadSleep(1 * test::EpsilonTimeout()); 304 ThreadSleep(1 * test::EpsilonTimeout());
291 thread.waiter()->Awake(MOJO_RESULT_FAILED_PRECONDITION, 7); 305 thread.waiter()->Awake(7, Awakable::AwakeReason::UNSATISFIABLE,
306 HandleSignalsState());
292 ThreadSleep(2 * test::EpsilonTimeout()); 307 ThreadSleep(2 * test::EpsilonTimeout());
293 thread.waiter()->Awake(MOJO_RESULT_OK, 8); 308 thread.waiter()->Awake(8, Awakable::AwakeReason::SATISFIED,
309 HandleSignalsState());
294 thread.WaitUntilDone(&result, &context, &elapsed); 310 thread.WaitUntilDone(&result, &context, &elapsed);
295 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, result); 311 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, result);
296 EXPECT_EQ(7u, context); 312 EXPECT_EQ(7u, context);
297 EXPECT_GT(elapsed, (1 - 1) * test::EpsilonTimeout()); 313 EXPECT_GT(elapsed, (1 - 1) * test::EpsilonTimeout());
298 EXPECT_LT(elapsed, (1 + 1) * test::EpsilonTimeout()); 314 EXPECT_LT(elapsed, (1 + 1) * test::EpsilonTimeout());
299 } 315 }
300 } 316 }
301 317
302 } // namespace 318 } // namespace
303 } // namespace system 319 } // namespace system
304 } // namespace mojo 320 } // namespace mojo
OLDNEW
« no previous file with comments | « mojo/edk/system/waiter.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698