| 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 29 matching lines...) Expand all Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |