Home | History | Annotate | Download | only in tests
      1 // Copyright 2014 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "mojo/public/cpp/utility/thread.h"
      6 
      7 #include "mojo/public/cpp/system/macros.h"
      8 #include "testing/gtest/include/gtest/gtest.h"
      9 
     10 namespace mojo {
     11 namespace {
     12 
     13 class SetIntThread : public Thread {
     14  public:
     15   SetIntThread(int* int_to_set, int value)
     16       : int_to_set_(int_to_set),
     17         value_(value) {
     18   }
     19   SetIntThread(const Options& options, int* int_to_set, int value)
     20       : Thread(options),
     21         int_to_set_(int_to_set),
     22         value_(value) {
     23   }
     24 
     25   virtual ~SetIntThread() {
     26   }
     27 
     28   virtual void Run() MOJO_OVERRIDE {
     29     *int_to_set_ = value_;
     30   }
     31 
     32  private:
     33   int* const int_to_set_;
     34   const int value_;
     35 
     36   MOJO_DISALLOW_COPY_AND_ASSIGN(SetIntThread);
     37 };
     38 
     39 TEST(ThreadTest, CreateAndJoin) {
     40   int value = 0;
     41 
     42   // Not starting the thread should result in a no-op.
     43   {
     44     SetIntThread thread(&value, 1234567);
     45   }
     46   EXPECT_EQ(0, value);
     47 
     48   // Start and join.
     49   {
     50     SetIntThread thread(&value, 12345678);
     51     thread.Start();
     52     thread.Join();
     53     EXPECT_EQ(12345678, value);
     54   }
     55 
     56   // Ditto, with non-default (but reasonable) stack size.
     57   {
     58     Thread::Options options;
     59     options.set_stack_size(1024 * 1024);  // 1 MB.
     60     SetIntThread thread(options, &value, 12345678);
     61     thread.Start();
     62     thread.Join();
     63     EXPECT_EQ(12345678, value);
     64   }
     65 }
     66 
     67 // Tests of assertions for Debug builds.
     68 // Note: It's okay to create threads, despite gtest having to fork. (The threads
     69 // are in the child process.)
     70 #if !defined(NDEBUG)
     71 TEST(ThreadTest, DebugAssertionFailures) {
     72   // Can only start once.
     73   EXPECT_DEATH({
     74     int value = 0;
     75     SetIntThread thread(&value, 1);
     76     thread.Start();
     77     thread.Start();
     78   }, "");
     79 
     80   // Must join (if you start).
     81   EXPECT_DEATH({
     82     int value = 0;
     83     SetIntThread thread(&value, 2);
     84     thread.Start();
     85   }, "");
     86 
     87   // Can only join once.
     88   EXPECT_DEATH({
     89     int value = 0;
     90     SetIntThread thread(&value, 3);
     91     thread.Start();
     92     thread.Join();
     93     thread.Join();
     94   }, "");
     95 
     96   // Stack too big (we're making certain assumptions here).
     97   EXPECT_DEATH({
     98     int value = 0;
     99     Thread::Options options;
    100     options.set_stack_size(static_cast<size_t>(-1));
    101     SetIntThread thread(options, &value, 4);
    102     thread.Start();
    103     thread.Join();
    104   }, "");
    105 }
    106 #endif  // !defined(NDEBUG)
    107 
    108 }  // namespace
    109 }  // namespace mojo
    110