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

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

Issue 1350023003: Add a Mojo EDK for Chrome that uses one OS pipe per message pipe. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: more cleanup Created 5 years, 2 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
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::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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698