| 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/waiter.h" | 10 #include "mojo/edk/system/waiter.h" |
| 11 | 11 |
| 12 #include <stdint.h> | 12 #include <stdint.h> |
| 13 | 13 |
| 14 #include "mojo/edk/platform/thread_utils.h" |
| 14 #include "mojo/edk/system/test/simple_test_thread.h" | 15 #include "mojo/edk/system/test/simple_test_thread.h" |
| 15 #include "mojo/edk/system/test/sleep.h" | |
| 16 #include "mojo/edk/system/test/stopwatch.h" | 16 #include "mojo/edk/system/test/stopwatch.h" |
| 17 #include "mojo/edk/system/test/timeouts.h" | 17 #include "mojo/edk/system/test/timeouts.h" |
| 18 #include "mojo/edk/util/mutex.h" | 18 #include "mojo/edk/util/mutex.h" |
| 19 #include "mojo/public/cpp/system/macros.h" | 19 #include "mojo/public/cpp/system/macros.h" |
| 20 #include "testing/gtest/include/gtest/gtest.h" | 20 #include "testing/gtest/include/gtest/gtest.h" |
| 21 | 21 |
| 22 using mojo::platform::ThreadSleep; |
| 22 using mojo::util::Mutex; | 23 using mojo::util::Mutex; |
| 23 using mojo::util::MutexLocker; | 24 using mojo::util::MutexLocker; |
| 24 | 25 |
| 25 namespace mojo { | 26 namespace mojo { |
| 26 namespace system { | 27 namespace system { |
| 27 namespace { | 28 namespace { |
| 28 | 29 |
| 29 const unsigned kPollTimeMs = 10; | 30 const unsigned kPollTimeMs = 10; |
| 30 | 31 |
| 31 class WaitingThread : public test::SimpleTestThread { | 32 class WaitingThread : public test::SimpleTestThread { |
| (...skipping 15 matching lines...) Expand all Loading... |
| 47 { | 48 { |
| 48 MutexLocker locker(&mutex_); | 49 MutexLocker locker(&mutex_); |
| 49 if (done_) { | 50 if (done_) { |
| 50 *result = result_; | 51 *result = result_; |
| 51 *context = context_; | 52 *context = context_; |
| 52 *elapsed = elapsed_; | 53 *elapsed = elapsed_; |
| 53 break; | 54 break; |
| 54 } | 55 } |
| 55 } | 56 } |
| 56 | 57 |
| 57 test::SleepMilliseconds(kPollTimeMs); | 58 ThreadSleep(test::DeadlineFromMilliseconds(kPollTimeMs)); |
| 58 } | 59 } |
| 59 } | 60 } |
| 60 | 61 |
| 61 Waiter* waiter() { return &waiter_; } | 62 Waiter* waiter() { return &waiter_; } |
| 62 | 63 |
| 63 private: | 64 private: |
| 64 void Run() override { | 65 void Run() override { |
| 65 test::Stopwatch stopwatch; | 66 test::Stopwatch stopwatch; |
| 66 MojoResult result; | 67 MojoResult result; |
| 67 uint32_t context = static_cast<uint32_t>(-1); | 68 uint32_t context = static_cast<uint32_t>(-1); |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 118 thread.WaitUntilDone(&result, &context, &elapsed); | 119 thread.WaitUntilDone(&result, &context, &elapsed); |
| 119 EXPECT_EQ(MOJO_RESULT_CANCELLED, result); | 120 EXPECT_EQ(MOJO_RESULT_CANCELLED, result); |
| 120 EXPECT_EQ(2u, context); | 121 EXPECT_EQ(2u, context); |
| 121 EXPECT_LT(elapsed, test::EpsilonTimeout()); | 122 EXPECT_LT(elapsed, test::EpsilonTimeout()); |
| 122 } | 123 } |
| 123 | 124 |
| 124 // Awake some time after thread start. | 125 // Awake some time after thread start. |
| 125 { | 126 { |
| 126 WaitingThread thread(10 * test::EpsilonTimeout()); | 127 WaitingThread thread(10 * test::EpsilonTimeout()); |
| 127 thread.Start(); | 128 thread.Start(); |
| 128 test::Sleep(2 * test::EpsilonTimeout()); | 129 ThreadSleep(2 * test::EpsilonTimeout()); |
| 129 thread.waiter()->Awake(1, 3); | 130 thread.waiter()->Awake(1, 3); |
| 130 thread.WaitUntilDone(&result, &context, &elapsed); | 131 thread.WaitUntilDone(&result, &context, &elapsed); |
| 131 EXPECT_EQ(1u, result); | 132 EXPECT_EQ(1u, result); |
| 132 EXPECT_EQ(3u, context); | 133 EXPECT_EQ(3u, context); |
| 133 EXPECT_GT(elapsed, (2 - 1) * test::EpsilonTimeout()); | 134 EXPECT_GT(elapsed, (2 - 1) * test::EpsilonTimeout()); |
| 134 EXPECT_LT(elapsed, (2 + 1) * test::EpsilonTimeout()); | 135 EXPECT_LT(elapsed, (2 + 1) * test::EpsilonTimeout()); |
| 135 } | 136 } |
| 136 | 137 |
| 137 // Awake some longer time after thread start. | 138 // Awake some longer time after thread start. |
| 138 { | 139 { |
| 139 WaitingThread thread(10 * test::EpsilonTimeout()); | 140 WaitingThread thread(10 * test::EpsilonTimeout()); |
| 140 thread.Start(); | 141 thread.Start(); |
| 141 test::Sleep(5 * test::EpsilonTimeout()); | 142 ThreadSleep(5 * test::EpsilonTimeout()); |
| 142 thread.waiter()->Awake(2, 4); | 143 thread.waiter()->Awake(2, 4); |
| 143 thread.WaitUntilDone(&result, &context, &elapsed); | 144 thread.WaitUntilDone(&result, &context, &elapsed); |
| 144 EXPECT_EQ(2u, result); | 145 EXPECT_EQ(2u, result); |
| 145 EXPECT_EQ(4u, context); | 146 EXPECT_EQ(4u, context); |
| 146 EXPECT_GT(elapsed, (5 - 1) * test::EpsilonTimeout()); | 147 EXPECT_GT(elapsed, (5 - 1) * test::EpsilonTimeout()); |
| 147 EXPECT_LT(elapsed, (5 + 1) * test::EpsilonTimeout()); | 148 EXPECT_LT(elapsed, (5 + 1) * test::EpsilonTimeout()); |
| 148 } | 149 } |
| 149 | 150 |
| 150 // Don't awake -- time out (on another thread). | 151 // Don't awake -- time out (on another thread). |
| 151 { | 152 { |
| (...skipping 27 matching lines...) Expand all Loading... |
| 179 thread.WaitUntilDone(&result, &context, &elapsed); | 180 thread.WaitUntilDone(&result, &context, &elapsed); |
| 180 EXPECT_EQ(MOJO_RESULT_CANCELLED, result); | 181 EXPECT_EQ(MOJO_RESULT_CANCELLED, result); |
| 181 EXPECT_EQ(6u, context); | 182 EXPECT_EQ(6u, context); |
| 182 EXPECT_LT(elapsed, test::EpsilonTimeout()); | 183 EXPECT_LT(elapsed, test::EpsilonTimeout()); |
| 183 } | 184 } |
| 184 | 185 |
| 185 // Awake some time after thread start. | 186 // Awake some time after thread start. |
| 186 { | 187 { |
| 187 WaitingThread thread(MOJO_DEADLINE_INDEFINITE); | 188 WaitingThread thread(MOJO_DEADLINE_INDEFINITE); |
| 188 thread.Start(); | 189 thread.Start(); |
| 189 test::Sleep(2 * test::EpsilonTimeout()); | 190 ThreadSleep(2 * test::EpsilonTimeout()); |
| 190 thread.waiter()->Awake(1, 7); | 191 thread.waiter()->Awake(1, 7); |
| 191 thread.WaitUntilDone(&result, &context, &elapsed); | 192 thread.WaitUntilDone(&result, &context, &elapsed); |
| 192 EXPECT_EQ(1u, result); | 193 EXPECT_EQ(1u, result); |
| 193 EXPECT_EQ(7u, context); | 194 EXPECT_EQ(7u, context); |
| 194 EXPECT_GT(elapsed, (2 - 1) * test::EpsilonTimeout()); | 195 EXPECT_GT(elapsed, (2 - 1) * test::EpsilonTimeout()); |
| 195 EXPECT_LT(elapsed, (2 + 1) * test::EpsilonTimeout()); | 196 EXPECT_LT(elapsed, (2 + 1) * test::EpsilonTimeout()); |
| 196 } | 197 } |
| 197 | 198 |
| 198 // Awake some longer time after thread start. | 199 // Awake some longer time after thread start. |
| 199 { | 200 { |
| 200 WaitingThread thread(MOJO_DEADLINE_INDEFINITE); | 201 WaitingThread thread(MOJO_DEADLINE_INDEFINITE); |
| 201 thread.Start(); | 202 thread.Start(); |
| 202 test::Sleep(5 * test::EpsilonTimeout()); | 203 ThreadSleep(5 * test::EpsilonTimeout()); |
| 203 thread.waiter()->Awake(2, 8); | 204 thread.waiter()->Awake(2, 8); |
| 204 thread.WaitUntilDone(&result, &context, &elapsed); | 205 thread.WaitUntilDone(&result, &context, &elapsed); |
| 205 EXPECT_EQ(2u, result); | 206 EXPECT_EQ(2u, result); |
| 206 EXPECT_EQ(8u, context); | 207 EXPECT_EQ(8u, context); |
| 207 EXPECT_GT(elapsed, (5 - 1) * test::EpsilonTimeout()); | 208 EXPECT_GT(elapsed, (5 - 1) * test::EpsilonTimeout()); |
| 208 EXPECT_LT(elapsed, (5 + 1) * test::EpsilonTimeout()); | 209 EXPECT_LT(elapsed, (5 + 1) * test::EpsilonTimeout()); |
| 209 } | 210 } |
| 210 } | 211 } |
| 211 | 212 |
| 212 TEST(WaiterTest, TimeOut) { | 213 TEST(WaiterTest, TimeOut) { |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 267 thread.WaitUntilDone(&result, &context, &elapsed); | 268 thread.WaitUntilDone(&result, &context, &elapsed); |
| 268 EXPECT_EQ(1u, result); | 269 EXPECT_EQ(1u, result); |
| 269 EXPECT_EQ(3u, context); | 270 EXPECT_EQ(3u, context); |
| 270 EXPECT_LT(elapsed, test::EpsilonTimeout()); | 271 EXPECT_LT(elapsed, test::EpsilonTimeout()); |
| 271 } | 272 } |
| 272 | 273 |
| 273 { | 274 { |
| 274 WaitingThread thread(MOJO_DEADLINE_INDEFINITE); | 275 WaitingThread thread(MOJO_DEADLINE_INDEFINITE); |
| 275 thread.Start(); | 276 thread.Start(); |
| 276 thread.waiter()->Awake(10, 5); | 277 thread.waiter()->Awake(10, 5); |
| 277 test::Sleep(2 * test::EpsilonTimeout()); | 278 ThreadSleep(2 * test::EpsilonTimeout()); |
| 278 thread.waiter()->Awake(20, 6); | 279 thread.waiter()->Awake(20, 6); |
| 279 thread.WaitUntilDone(&result, &context, &elapsed); | 280 thread.WaitUntilDone(&result, &context, &elapsed); |
| 280 EXPECT_EQ(10u, result); | 281 EXPECT_EQ(10u, result); |
| 281 EXPECT_EQ(5u, context); | 282 EXPECT_EQ(5u, context); |
| 282 EXPECT_LT(elapsed, test::EpsilonTimeout()); | 283 EXPECT_LT(elapsed, test::EpsilonTimeout()); |
| 283 } | 284 } |
| 284 | 285 |
| 285 { | 286 { |
| 286 WaitingThread thread(10 * test::EpsilonTimeout()); | 287 WaitingThread thread(10 * test::EpsilonTimeout()); |
| 287 thread.Start(); | 288 thread.Start(); |
| 288 test::Sleep(1 * test::EpsilonTimeout()); | 289 ThreadSleep(1 * test::EpsilonTimeout()); |
| 289 thread.waiter()->Awake(MOJO_RESULT_FAILED_PRECONDITION, 7); | 290 thread.waiter()->Awake(MOJO_RESULT_FAILED_PRECONDITION, 7); |
| 290 test::Sleep(2 * test::EpsilonTimeout()); | 291 ThreadSleep(2 * test::EpsilonTimeout()); |
| 291 thread.waiter()->Awake(MOJO_RESULT_OK, 8); | 292 thread.waiter()->Awake(MOJO_RESULT_OK, 8); |
| 292 thread.WaitUntilDone(&result, &context, &elapsed); | 293 thread.WaitUntilDone(&result, &context, &elapsed); |
| 293 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, result); | 294 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, result); |
| 294 EXPECT_EQ(7u, context); | 295 EXPECT_EQ(7u, context); |
| 295 EXPECT_GT(elapsed, (1 - 1) * test::EpsilonTimeout()); | 296 EXPECT_GT(elapsed, (1 - 1) * test::EpsilonTimeout()); |
| 296 EXPECT_LT(elapsed, (1 + 1) * test::EpsilonTimeout()); | 297 EXPECT_LT(elapsed, (1 + 1) * test::EpsilonTimeout()); |
| 297 } | 298 } |
| 298 } | 299 } |
| 299 | 300 |
| 300 } // namespace | 301 } // namespace |
| 301 } // namespace system | 302 } // namespace system |
| 302 } // namespace mojo | 303 } // namespace mojo |
| OLD | NEW |