| 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 "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" | 
|   15 #include "mojo/edk/system/mutex.h" |  | 
|   16 #include "mojo/edk/system/test_utils.h" |   16 #include "mojo/edk/system/test_utils.h" | 
|   17 #include "mojo/public/cpp/system/macros.h" |   17 #include "mojo/public/cpp/system/macros.h" | 
|   18 #include "testing/gtest/include/gtest/gtest.h" |   18 #include "testing/gtest/include/gtest/gtest.h" | 
|   19  |   19  | 
|   20 namespace mojo { |   20 namespace mojo { | 
|   21 namespace system { |   21 namespace system { | 
|   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 192 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  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 system | 
|  298 }  // namespace mojo |  298 }  // namespace mojo | 
| OLD | NEW |