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

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

Issue 2084593005: Rationalize AddAwakable...() and RemoveAwakable...() methods. (Closed) Base URL: https://github.com/domokit/mojo.git@master
Patch Set: doh 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/simple_dispatcher.cc ('k') | mojo/edk/system/wait_set_dispatcher.cc » ('j') | 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/simple_dispatcher.h" 10 #include "mojo/edk/system/simple_dispatcher.h"
(...skipping 29 matching lines...) Expand all
40 auto d = MakeRefCounted<test::MockSimpleDispatcher>(); 40 auto d = MakeRefCounted<test::MockSimpleDispatcher>();
41 Waiter w; 41 Waiter w;
42 uint64_t context = 0; 42 uint64_t context = 0;
43 HandleSignalsState hss; 43 HandleSignalsState hss;
44 44
45 // Try adding a readable waiter when already readable. 45 // Try adding a readable waiter when already readable.
46 w.Init(); 46 w.Init();
47 d->SetSatisfiedSignals(MOJO_HANDLE_SIGNAL_READABLE); 47 d->SetSatisfiedSignals(MOJO_HANDLE_SIGNAL_READABLE);
48 hss = HandleSignalsState(); 48 hss = HandleSignalsState();
49 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, 49 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS,
50 d->AddAwakable(&w, MOJO_HANDLE_SIGNAL_READABLE, 0, &hss)); 50 d->AddAwakable(&w, 0, false, MOJO_HANDLE_SIGNAL_READABLE, &hss));
51 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals); 51 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals);
52 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, 52 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
53 hss.satisfiable_signals); 53 hss.satisfiable_signals);
54 // Shouldn't need to remove the waiter (it was not added). 54 // Shouldn't need to remove the waiter (it was not added).
55 55
56 // Wait (forever) for writable when already writable. 56 // Wait (forever) for writable when already writable.
57 w.Init(); 57 w.Init();
58 d->SetSatisfiedSignals(MOJO_HANDLE_SIGNAL_READABLE); 58 d->SetSatisfiedSignals(MOJO_HANDLE_SIGNAL_READABLE);
59 ASSERT_EQ(MOJO_RESULT_OK, 59 ASSERT_EQ(MOJO_RESULT_OK,
60 d->AddAwakable(&w, MOJO_HANDLE_SIGNAL_WRITABLE, 1, nullptr)); 60 d->AddAwakable(&w, 1, false, MOJO_HANDLE_SIGNAL_WRITABLE, nullptr));
61 d->SetSatisfiedSignals(MOJO_HANDLE_SIGNAL_WRITABLE); 61 d->SetSatisfiedSignals(MOJO_HANDLE_SIGNAL_WRITABLE);
62 stopwatch.Start(); 62 stopwatch.Start();
63 EXPECT_EQ(MOJO_RESULT_OK, 63 EXPECT_EQ(MOJO_RESULT_OK,
64 w.Wait(MOJO_DEADLINE_INDEFINITE, &context, nullptr)); 64 w.Wait(MOJO_DEADLINE_INDEFINITE, &context, nullptr));
65 EXPECT_LT(stopwatch.Elapsed(), test::EpsilonTimeout()); 65 EXPECT_LT(stopwatch.Elapsed(), test::EpsilonTimeout());
66 EXPECT_EQ(1u, context); 66 EXPECT_EQ(1u, context);
67 hss = HandleSignalsState(); 67 hss = HandleSignalsState();
68 d->RemoveAwakable(&w, &hss); 68 d->RemoveAwakable(false, &w, 0, &hss);
69 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals); 69 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals);
70 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, 70 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
71 hss.satisfiable_signals); 71 hss.satisfiable_signals);
72 72
73 // Wait for zero time for writable when already writable. 73 // Wait for zero time for writable when already writable.
74 w.Init(); 74 w.Init();
75 d->SetSatisfiedSignals(MOJO_HANDLE_SIGNAL_READABLE); 75 d->SetSatisfiedSignals(MOJO_HANDLE_SIGNAL_READABLE);
76 ASSERT_EQ(MOJO_RESULT_OK, 76 ASSERT_EQ(MOJO_RESULT_OK,
77 d->AddAwakable(&w, MOJO_HANDLE_SIGNAL_WRITABLE, 2, nullptr)); 77 d->AddAwakable(&w, 2, false, MOJO_HANDLE_SIGNAL_WRITABLE, nullptr));
78 d->SetSatisfiedSignals(MOJO_HANDLE_SIGNAL_WRITABLE); 78 d->SetSatisfiedSignals(MOJO_HANDLE_SIGNAL_WRITABLE);
79 stopwatch.Start(); 79 stopwatch.Start();
80 EXPECT_EQ(MOJO_RESULT_OK, w.Wait(0, &context, nullptr)); 80 EXPECT_EQ(MOJO_RESULT_OK, w.Wait(0, &context, nullptr));
81 EXPECT_LT(stopwatch.Elapsed(), test::EpsilonTimeout()); 81 EXPECT_LT(stopwatch.Elapsed(), test::EpsilonTimeout());
82 EXPECT_EQ(2u, context); 82 EXPECT_EQ(2u, context);
83 hss = HandleSignalsState(); 83 hss = HandleSignalsState();
84 d->RemoveAwakable(&w, &hss); 84 d->RemoveAwakable(false, &w, 0, &hss);
85 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals); 85 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals);
86 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, 86 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
87 hss.satisfiable_signals); 87 hss.satisfiable_signals);
88 88
89 // Wait for non-zero, finite time for writable when already writable. 89 // Wait for non-zero, finite time for writable when already writable.
90 w.Init(); 90 w.Init();
91 d->SetSatisfiedSignals(MOJO_HANDLE_SIGNAL_READABLE); 91 d->SetSatisfiedSignals(MOJO_HANDLE_SIGNAL_READABLE);
92 ASSERT_EQ(MOJO_RESULT_OK, 92 ASSERT_EQ(MOJO_RESULT_OK,
93 d->AddAwakable(&w, MOJO_HANDLE_SIGNAL_WRITABLE, 3, nullptr)); 93 d->AddAwakable(&w, 3, false, MOJO_HANDLE_SIGNAL_WRITABLE, nullptr));
94 d->SetSatisfiedSignals(MOJO_HANDLE_SIGNAL_WRITABLE); 94 d->SetSatisfiedSignals(MOJO_HANDLE_SIGNAL_WRITABLE);
95 stopwatch.Start(); 95 stopwatch.Start();
96 EXPECT_EQ(MOJO_RESULT_OK, 96 EXPECT_EQ(MOJO_RESULT_OK,
97 w.Wait(2 * test::EpsilonTimeout(), &context, nullptr)); 97 w.Wait(2 * test::EpsilonTimeout(), &context, nullptr));
98 EXPECT_LT(stopwatch.Elapsed(), test::EpsilonTimeout()); 98 EXPECT_LT(stopwatch.Elapsed(), test::EpsilonTimeout());
99 EXPECT_EQ(3u, context); 99 EXPECT_EQ(3u, context);
100 hss = HandleSignalsState(); 100 hss = HandleSignalsState();
101 d->RemoveAwakable(&w, &hss); 101 d->RemoveAwakable(false, &w, 0, &hss);
102 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals); 102 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals);
103 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, 103 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
104 hss.satisfiable_signals); 104 hss.satisfiable_signals);
105 105
106 // Wait for zero time for writable when not writable (will time out). 106 // Wait for zero time for writable when not writable (will time out).
107 w.Init(); 107 w.Init();
108 d->SetSatisfiedSignals(MOJO_HANDLE_SIGNAL_READABLE); 108 d->SetSatisfiedSignals(MOJO_HANDLE_SIGNAL_READABLE);
109 ASSERT_EQ(MOJO_RESULT_OK, 109 ASSERT_EQ(MOJO_RESULT_OK,
110 d->AddAwakable(&w, MOJO_HANDLE_SIGNAL_WRITABLE, 4, nullptr)); 110 d->AddAwakable(&w, 4, false, MOJO_HANDLE_SIGNAL_WRITABLE, nullptr));
111 stopwatch.Start(); 111 stopwatch.Start();
112 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, w.Wait(0, nullptr, nullptr)); 112 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, w.Wait(0, nullptr, nullptr));
113 EXPECT_LT(stopwatch.Elapsed(), test::EpsilonTimeout()); 113 EXPECT_LT(stopwatch.Elapsed(), test::EpsilonTimeout());
114 hss = HandleSignalsState(); 114 hss = HandleSignalsState();
115 d->RemoveAwakable(&w, &hss); 115 d->RemoveAwakable(false, &w, 0, &hss);
116 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals); 116 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals);
117 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, 117 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
118 hss.satisfiable_signals); 118 hss.satisfiable_signals);
119 119
120 // Wait for non-zero, finite time for writable when not writable (will time 120 // Wait for non-zero, finite time for writable when not writable (will time
121 // out). 121 // out).
122 w.Init(); 122 w.Init();
123 d->SetSatisfiedSignals(MOJO_HANDLE_SIGNAL_READABLE); 123 d->SetSatisfiedSignals(MOJO_HANDLE_SIGNAL_READABLE);
124 ASSERT_EQ(MOJO_RESULT_OK, 124 ASSERT_EQ(MOJO_RESULT_OK,
125 d->AddAwakable(&w, MOJO_HANDLE_SIGNAL_WRITABLE, 5, nullptr)); 125 d->AddAwakable(&w, 5, false, MOJO_HANDLE_SIGNAL_WRITABLE, nullptr));
126 stopwatch.Start(); 126 stopwatch.Start();
127 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, 127 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED,
128 w.Wait(2 * test::EpsilonTimeout(), nullptr, nullptr)); 128 w.Wait(2 * test::EpsilonTimeout(), nullptr, nullptr));
129 MojoDeadline elapsed = stopwatch.Elapsed(); 129 MojoDeadline elapsed = stopwatch.Elapsed();
130 EXPECT_GT(elapsed, (2 - 1) * test::EpsilonTimeout()); 130 EXPECT_GT(elapsed, (2 - 1) * test::EpsilonTimeout());
131 EXPECT_LT(elapsed, (2 + 1) * test::EpsilonTimeout()); 131 EXPECT_LT(elapsed, (2 + 1) * test::EpsilonTimeout());
132 hss = HandleSignalsState(); 132 hss = HandleSignalsState();
133 d->RemoveAwakable(&w, &hss); 133 d->RemoveAwakable(false, &w, 0, &hss);
134 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals); 134 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals);
135 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, 135 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
136 hss.satisfiable_signals); 136 hss.satisfiable_signals);
137 137
138 EXPECT_EQ(MOJO_RESULT_OK, d->Close()); 138 EXPECT_EQ(MOJO_RESULT_OK, d->Close());
139 } 139 }
140 140
141 TEST(SimpleDispatcherTest, BasicUnsatisfiable) { 141 TEST(SimpleDispatcherTest, BasicUnsatisfiable) {
142 Stopwatch stopwatch; 142 Stopwatch stopwatch;
143 143
144 auto d = MakeRefCounted<test::MockSimpleDispatcher>(); 144 auto d = MakeRefCounted<test::MockSimpleDispatcher>();
145 Waiter w; 145 Waiter w;
146 uint64_t context = 0; 146 uint64_t context = 0;
147 HandleSignalsState hss; 147 HandleSignalsState hss;
148 148
149 // Try adding a writable waiter when it can never be writable. 149 // Try adding a writable waiter when it can never be writable.
150 w.Init(); 150 w.Init();
151 d->SetSatisfiableSignals(MOJO_HANDLE_SIGNAL_READABLE); 151 d->SetSatisfiableSignals(MOJO_HANDLE_SIGNAL_READABLE);
152 d->SetSatisfiedSignals(0); 152 d->SetSatisfiedSignals(0);
153 hss = HandleSignalsState(); 153 hss = HandleSignalsState();
154 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, 154 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
155 d->AddAwakable(&w, MOJO_HANDLE_SIGNAL_WRITABLE, 1, &hss)); 155 d->AddAwakable(&w, 1, false, MOJO_HANDLE_SIGNAL_WRITABLE, &hss));
156 EXPECT_EQ(0u, hss.satisfied_signals); 156 EXPECT_EQ(0u, hss.satisfied_signals);
157 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); 157 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals);
158 // Shouldn't need to remove the waiter (it was not added). 158 // Shouldn't need to remove the waiter (it was not added).
159 159
160 // Wait (forever) for writable and then it becomes never writable. 160 // Wait (forever) for writable and then it becomes never writable.
161 w.Init(); 161 w.Init();
162 d->SetSatisfiableSignals(MOJO_HANDLE_SIGNAL_READABLE | 162 d->SetSatisfiableSignals(MOJO_HANDLE_SIGNAL_READABLE |
163 MOJO_HANDLE_SIGNAL_WRITABLE); 163 MOJO_HANDLE_SIGNAL_WRITABLE);
164 ASSERT_EQ(MOJO_RESULT_OK, 164 ASSERT_EQ(MOJO_RESULT_OK,
165 d->AddAwakable(&w, MOJO_HANDLE_SIGNAL_WRITABLE, 2, nullptr)); 165 d->AddAwakable(&w, 2, false, MOJO_HANDLE_SIGNAL_WRITABLE, nullptr));
166 d->SetSatisfiableSignals(MOJO_HANDLE_SIGNAL_READABLE); 166 d->SetSatisfiableSignals(MOJO_HANDLE_SIGNAL_READABLE);
167 stopwatch.Start(); 167 stopwatch.Start();
168 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, 168 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
169 w.Wait(MOJO_DEADLINE_INDEFINITE, &context, nullptr)); 169 w.Wait(MOJO_DEADLINE_INDEFINITE, &context, nullptr));
170 EXPECT_LT(stopwatch.Elapsed(), test::EpsilonTimeout()); 170 EXPECT_LT(stopwatch.Elapsed(), test::EpsilonTimeout());
171 EXPECT_EQ(2u, context); 171 EXPECT_EQ(2u, context);
172 hss = HandleSignalsState(); 172 hss = HandleSignalsState();
173 d->RemoveAwakable(&w, &hss); 173 d->RemoveAwakable(false, &w, 0, &hss);
174 EXPECT_EQ(0u, hss.satisfied_signals); 174 EXPECT_EQ(0u, hss.satisfied_signals);
175 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); 175 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals);
176 176
177 // Wait for zero time for writable and then it becomes never writable. 177 // Wait for zero time for writable and then it becomes never writable.
178 w.Init(); 178 w.Init();
179 d->SetSatisfiableSignals(MOJO_HANDLE_SIGNAL_READABLE | 179 d->SetSatisfiableSignals(MOJO_HANDLE_SIGNAL_READABLE |
180 MOJO_HANDLE_SIGNAL_WRITABLE); 180 MOJO_HANDLE_SIGNAL_WRITABLE);
181 ASSERT_EQ(MOJO_RESULT_OK, 181 ASSERT_EQ(MOJO_RESULT_OK,
182 d->AddAwakable(&w, MOJO_HANDLE_SIGNAL_WRITABLE, 3, nullptr)); 182 d->AddAwakable(&w, 3, false, MOJO_HANDLE_SIGNAL_WRITABLE, nullptr));
183 d->SetSatisfiableSignals(MOJO_HANDLE_SIGNAL_READABLE); 183 d->SetSatisfiableSignals(MOJO_HANDLE_SIGNAL_READABLE);
184 stopwatch.Start(); 184 stopwatch.Start();
185 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, w.Wait(0, &context, nullptr)); 185 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, w.Wait(0, &context, nullptr));
186 EXPECT_LT(stopwatch.Elapsed(), test::EpsilonTimeout()); 186 EXPECT_LT(stopwatch.Elapsed(), test::EpsilonTimeout());
187 EXPECT_EQ(3u, context); 187 EXPECT_EQ(3u, context);
188 hss = HandleSignalsState(); 188 hss = HandleSignalsState();
189 d->RemoveAwakable(&w, &hss); 189 d->RemoveAwakable(false, &w, 0, &hss);
190 EXPECT_EQ(0u, hss.satisfied_signals); 190 EXPECT_EQ(0u, hss.satisfied_signals);
191 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); 191 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals);
192 192
193 // Wait for non-zero, finite time for writable and then it becomes never 193 // Wait for non-zero, finite time for writable and then it becomes never
194 // writable. 194 // writable.
195 w.Init(); 195 w.Init();
196 d->SetSatisfiableSignals(MOJO_HANDLE_SIGNAL_READABLE | 196 d->SetSatisfiableSignals(MOJO_HANDLE_SIGNAL_READABLE |
197 MOJO_HANDLE_SIGNAL_WRITABLE); 197 MOJO_HANDLE_SIGNAL_WRITABLE);
198 ASSERT_EQ(MOJO_RESULT_OK, 198 ASSERT_EQ(MOJO_RESULT_OK,
199 d->AddAwakable(&w, MOJO_HANDLE_SIGNAL_WRITABLE, 4, nullptr)); 199 d->AddAwakable(&w, 4, false, MOJO_HANDLE_SIGNAL_WRITABLE, nullptr));
200 d->SetSatisfiableSignals(MOJO_HANDLE_SIGNAL_READABLE); 200 d->SetSatisfiableSignals(MOJO_HANDLE_SIGNAL_READABLE);
201 stopwatch.Start(); 201 stopwatch.Start();
202 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, 202 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
203 w.Wait(2 * test::EpsilonTimeout(), &context, nullptr)); 203 w.Wait(2 * test::EpsilonTimeout(), &context, nullptr));
204 EXPECT_LT(stopwatch.Elapsed(), test::EpsilonTimeout()); 204 EXPECT_LT(stopwatch.Elapsed(), test::EpsilonTimeout());
205 EXPECT_EQ(4u, context); 205 EXPECT_EQ(4u, context);
206 hss = HandleSignalsState(); 206 hss = HandleSignalsState();
207 d->RemoveAwakable(&w, &hss); 207 d->RemoveAwakable(false, &w, 0, &hss);
208 EXPECT_EQ(0u, hss.satisfied_signals); 208 EXPECT_EQ(0u, hss.satisfied_signals);
209 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); 209 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals);
210 210
211 EXPECT_EQ(MOJO_RESULT_OK, d->Close()); 211 EXPECT_EQ(MOJO_RESULT_OK, d->Close());
212 } 212 }
213 213
214 TEST(SimpleDispatcherTest, BasicClosed) { 214 TEST(SimpleDispatcherTest, BasicClosed) {
215 Stopwatch stopwatch; 215 Stopwatch stopwatch;
216 216
217 RefPtr<test::MockSimpleDispatcher> d; 217 RefPtr<test::MockSimpleDispatcher> d;
218 Waiter w; 218 Waiter w;
219 uint64_t context = 0; 219 uint64_t context = 0;
220 HandleSignalsState hss; 220 HandleSignalsState hss;
221 221
222 // Try adding a writable waiter when the dispatcher has been closed. 222 // Try adding a writable waiter when the dispatcher has been closed.
223 d = MakeRefCounted<test::MockSimpleDispatcher>(); 223 d = MakeRefCounted<test::MockSimpleDispatcher>();
224 w.Init(); 224 w.Init();
225 EXPECT_EQ(MOJO_RESULT_OK, d->Close()); 225 EXPECT_EQ(MOJO_RESULT_OK, d->Close());
226 hss = HandleSignalsState(); 226 hss = HandleSignalsState();
227 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, 227 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
228 d->AddAwakable(&w, MOJO_HANDLE_SIGNAL_WRITABLE, 1, &hss)); 228 d->AddAwakable(&w, 1, false, MOJO_HANDLE_SIGNAL_WRITABLE, &hss));
229 EXPECT_EQ(0u, hss.satisfied_signals); 229 EXPECT_EQ(0u, hss.satisfied_signals);
230 EXPECT_EQ(0u, hss.satisfiable_signals); 230 EXPECT_EQ(0u, hss.satisfiable_signals);
231 // Shouldn't need to remove the waiter (it was not added). 231 // Shouldn't need to remove the waiter (it was not added).
232 232
233 // Wait (forever) for writable and then the dispatcher is closed. 233 // Wait (forever) for writable and then the dispatcher is closed.
234 d = MakeRefCounted<test::MockSimpleDispatcher>(); 234 d = MakeRefCounted<test::MockSimpleDispatcher>();
235 w.Init(); 235 w.Init();
236 ASSERT_EQ(MOJO_RESULT_OK, 236 ASSERT_EQ(MOJO_RESULT_OK,
237 d->AddAwakable(&w, MOJO_HANDLE_SIGNAL_WRITABLE, 2, nullptr)); 237 d->AddAwakable(&w, 2, false, MOJO_HANDLE_SIGNAL_WRITABLE, nullptr));
238 EXPECT_EQ(MOJO_RESULT_OK, d->Close()); 238 EXPECT_EQ(MOJO_RESULT_OK, d->Close());
239 stopwatch.Start(); 239 stopwatch.Start();
240 EXPECT_EQ(MOJO_RESULT_CANCELLED, 240 EXPECT_EQ(MOJO_RESULT_CANCELLED,
241 w.Wait(MOJO_DEADLINE_INDEFINITE, &context, nullptr)); 241 w.Wait(MOJO_DEADLINE_INDEFINITE, &context, nullptr));
242 EXPECT_LT(stopwatch.Elapsed(), test::EpsilonTimeout()); 242 EXPECT_LT(stopwatch.Elapsed(), test::EpsilonTimeout());
243 EXPECT_EQ(2u, context); 243 EXPECT_EQ(2u, context);
244 // Don't need to remove waiters from closed dispatchers. 244 // Don't need to remove waiters from closed dispatchers.
245 245
246 // Wait for zero time for writable and then the dispatcher is closed. 246 // Wait for zero time for writable and then the dispatcher is closed.
247 d = MakeRefCounted<test::MockSimpleDispatcher>(); 247 d = MakeRefCounted<test::MockSimpleDispatcher>();
248 w.Init(); 248 w.Init();
249 ASSERT_EQ(MOJO_RESULT_OK, 249 ASSERT_EQ(MOJO_RESULT_OK,
250 d->AddAwakable(&w, MOJO_HANDLE_SIGNAL_WRITABLE, 3, nullptr)); 250 d->AddAwakable(&w, 3, false, MOJO_HANDLE_SIGNAL_WRITABLE, nullptr));
251 EXPECT_EQ(MOJO_RESULT_OK, d->Close()); 251 EXPECT_EQ(MOJO_RESULT_OK, d->Close());
252 stopwatch.Start(); 252 stopwatch.Start();
253 EXPECT_EQ(MOJO_RESULT_CANCELLED, w.Wait(0, &context, nullptr)); 253 EXPECT_EQ(MOJO_RESULT_CANCELLED, w.Wait(0, &context, nullptr));
254 EXPECT_LT(stopwatch.Elapsed(), test::EpsilonTimeout()); 254 EXPECT_LT(stopwatch.Elapsed(), test::EpsilonTimeout());
255 EXPECT_EQ(3u, context); 255 EXPECT_EQ(3u, context);
256 // Don't need to remove waiters from closed dispatchers. 256 // Don't need to remove waiters from closed dispatchers.
257 257
258 // Wait for non-zero, finite time for writable and then the dispatcher is 258 // Wait for non-zero, finite time for writable and then the dispatcher is
259 // closed. 259 // closed.
260 d = MakeRefCounted<test::MockSimpleDispatcher>(); 260 d = MakeRefCounted<test::MockSimpleDispatcher>();
261 w.Init(); 261 w.Init();
262 ASSERT_EQ(MOJO_RESULT_OK, 262 ASSERT_EQ(MOJO_RESULT_OK,
263 d->AddAwakable(&w, MOJO_HANDLE_SIGNAL_WRITABLE, 4, nullptr)); 263 d->AddAwakable(&w, 4, false, MOJO_HANDLE_SIGNAL_WRITABLE, nullptr));
264 EXPECT_EQ(MOJO_RESULT_OK, d->Close()); 264 EXPECT_EQ(MOJO_RESULT_OK, d->Close());
265 stopwatch.Start(); 265 stopwatch.Start();
266 EXPECT_EQ(MOJO_RESULT_CANCELLED, 266 EXPECT_EQ(MOJO_RESULT_CANCELLED,
267 w.Wait(2 * test::EpsilonTimeout(), &context, nullptr)); 267 w.Wait(2 * test::EpsilonTimeout(), &context, nullptr));
268 EXPECT_LT(stopwatch.Elapsed(), test::EpsilonTimeout()); 268 EXPECT_LT(stopwatch.Elapsed(), test::EpsilonTimeout());
269 EXPECT_EQ(4u, context); 269 EXPECT_EQ(4u, context);
270 // Don't need to remove waiters from closed dispatchers. 270 // Don't need to remove waiters from closed dispatchers.
271 } 271 }
272 272
273 TEST(SimpleDispatcherTest, BasicThreaded) { 273 TEST(SimpleDispatcherTest, BasicThreaded) {
(...skipping 257 matching lines...) Expand 10 before | Expand all | Expand 10 after
531 // Since we closed before joining, we can't say much about what each thread 531 // Since we closed before joining, we can't say much about what each thread
532 // saw as the state. 532 // saw as the state.
533 } 533 }
534 } 534 }
535 535
536 // TODO(vtl): Stress test? 536 // TODO(vtl): Stress test?
537 537
538 } // namespace 538 } // namespace
539 } // namespace system 539 } // namespace system
540 } // namespace mojo 540 } // namespace mojo
OLDNEW
« no previous file with comments | « mojo/edk/system/simple_dispatcher.cc ('k') | mojo/edk/system/wait_set_dispatcher.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698