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::EpsilonDeadline()| may be increased to | 6 // heavily-loaded system). Sorry. |test::EpsilonDeadline()| 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 "third_party/mojo/src/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 "base/synchronization/lock.h" |
14 #include "base/threading/simple_thread.h" | 15 #include "base/threading/simple_thread.h" |
| 16 #include "mojo/edk/system/test_utils.h" |
15 #include "mojo/public/cpp/system/macros.h" | 17 #include "mojo/public/cpp/system/macros.h" |
16 #include "testing/gtest/include/gtest/gtest.h" | 18 #include "testing/gtest/include/gtest/gtest.h" |
17 #include "third_party/mojo/src/mojo/edk/system/mutex.h" | |
18 #include "third_party/mojo/src/mojo/edk/system/test_utils.h" | |
19 | 19 |
20 namespace mojo { | 20 namespace mojo { |
21 namespace system { | 21 namespace edk { |
22 namespace { | 22 namespace { |
23 | 23 |
24 const unsigned kPollTimeMs = 10; | 24 const unsigned kPollTimeMs = 10; |
25 | 25 |
26 class WaitingThread : public base::SimpleThread { | 26 class WaitingThread : public base::SimpleThread { |
27 public: | 27 public: |
28 explicit WaitingThread(MojoDeadline deadline) | 28 explicit WaitingThread(MojoDeadline deadline) |
29 : base::SimpleThread("waiting_thread"), | 29 : base::SimpleThread("waiting_thread"), |
30 deadline_(deadline), | 30 deadline_(deadline), |
31 done_(false), | 31 done_(false), |
32 result_(MOJO_RESULT_UNKNOWN), | 32 result_(MOJO_RESULT_UNKNOWN), |
33 context_(static_cast<uint32_t>(-1)) { | 33 context_(static_cast<uint32_t>(-1)) { |
34 waiter_.Init(); | 34 waiter_.Init(); |
35 } | 35 } |
36 | 36 |
37 ~WaitingThread() override { Join(); } | 37 ~WaitingThread() override { Join(); } |
38 | 38 |
39 void WaitUntilDone(MojoResult* result, | 39 void WaitUntilDone(MojoResult* result, |
40 uint32_t* context, | 40 uint32_t* context, |
41 MojoDeadline* elapsed) { | 41 MojoDeadline* elapsed) { |
42 for (;;) { | 42 for (;;) { |
43 { | 43 { |
44 MutexLocker locker(&mutex_); | 44 base::AutoLock locker(lock_); |
45 if (done_) { | 45 if (done_) { |
46 *result = result_; | 46 *result = result_; |
47 *context = context_; | 47 *context = context_; |
48 *elapsed = elapsed_; | 48 *elapsed = elapsed_; |
49 break; | 49 break; |
50 } | 50 } |
51 } | 51 } |
52 | 52 |
53 test::Sleep(test::DeadlineFromMilliseconds(kPollTimeMs)); | 53 test::Sleep(test::DeadlineFromMilliseconds(kPollTimeMs)); |
54 } | 54 } |
55 } | 55 } |
56 | 56 |
57 Waiter* waiter() { return &waiter_; } | 57 Waiter* waiter() { return &waiter_; } |
58 | 58 |
59 private: | 59 private: |
60 void Run() override { | 60 void Run() override { |
61 test::Stopwatch stopwatch; | 61 test::Stopwatch stopwatch; |
62 MojoResult result; | 62 MojoResult result; |
63 uint32_t context = static_cast<uint32_t>(-1); | 63 uint32_t context = static_cast<uint32_t>(-1); |
64 MojoDeadline elapsed; | 64 MojoDeadline elapsed; |
65 | 65 |
66 stopwatch.Start(); | 66 stopwatch.Start(); |
67 result = waiter_.Wait(deadline_, &context); | 67 result = waiter_.Wait(deadline_, &context); |
68 elapsed = stopwatch.Elapsed(); | 68 elapsed = stopwatch.Elapsed(); |
69 | 69 |
70 { | 70 { |
71 MutexLocker locker(&mutex_); | 71 base::AutoLock locker(lock_); |
72 done_ = true; | 72 done_ = true; |
73 result_ = result; | 73 result_ = result; |
74 context_ = context; | 74 context_ = context; |
75 elapsed_ = elapsed; | 75 elapsed_ = elapsed; |
76 } | 76 } |
77 } | 77 } |
78 | 78 |
79 const MojoDeadline deadline_; | 79 const MojoDeadline deadline_; |
80 Waiter waiter_; // Thread-safe. | 80 Waiter waiter_; // Thread-safe. |
81 | 81 |
82 Mutex mutex_; | 82 base::Lock lock_; // Protects the following members. |
83 bool done_ MOJO_GUARDED_BY(mutex_); | 83 bool done_; |
84 MojoResult result_ MOJO_GUARDED_BY(mutex_); | 84 MojoResult result_; |
85 uint32_t context_ MOJO_GUARDED_BY(mutex_); | 85 uint32_t context_; |
86 MojoDeadline elapsed_ MOJO_GUARDED_BY(mutex_); | 86 MojoDeadline elapsed_; |
87 | 87 |
88 MOJO_DISALLOW_COPY_AND_ASSIGN(WaitingThread); | 88 MOJO_DISALLOW_COPY_AND_ASSIGN(WaitingThread); |
89 }; | 89 }; |
90 | 90 |
91 TEST(WaiterTest, Basic) { | 91 TEST(WaiterTest, Basic) { |
92 MojoResult result; | 92 MojoResult result; |
93 uint32_t context; | 93 uint32_t context; |
94 MojoDeadline elapsed; | 94 MojoDeadline elapsed; |
95 | 95 |
96 // Finite deadline. | 96 // Finite deadline. |
(...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
287 thread.waiter()->Awake(MOJO_RESULT_OK, 8); | 287 thread.waiter()->Awake(MOJO_RESULT_OK, 8); |
288 thread.WaitUntilDone(&result, &context, &elapsed); | 288 thread.WaitUntilDone(&result, &context, &elapsed); |
289 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, result); | 289 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, result); |
290 EXPECT_EQ(7u, context); | 290 EXPECT_EQ(7u, context); |
291 EXPECT_GT(elapsed, (1 - 1) * test::EpsilonDeadline()); | 291 EXPECT_GT(elapsed, (1 - 1) * test::EpsilonDeadline()); |
292 EXPECT_LT(elapsed, (1 + 1) * test::EpsilonDeadline()); | 292 EXPECT_LT(elapsed, (1 + 1) * test::EpsilonDeadline()); |
293 } | 293 } |
294 } | 294 } |
295 | 295 |
296 } // namespace | 296 } // namespace |
297 } // namespace system | 297 } // namespace edk |
298 } // namespace mojo | 298 } // namespace mojo |
OLD | NEW |