| OLD | NEW |
| 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 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 97 scoped_refptr<MockSimpleDispatcher> d(new MockSimpleDispatcher()); | 97 scoped_refptr<MockSimpleDispatcher> d(new MockSimpleDispatcher()); |
| 98 Waiter w; | 98 Waiter w; |
| 99 uint32_t context = 0; | 99 uint32_t context = 0; |
| 100 HandleSignalsState hss; | 100 HandleSignalsState hss; |
| 101 | 101 |
| 102 // Try adding a readable waiter when already readable. | 102 // Try adding a readable waiter when already readable. |
| 103 w.Init(); | 103 w.Init(); |
| 104 d->SetSatisfiedSignals(MOJO_HANDLE_SIGNAL_READABLE); | 104 d->SetSatisfiedSignals(MOJO_HANDLE_SIGNAL_READABLE); |
| 105 hss = HandleSignalsState(); | 105 hss = HandleSignalsState(); |
| 106 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, | 106 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, |
| 107 d->AddWaiter(&w, MOJO_HANDLE_SIGNAL_READABLE, 0, &hss)); | 107 d->AddAwakable(&w, MOJO_HANDLE_SIGNAL_READABLE, 0, &hss)); |
| 108 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals); | 108 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals); |
| 109 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, | 109 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, |
| 110 hss.satisfiable_signals); | 110 hss.satisfiable_signals); |
| 111 // Shouldn't need to remove the waiter (it was not added). | 111 // Shouldn't need to remove the waiter (it was not added). |
| 112 | 112 |
| 113 // Wait (forever) for writable when already writable. | 113 // Wait (forever) for writable when already writable. |
| 114 w.Init(); | 114 w.Init(); |
| 115 d->SetSatisfiedSignals(MOJO_HANDLE_SIGNAL_READABLE); | 115 d->SetSatisfiedSignals(MOJO_HANDLE_SIGNAL_READABLE); |
| 116 ASSERT_EQ(MOJO_RESULT_OK, | 116 ASSERT_EQ(MOJO_RESULT_OK, |
| 117 d->AddWaiter(&w, MOJO_HANDLE_SIGNAL_WRITABLE, 1, nullptr)); | 117 d->AddAwakable(&w, MOJO_HANDLE_SIGNAL_WRITABLE, 1, nullptr)); |
| 118 d->SetSatisfiedSignals(MOJO_HANDLE_SIGNAL_WRITABLE); | 118 d->SetSatisfiedSignals(MOJO_HANDLE_SIGNAL_WRITABLE); |
| 119 stopwatch.Start(); | 119 stopwatch.Start(); |
| 120 EXPECT_EQ(MOJO_RESULT_OK, w.Wait(MOJO_DEADLINE_INDEFINITE, &context)); | 120 EXPECT_EQ(MOJO_RESULT_OK, w.Wait(MOJO_DEADLINE_INDEFINITE, &context)); |
| 121 EXPECT_LT(stopwatch.Elapsed(), test::EpsilonTimeout()); | 121 EXPECT_LT(stopwatch.Elapsed(), test::EpsilonTimeout()); |
| 122 EXPECT_EQ(1u, context); | 122 EXPECT_EQ(1u, context); |
| 123 hss = HandleSignalsState(); | 123 hss = HandleSignalsState(); |
| 124 d->RemoveWaiter(&w, &hss); | 124 d->RemoveAwakable(&w, &hss); |
| 125 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals); | 125 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals); |
| 126 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, | 126 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, |
| 127 hss.satisfiable_signals); | 127 hss.satisfiable_signals); |
| 128 | 128 |
| 129 // Wait for zero time for writable when already writable. | 129 // Wait for zero time for writable when already writable. |
| 130 w.Init(); | 130 w.Init(); |
| 131 d->SetSatisfiedSignals(MOJO_HANDLE_SIGNAL_READABLE); | 131 d->SetSatisfiedSignals(MOJO_HANDLE_SIGNAL_READABLE); |
| 132 ASSERT_EQ(MOJO_RESULT_OK, | 132 ASSERT_EQ(MOJO_RESULT_OK, |
| 133 d->AddWaiter(&w, MOJO_HANDLE_SIGNAL_WRITABLE, 2, nullptr)); | 133 d->AddAwakable(&w, MOJO_HANDLE_SIGNAL_WRITABLE, 2, nullptr)); |
| 134 d->SetSatisfiedSignals(MOJO_HANDLE_SIGNAL_WRITABLE); | 134 d->SetSatisfiedSignals(MOJO_HANDLE_SIGNAL_WRITABLE); |
| 135 stopwatch.Start(); | 135 stopwatch.Start(); |
| 136 EXPECT_EQ(MOJO_RESULT_OK, w.Wait(0, &context)); | 136 EXPECT_EQ(MOJO_RESULT_OK, w.Wait(0, &context)); |
| 137 EXPECT_LT(stopwatch.Elapsed(), test::EpsilonTimeout()); | 137 EXPECT_LT(stopwatch.Elapsed(), test::EpsilonTimeout()); |
| 138 EXPECT_EQ(2u, context); | 138 EXPECT_EQ(2u, context); |
| 139 hss = HandleSignalsState(); | 139 hss = HandleSignalsState(); |
| 140 d->RemoveWaiter(&w, &hss); | 140 d->RemoveAwakable(&w, &hss); |
| 141 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals); | 141 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals); |
| 142 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, | 142 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, |
| 143 hss.satisfiable_signals); | 143 hss.satisfiable_signals); |
| 144 | 144 |
| 145 // Wait for non-zero, finite time for writable when already writable. | 145 // Wait for non-zero, finite time for writable when already writable. |
| 146 w.Init(); | 146 w.Init(); |
| 147 d->SetSatisfiedSignals(MOJO_HANDLE_SIGNAL_READABLE); | 147 d->SetSatisfiedSignals(MOJO_HANDLE_SIGNAL_READABLE); |
| 148 ASSERT_EQ(MOJO_RESULT_OK, | 148 ASSERT_EQ(MOJO_RESULT_OK, |
| 149 d->AddWaiter(&w, MOJO_HANDLE_SIGNAL_WRITABLE, 3, nullptr)); | 149 d->AddAwakable(&w, MOJO_HANDLE_SIGNAL_WRITABLE, 3, nullptr)); |
| 150 d->SetSatisfiedSignals(MOJO_HANDLE_SIGNAL_WRITABLE); | 150 d->SetSatisfiedSignals(MOJO_HANDLE_SIGNAL_WRITABLE); |
| 151 stopwatch.Start(); | 151 stopwatch.Start(); |
| 152 EXPECT_EQ(MOJO_RESULT_OK, | 152 EXPECT_EQ(MOJO_RESULT_OK, |
| 153 w.Wait(2 * test::EpsilonTimeout().InMicroseconds(), &context)); | 153 w.Wait(2 * test::EpsilonTimeout().InMicroseconds(), &context)); |
| 154 EXPECT_LT(stopwatch.Elapsed(), test::EpsilonTimeout()); | 154 EXPECT_LT(stopwatch.Elapsed(), test::EpsilonTimeout()); |
| 155 EXPECT_EQ(3u, context); | 155 EXPECT_EQ(3u, context); |
| 156 hss = HandleSignalsState(); | 156 hss = HandleSignalsState(); |
| 157 d->RemoveWaiter(&w, &hss); | 157 d->RemoveAwakable(&w, &hss); |
| 158 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals); | 158 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals); |
| 159 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, | 159 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, |
| 160 hss.satisfiable_signals); | 160 hss.satisfiable_signals); |
| 161 | 161 |
| 162 // Wait for zero time for writable when not writable (will time out). | 162 // Wait for zero time for writable when not writable (will time out). |
| 163 w.Init(); | 163 w.Init(); |
| 164 d->SetSatisfiedSignals(MOJO_HANDLE_SIGNAL_READABLE); | 164 d->SetSatisfiedSignals(MOJO_HANDLE_SIGNAL_READABLE); |
| 165 ASSERT_EQ(MOJO_RESULT_OK, | 165 ASSERT_EQ(MOJO_RESULT_OK, |
| 166 d->AddWaiter(&w, MOJO_HANDLE_SIGNAL_WRITABLE, 4, nullptr)); | 166 d->AddAwakable(&w, MOJO_HANDLE_SIGNAL_WRITABLE, 4, nullptr)); |
| 167 stopwatch.Start(); | 167 stopwatch.Start(); |
| 168 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, w.Wait(0, nullptr)); | 168 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, w.Wait(0, nullptr)); |
| 169 EXPECT_LT(stopwatch.Elapsed(), test::EpsilonTimeout()); | 169 EXPECT_LT(stopwatch.Elapsed(), test::EpsilonTimeout()); |
| 170 hss = HandleSignalsState(); | 170 hss = HandleSignalsState(); |
| 171 d->RemoveWaiter(&w, &hss); | 171 d->RemoveAwakable(&w, &hss); |
| 172 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals); | 172 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals); |
| 173 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, | 173 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, |
| 174 hss.satisfiable_signals); | 174 hss.satisfiable_signals); |
| 175 | 175 |
| 176 // Wait for non-zero, finite time for writable when not writable (will time | 176 // Wait for non-zero, finite time for writable when not writable (will time |
| 177 // out). | 177 // out). |
| 178 w.Init(); | 178 w.Init(); |
| 179 d->SetSatisfiedSignals(MOJO_HANDLE_SIGNAL_READABLE); | 179 d->SetSatisfiedSignals(MOJO_HANDLE_SIGNAL_READABLE); |
| 180 ASSERT_EQ(MOJO_RESULT_OK, | 180 ASSERT_EQ(MOJO_RESULT_OK, |
| 181 d->AddWaiter(&w, MOJO_HANDLE_SIGNAL_WRITABLE, 5, nullptr)); | 181 d->AddAwakable(&w, MOJO_HANDLE_SIGNAL_WRITABLE, 5, nullptr)); |
| 182 stopwatch.Start(); | 182 stopwatch.Start(); |
| 183 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, | 183 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, |
| 184 w.Wait(2 * test::EpsilonTimeout().InMicroseconds(), nullptr)); | 184 w.Wait(2 * test::EpsilonTimeout().InMicroseconds(), nullptr)); |
| 185 base::TimeDelta elapsed = stopwatch.Elapsed(); | 185 base::TimeDelta elapsed = stopwatch.Elapsed(); |
| 186 EXPECT_GT(elapsed, (2 - 1) * test::EpsilonTimeout()); | 186 EXPECT_GT(elapsed, (2 - 1) * test::EpsilonTimeout()); |
| 187 EXPECT_LT(elapsed, (2 + 1) * test::EpsilonTimeout()); | 187 EXPECT_LT(elapsed, (2 + 1) * test::EpsilonTimeout()); |
| 188 hss = HandleSignalsState(); | 188 hss = HandleSignalsState(); |
| 189 d->RemoveWaiter(&w, &hss); | 189 d->RemoveAwakable(&w, &hss); |
| 190 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals); | 190 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals); |
| 191 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, | 191 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, |
| 192 hss.satisfiable_signals); | 192 hss.satisfiable_signals); |
| 193 | 193 |
| 194 EXPECT_EQ(MOJO_RESULT_OK, d->Close()); | 194 EXPECT_EQ(MOJO_RESULT_OK, d->Close()); |
| 195 } | 195 } |
| 196 | 196 |
| 197 TEST(SimpleDispatcherTest, BasicUnsatisfiable) { | 197 TEST(SimpleDispatcherTest, BasicUnsatisfiable) { |
| 198 test::Stopwatch stopwatch; | 198 test::Stopwatch stopwatch; |
| 199 | 199 |
| 200 scoped_refptr<MockSimpleDispatcher> d(new MockSimpleDispatcher()); | 200 scoped_refptr<MockSimpleDispatcher> d(new MockSimpleDispatcher()); |
| 201 Waiter w; | 201 Waiter w; |
| 202 uint32_t context = 0; | 202 uint32_t context = 0; |
| 203 HandleSignalsState hss; | 203 HandleSignalsState hss; |
| 204 | 204 |
| 205 // Try adding a writable waiter when it can never be writable. | 205 // Try adding a writable waiter when it can never be writable. |
| 206 w.Init(); | 206 w.Init(); |
| 207 d->SetSatisfiableSignals(MOJO_HANDLE_SIGNAL_READABLE); | 207 d->SetSatisfiableSignals(MOJO_HANDLE_SIGNAL_READABLE); |
| 208 d->SetSatisfiedSignals(0); | 208 d->SetSatisfiedSignals(0); |
| 209 hss = HandleSignalsState(); | 209 hss = HandleSignalsState(); |
| 210 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, | 210 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, |
| 211 d->AddWaiter(&w, MOJO_HANDLE_SIGNAL_WRITABLE, 1, &hss)); | 211 d->AddAwakable(&w, MOJO_HANDLE_SIGNAL_WRITABLE, 1, &hss)); |
| 212 EXPECT_EQ(0u, hss.satisfied_signals); | 212 EXPECT_EQ(0u, hss.satisfied_signals); |
| 213 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); | 213 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); |
| 214 // Shouldn't need to remove the waiter (it was not added). | 214 // Shouldn't need to remove the waiter (it was not added). |
| 215 | 215 |
| 216 // Wait (forever) for writable and then it becomes never writable. | 216 // Wait (forever) for writable and then it becomes never writable. |
| 217 w.Init(); | 217 w.Init(); |
| 218 d->SetSatisfiableSignals(MOJO_HANDLE_SIGNAL_READABLE | | 218 d->SetSatisfiableSignals(MOJO_HANDLE_SIGNAL_READABLE | |
| 219 MOJO_HANDLE_SIGNAL_WRITABLE); | 219 MOJO_HANDLE_SIGNAL_WRITABLE); |
| 220 ASSERT_EQ(MOJO_RESULT_OK, | 220 ASSERT_EQ(MOJO_RESULT_OK, |
| 221 d->AddWaiter(&w, MOJO_HANDLE_SIGNAL_WRITABLE, 2, nullptr)); | 221 d->AddAwakable(&w, MOJO_HANDLE_SIGNAL_WRITABLE, 2, nullptr)); |
| 222 d->SetSatisfiableSignals(MOJO_HANDLE_SIGNAL_READABLE); | 222 d->SetSatisfiableSignals(MOJO_HANDLE_SIGNAL_READABLE); |
| 223 stopwatch.Start(); | 223 stopwatch.Start(); |
| 224 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, | 224 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, |
| 225 w.Wait(MOJO_DEADLINE_INDEFINITE, &context)); | 225 w.Wait(MOJO_DEADLINE_INDEFINITE, &context)); |
| 226 EXPECT_LT(stopwatch.Elapsed(), test::EpsilonTimeout()); | 226 EXPECT_LT(stopwatch.Elapsed(), test::EpsilonTimeout()); |
| 227 EXPECT_EQ(2u, context); | 227 EXPECT_EQ(2u, context); |
| 228 hss = HandleSignalsState(); | 228 hss = HandleSignalsState(); |
| 229 d->RemoveWaiter(&w, &hss); | 229 d->RemoveAwakable(&w, &hss); |
| 230 EXPECT_EQ(0u, hss.satisfied_signals); | 230 EXPECT_EQ(0u, hss.satisfied_signals); |
| 231 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); | 231 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); |
| 232 | 232 |
| 233 // Wait for zero time for writable and then it becomes never writable. | 233 // Wait for zero time for writable and then it becomes never writable. |
| 234 w.Init(); | 234 w.Init(); |
| 235 d->SetSatisfiableSignals(MOJO_HANDLE_SIGNAL_READABLE | | 235 d->SetSatisfiableSignals(MOJO_HANDLE_SIGNAL_READABLE | |
| 236 MOJO_HANDLE_SIGNAL_WRITABLE); | 236 MOJO_HANDLE_SIGNAL_WRITABLE); |
| 237 ASSERT_EQ(MOJO_RESULT_OK, | 237 ASSERT_EQ(MOJO_RESULT_OK, |
| 238 d->AddWaiter(&w, MOJO_HANDLE_SIGNAL_WRITABLE, 3, nullptr)); | 238 d->AddAwakable(&w, MOJO_HANDLE_SIGNAL_WRITABLE, 3, nullptr)); |
| 239 d->SetSatisfiableSignals(MOJO_HANDLE_SIGNAL_READABLE); | 239 d->SetSatisfiableSignals(MOJO_HANDLE_SIGNAL_READABLE); |
| 240 stopwatch.Start(); | 240 stopwatch.Start(); |
| 241 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, w.Wait(0, &context)); | 241 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, w.Wait(0, &context)); |
| 242 EXPECT_LT(stopwatch.Elapsed(), test::EpsilonTimeout()); | 242 EXPECT_LT(stopwatch.Elapsed(), test::EpsilonTimeout()); |
| 243 EXPECT_EQ(3u, context); | 243 EXPECT_EQ(3u, context); |
| 244 hss = HandleSignalsState(); | 244 hss = HandleSignalsState(); |
| 245 d->RemoveWaiter(&w, &hss); | 245 d->RemoveAwakable(&w, &hss); |
| 246 EXPECT_EQ(0u, hss.satisfied_signals); | 246 EXPECT_EQ(0u, hss.satisfied_signals); |
| 247 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); | 247 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); |
| 248 | 248 |
| 249 // Wait for non-zero, finite time for writable and then it becomes never | 249 // Wait for non-zero, finite time for writable and then it becomes never |
| 250 // writable. | 250 // writable. |
| 251 w.Init(); | 251 w.Init(); |
| 252 d->SetSatisfiableSignals(MOJO_HANDLE_SIGNAL_READABLE | | 252 d->SetSatisfiableSignals(MOJO_HANDLE_SIGNAL_READABLE | |
| 253 MOJO_HANDLE_SIGNAL_WRITABLE); | 253 MOJO_HANDLE_SIGNAL_WRITABLE); |
| 254 ASSERT_EQ(MOJO_RESULT_OK, | 254 ASSERT_EQ(MOJO_RESULT_OK, |
| 255 d->AddWaiter(&w, MOJO_HANDLE_SIGNAL_WRITABLE, 4, nullptr)); | 255 d->AddAwakable(&w, MOJO_HANDLE_SIGNAL_WRITABLE, 4, nullptr)); |
| 256 d->SetSatisfiableSignals(MOJO_HANDLE_SIGNAL_READABLE); | 256 d->SetSatisfiableSignals(MOJO_HANDLE_SIGNAL_READABLE); |
| 257 stopwatch.Start(); | 257 stopwatch.Start(); |
| 258 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, | 258 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, |
| 259 w.Wait(2 * test::EpsilonTimeout().InMicroseconds(), &context)); | 259 w.Wait(2 * test::EpsilonTimeout().InMicroseconds(), &context)); |
| 260 EXPECT_LT(stopwatch.Elapsed(), test::EpsilonTimeout()); | 260 EXPECT_LT(stopwatch.Elapsed(), test::EpsilonTimeout()); |
| 261 EXPECT_EQ(4u, context); | 261 EXPECT_EQ(4u, context); |
| 262 hss = HandleSignalsState(); | 262 hss = HandleSignalsState(); |
| 263 d->RemoveWaiter(&w, &hss); | 263 d->RemoveAwakable(&w, &hss); |
| 264 EXPECT_EQ(0u, hss.satisfied_signals); | 264 EXPECT_EQ(0u, hss.satisfied_signals); |
| 265 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); | 265 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); |
| 266 | 266 |
| 267 EXPECT_EQ(MOJO_RESULT_OK, d->Close()); | 267 EXPECT_EQ(MOJO_RESULT_OK, d->Close()); |
| 268 } | 268 } |
| 269 | 269 |
| 270 TEST(SimpleDispatcherTest, BasicClosed) { | 270 TEST(SimpleDispatcherTest, BasicClosed) { |
| 271 test::Stopwatch stopwatch; | 271 test::Stopwatch stopwatch; |
| 272 | 272 |
| 273 scoped_refptr<MockSimpleDispatcher> d; | 273 scoped_refptr<MockSimpleDispatcher> d; |
| 274 Waiter w; | 274 Waiter w; |
| 275 uint32_t context = 0; | 275 uint32_t context = 0; |
| 276 HandleSignalsState hss; | 276 HandleSignalsState hss; |
| 277 | 277 |
| 278 // Try adding a writable waiter when the dispatcher has been closed. | 278 // Try adding a writable waiter when the dispatcher has been closed. |
| 279 d = new MockSimpleDispatcher(); | 279 d = new MockSimpleDispatcher(); |
| 280 w.Init(); | 280 w.Init(); |
| 281 EXPECT_EQ(MOJO_RESULT_OK, d->Close()); | 281 EXPECT_EQ(MOJO_RESULT_OK, d->Close()); |
| 282 hss = HandleSignalsState(); | 282 hss = HandleSignalsState(); |
| 283 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, | 283 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, |
| 284 d->AddWaiter(&w, MOJO_HANDLE_SIGNAL_WRITABLE, 1, &hss)); | 284 d->AddAwakable(&w, MOJO_HANDLE_SIGNAL_WRITABLE, 1, &hss)); |
| 285 EXPECT_EQ(0u, hss.satisfied_signals); | 285 EXPECT_EQ(0u, hss.satisfied_signals); |
| 286 EXPECT_EQ(0u, hss.satisfiable_signals); | 286 EXPECT_EQ(0u, hss.satisfiable_signals); |
| 287 // Shouldn't need to remove the waiter (it was not added). | 287 // Shouldn't need to remove the waiter (it was not added). |
| 288 | 288 |
| 289 // Wait (forever) for writable and then the dispatcher is closed. | 289 // Wait (forever) for writable and then the dispatcher is closed. |
| 290 d = new MockSimpleDispatcher(); | 290 d = new MockSimpleDispatcher(); |
| 291 w.Init(); | 291 w.Init(); |
| 292 ASSERT_EQ(MOJO_RESULT_OK, | 292 ASSERT_EQ(MOJO_RESULT_OK, |
| 293 d->AddWaiter(&w, MOJO_HANDLE_SIGNAL_WRITABLE, 2, nullptr)); | 293 d->AddAwakable(&w, MOJO_HANDLE_SIGNAL_WRITABLE, 2, nullptr)); |
| 294 EXPECT_EQ(MOJO_RESULT_OK, d->Close()); | 294 EXPECT_EQ(MOJO_RESULT_OK, d->Close()); |
| 295 stopwatch.Start(); | 295 stopwatch.Start(); |
| 296 EXPECT_EQ(MOJO_RESULT_CANCELLED, w.Wait(MOJO_DEADLINE_INDEFINITE, &context)); | 296 EXPECT_EQ(MOJO_RESULT_CANCELLED, w.Wait(MOJO_DEADLINE_INDEFINITE, &context)); |
| 297 EXPECT_LT(stopwatch.Elapsed(), test::EpsilonTimeout()); | 297 EXPECT_LT(stopwatch.Elapsed(), test::EpsilonTimeout()); |
| 298 EXPECT_EQ(2u, context); | 298 EXPECT_EQ(2u, context); |
| 299 // Don't need to remove waiters from closed dispatchers. | 299 // Don't need to remove waiters from closed dispatchers. |
| 300 | 300 |
| 301 // Wait for zero time for writable and then the dispatcher is closed. | 301 // Wait for zero time for writable and then the dispatcher is closed. |
| 302 d = new MockSimpleDispatcher(); | 302 d = new MockSimpleDispatcher(); |
| 303 w.Init(); | 303 w.Init(); |
| 304 ASSERT_EQ(MOJO_RESULT_OK, | 304 ASSERT_EQ(MOJO_RESULT_OK, |
| 305 d->AddWaiter(&w, MOJO_HANDLE_SIGNAL_WRITABLE, 3, nullptr)); | 305 d->AddAwakable(&w, MOJO_HANDLE_SIGNAL_WRITABLE, 3, nullptr)); |
| 306 EXPECT_EQ(MOJO_RESULT_OK, d->Close()); | 306 EXPECT_EQ(MOJO_RESULT_OK, d->Close()); |
| 307 stopwatch.Start(); | 307 stopwatch.Start(); |
| 308 EXPECT_EQ(MOJO_RESULT_CANCELLED, w.Wait(0, &context)); | 308 EXPECT_EQ(MOJO_RESULT_CANCELLED, w.Wait(0, &context)); |
| 309 EXPECT_LT(stopwatch.Elapsed(), test::EpsilonTimeout()); | 309 EXPECT_LT(stopwatch.Elapsed(), test::EpsilonTimeout()); |
| 310 EXPECT_EQ(3u, context); | 310 EXPECT_EQ(3u, context); |
| 311 // Don't need to remove waiters from closed dispatchers. | 311 // Don't need to remove waiters from closed dispatchers. |
| 312 | 312 |
| 313 // Wait for non-zero, finite time for writable and then the dispatcher is | 313 // Wait for non-zero, finite time for writable and then the dispatcher is |
| 314 // closed. | 314 // closed. |
| 315 d = new MockSimpleDispatcher(); | 315 d = new MockSimpleDispatcher(); |
| 316 w.Init(); | 316 w.Init(); |
| 317 ASSERT_EQ(MOJO_RESULT_OK, | 317 ASSERT_EQ(MOJO_RESULT_OK, |
| 318 d->AddWaiter(&w, MOJO_HANDLE_SIGNAL_WRITABLE, 4, nullptr)); | 318 d->AddAwakable(&w, MOJO_HANDLE_SIGNAL_WRITABLE, 4, nullptr)); |
| 319 EXPECT_EQ(MOJO_RESULT_OK, d->Close()); | 319 EXPECT_EQ(MOJO_RESULT_OK, d->Close()); |
| 320 stopwatch.Start(); | 320 stopwatch.Start(); |
| 321 EXPECT_EQ(MOJO_RESULT_CANCELLED, | 321 EXPECT_EQ(MOJO_RESULT_CANCELLED, |
| 322 w.Wait(2 * test::EpsilonTimeout().InMicroseconds(), &context)); | 322 w.Wait(2 * test::EpsilonTimeout().InMicroseconds(), &context)); |
| 323 EXPECT_LT(stopwatch.Elapsed(), test::EpsilonTimeout()); | 323 EXPECT_LT(stopwatch.Elapsed(), test::EpsilonTimeout()); |
| 324 EXPECT_EQ(4u, context); | 324 EXPECT_EQ(4u, context); |
| 325 // Don't need to remove waiters from closed dispatchers. | 325 // Don't need to remove waiters from closed dispatchers. |
| 326 } | 326 } |
| 327 | 327 |
| 328 #if defined(OS_WIN) | 328 #if defined(OS_WIN) |
| (...skipping 271 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 600 // Since we closed before joining, we can't say much about what each thread | 600 // Since we closed before joining, we can't say much about what each thread |
| 601 // saw as the state. | 601 // saw as the state. |
| 602 } | 602 } |
| 603 } | 603 } |
| 604 | 604 |
| 605 // TODO(vtl): Stress test? | 605 // TODO(vtl): Stress test? |
| 606 | 606 |
| 607 } // namespace | 607 } // namespace |
| 608 } // namespace system | 608 } // namespace system |
| 609 } // namespace mojo | 609 } // namespace mojo |
| OLD | NEW |