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

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

Issue 2056763003: EDK: Change Awakable::Awake()'s context, etc., to be a uint64_t. (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/waiter_test_utils.cc ('k') | no next file » | 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/waiter.h" 10 #include "mojo/edk/system/waiter.h"
(...skipping 18 matching lines...) Expand all
29 namespace { 29 namespace {
30 30
31 const unsigned kPollTimeMs = 10; 31 const unsigned kPollTimeMs = 10;
32 32
33 class WaitingThread : public test::SimpleTestThread { 33 class WaitingThread : public test::SimpleTestThread {
34 public: 34 public:
35 explicit WaitingThread(MojoDeadline deadline) 35 explicit WaitingThread(MojoDeadline deadline)
36 : deadline_(deadline), 36 : deadline_(deadline),
37 done_(false), 37 done_(false),
38 result_(MOJO_RESULT_UNKNOWN), 38 result_(MOJO_RESULT_UNKNOWN),
39 context_(static_cast<uint32_t>(-1)) { 39 context_(static_cast<uint64_t>(-1)) {
40 waiter_.Init(); 40 waiter_.Init();
41 } 41 }
42 42
43 ~WaitingThread() override { Join(); } 43 ~WaitingThread() override { Join(); }
44 44
45 void WaitUntilDone(MojoResult* result, 45 void WaitUntilDone(MojoResult* result,
46 uint32_t* context, 46 uint64_t* context,
47 MojoDeadline* elapsed) { 47 MojoDeadline* elapsed) {
48 for (;;) { 48 for (;;) {
49 { 49 {
50 MutexLocker locker(&mutex_); 50 MutexLocker locker(&mutex_);
51 if (done_) { 51 if (done_) {
52 *result = result_; 52 *result = result_;
53 *context = context_; 53 *context = context_;
54 *elapsed = elapsed_; 54 *elapsed = elapsed_;
55 break; 55 break;
56 } 56 }
57 } 57 }
58 58
59 ThreadSleep(test::DeadlineFromMilliseconds(kPollTimeMs)); 59 ThreadSleep(test::DeadlineFromMilliseconds(kPollTimeMs));
60 } 60 }
61 } 61 }
62 62
63 Waiter* waiter() { return &waiter_; } 63 Waiter* waiter() { return &waiter_; }
64 64
65 private: 65 private:
66 void Run() override { 66 void Run() override {
67 Stopwatch stopwatch; 67 Stopwatch stopwatch;
68 MojoResult result; 68 MojoResult result;
69 uint32_t context = static_cast<uint32_t>(-1); 69 uint64_t context = static_cast<uint64_t>(-1);
70 MojoDeadline elapsed; 70 MojoDeadline elapsed;
71 71
72 stopwatch.Start(); 72 stopwatch.Start();
73 result = waiter_.Wait(deadline_, &context); 73 result = waiter_.Wait(deadline_, &context);
74 elapsed = stopwatch.Elapsed(); 74 elapsed = stopwatch.Elapsed();
75 75
76 { 76 {
77 MutexLocker locker(&mutex_); 77 MutexLocker locker(&mutex_);
78 done_ = true; 78 done_ = true;
79 result_ = result; 79 result_ = result;
80 context_ = context; 80 context_ = context;
81 elapsed_ = elapsed; 81 elapsed_ = elapsed;
82 } 82 }
83 } 83 }
84 84
85 const MojoDeadline deadline_; 85 const MojoDeadline deadline_;
86 Waiter waiter_; // Thread-safe. 86 Waiter waiter_; // Thread-safe.
87 87
88 Mutex mutex_; 88 Mutex mutex_;
89 bool done_ MOJO_GUARDED_BY(mutex_); 89 bool done_ MOJO_GUARDED_BY(mutex_);
90 MojoResult result_ MOJO_GUARDED_BY(mutex_); 90 MojoResult result_ MOJO_GUARDED_BY(mutex_);
91 uint32_t context_ MOJO_GUARDED_BY(mutex_); 91 uint64_t context_ MOJO_GUARDED_BY(mutex_);
92 MojoDeadline elapsed_ MOJO_GUARDED_BY(mutex_); 92 MojoDeadline elapsed_ MOJO_GUARDED_BY(mutex_);
93 93
94 MOJO_DISALLOW_COPY_AND_ASSIGN(WaitingThread); 94 MOJO_DISALLOW_COPY_AND_ASSIGN(WaitingThread);
95 }; 95 };
96 96
97 TEST(WaiterTest, Basic) { 97 TEST(WaiterTest, Basic) {
98 MojoResult result; 98 MojoResult result;
99 uint32_t context; 99 uint64_t context;
100 MojoDeadline elapsed; 100 MojoDeadline elapsed;
101 101
102 // Finite deadline. 102 // Finite deadline.
103 103
104 // Awake immediately after thread start. 104 // Awake immediately after thread start.
105 { 105 {
106 WaitingThread thread(10 * test::EpsilonTimeout()); 106 WaitingThread thread(10 * test::EpsilonTimeout());
107 thread.Start(); 107 thread.Start();
108 thread.waiter()->Awake(MOJO_RESULT_OK, 1); 108 thread.waiter()->Awake(MOJO_RESULT_OK, 1);
109 thread.WaitUntilDone(&result, &context, &elapsed); 109 thread.WaitUntilDone(&result, &context, &elapsed);
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
148 EXPECT_GT(elapsed, (5 - 1) * test::EpsilonTimeout()); 148 EXPECT_GT(elapsed, (5 - 1) * test::EpsilonTimeout());
149 EXPECT_LT(elapsed, (5 + 1) * test::EpsilonTimeout()); 149 EXPECT_LT(elapsed, (5 + 1) * test::EpsilonTimeout());
150 } 150 }
151 151
152 // Don't awake -- time out (on another thread). 152 // Don't awake -- time out (on another thread).
153 { 153 {
154 WaitingThread thread(2 * test::EpsilonTimeout()); 154 WaitingThread thread(2 * test::EpsilonTimeout());
155 thread.Start(); 155 thread.Start();
156 thread.WaitUntilDone(&result, &context, &elapsed); 156 thread.WaitUntilDone(&result, &context, &elapsed);
157 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, result); 157 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, result);
158 EXPECT_EQ(static_cast<uint32_t>(-1), context); 158 EXPECT_EQ(static_cast<uint64_t>(-1), context);
159 EXPECT_GT(elapsed, (2 - 1) * test::EpsilonTimeout()); 159 EXPECT_GT(elapsed, (2 - 1) * test::EpsilonTimeout());
160 EXPECT_LT(elapsed, (2 + 1) * test::EpsilonTimeout()); 160 EXPECT_LT(elapsed, (2 + 1) * test::EpsilonTimeout());
161 } 161 }
162 162
163 // No (indefinite) deadline. 163 // No (indefinite) deadline.
164 164
165 // Awake immediately after thread start. 165 // Awake immediately after thread start.
166 { 166 {
167 WaitingThread thread(MOJO_DEADLINE_INDEFINITE); 167 WaitingThread thread(MOJO_DEADLINE_INDEFINITE);
168 thread.Start(); 168 thread.Start();
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
209 EXPECT_GT(elapsed, (5 - 1) * test::EpsilonTimeout()); 209 EXPECT_GT(elapsed, (5 - 1) * test::EpsilonTimeout());
210 EXPECT_LT(elapsed, (5 + 1) * test::EpsilonTimeout()); 210 EXPECT_LT(elapsed, (5 + 1) * test::EpsilonTimeout());
211 } 211 }
212 } 212 }
213 213
214 TEST(WaiterTest, TimeOut) { 214 TEST(WaiterTest, TimeOut) {
215 Stopwatch stopwatch; 215 Stopwatch stopwatch;
216 MojoDeadline elapsed; 216 MojoDeadline elapsed;
217 217
218 Waiter waiter; 218 Waiter waiter;
219 uint32_t context = 123; 219 uint64_t context = 123;
220 220
221 waiter.Init(); 221 waiter.Init();
222 stopwatch.Start(); 222 stopwatch.Start();
223 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, waiter.Wait(0, &context)); 223 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, waiter.Wait(0, &context));
224 elapsed = stopwatch.Elapsed(); 224 elapsed = stopwatch.Elapsed();
225 EXPECT_LT(elapsed, test::EpsilonTimeout()); 225 EXPECT_LT(elapsed, test::EpsilonTimeout());
226 EXPECT_EQ(123u, context); 226 EXPECT_EQ(123u, context);
227 227
228 waiter.Init(); 228 waiter.Init();
229 stopwatch.Start(); 229 stopwatch.Start();
(...skipping 10 matching lines...) Expand all
240 waiter.Wait(5 * test::EpsilonTimeout(), &context)); 240 waiter.Wait(5 * test::EpsilonTimeout(), &context));
241 elapsed = stopwatch.Elapsed(); 241 elapsed = stopwatch.Elapsed();
242 EXPECT_GT(elapsed, (5 - 1) * test::EpsilonTimeout()); 242 EXPECT_GT(elapsed, (5 - 1) * test::EpsilonTimeout());
243 EXPECT_LT(elapsed, (5 + 1) * test::EpsilonTimeout()); 243 EXPECT_LT(elapsed, (5 + 1) * test::EpsilonTimeout());
244 EXPECT_EQ(123u, context); 244 EXPECT_EQ(123u, context);
245 } 245 }
246 246
247 // The first |Awake()| should always win. 247 // The first |Awake()| should always win.
248 TEST(WaiterTest, MultipleAwakes) { 248 TEST(WaiterTest, MultipleAwakes) {
249 MojoResult result; 249 MojoResult result;
250 uint32_t context; 250 uint64_t context;
251 MojoDeadline elapsed; 251 MojoDeadline elapsed;
252 252
253 { 253 {
254 WaitingThread thread(MOJO_DEADLINE_INDEFINITE); 254 WaitingThread thread(MOJO_DEADLINE_INDEFINITE);
255 thread.Start(); 255 thread.Start();
256 thread.waiter()->Awake(MOJO_RESULT_OK, 1); 256 thread.waiter()->Awake(MOJO_RESULT_OK, 1);
257 thread.waiter()->Awake(1, 2); 257 thread.waiter()->Awake(1, 2);
258 thread.WaitUntilDone(&result, &context, &elapsed); 258 thread.WaitUntilDone(&result, &context, &elapsed);
259 EXPECT_EQ(MOJO_RESULT_OK, result); 259 EXPECT_EQ(MOJO_RESULT_OK, result);
260 EXPECT_EQ(1u, context); 260 EXPECT_EQ(1u, context);
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
295 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, result); 295 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, result);
296 EXPECT_EQ(7u, context); 296 EXPECT_EQ(7u, context);
297 EXPECT_GT(elapsed, (1 - 1) * test::EpsilonTimeout()); 297 EXPECT_GT(elapsed, (1 - 1) * test::EpsilonTimeout());
298 EXPECT_LT(elapsed, (1 + 1) * test::EpsilonTimeout()); 298 EXPECT_LT(elapsed, (1 + 1) * test::EpsilonTimeout());
299 } 299 }
300 } 300 }
301 301
302 } // namespace 302 } // namespace
303 } // namespace system 303 } // namespace system
304 } // namespace mojo 304 } // namespace mojo
OLDNEW
« no previous file with comments | « mojo/edk/system/waiter_test_utils.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698