Home | History | Annotate | Download | only in threading
      1 // Copyright (c) 2010 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 "base/threading/platform_thread.h"
      6 
      7 #include "testing/gtest/include/gtest/gtest.h"
      8 
      9 namespace base {
     10 
     11 // Trivial tests that thread runs and doesn't crash on create and join ---------
     12 
     13 class TrivialThread : public PlatformThread::Delegate {
     14  public:
     15   TrivialThread() : did_run_(false) {}
     16 
     17   virtual void ThreadMain() {
     18     did_run_ = true;
     19   }
     20 
     21   bool did_run() const { return did_run_; }
     22 
     23  private:
     24   bool did_run_;
     25 
     26   DISALLOW_COPY_AND_ASSIGN(TrivialThread);
     27 };
     28 
     29 TEST(PlatformThreadTest, Trivial) {
     30   TrivialThread thread;
     31   PlatformThreadHandle handle = kNullThreadHandle;
     32 
     33   ASSERT_FALSE(thread.did_run());
     34   ASSERT_TRUE(PlatformThread::Create(0, &thread, &handle));
     35   PlatformThread::Join(handle);
     36   ASSERT_TRUE(thread.did_run());
     37 }
     38 
     39 TEST(PlatformThreadTest, TrivialTimesTen) {
     40   TrivialThread thread[10];
     41   PlatformThreadHandle handle[arraysize(thread)];
     42 
     43   for (size_t n = 0; n < arraysize(thread); n++)
     44     ASSERT_FALSE(thread[n].did_run());
     45   for (size_t n = 0; n < arraysize(thread); n++)
     46     ASSERT_TRUE(PlatformThread::Create(0, &thread[n], &handle[n]));
     47   for (size_t n = 0; n < arraysize(thread); n++)
     48     PlatformThread::Join(handle[n]);
     49   for (size_t n = 0; n < arraysize(thread); n++)
     50     ASSERT_TRUE(thread[n].did_run());
     51 }
     52 
     53 // Tests of basic thread functions ---------------------------------------------
     54 
     55 class FunctionTestThread : public TrivialThread {
     56  public:
     57   FunctionTestThread() : thread_id_(0) {}
     58 
     59   virtual void ThreadMain() {
     60     thread_id_ = PlatformThread::CurrentId();
     61     PlatformThread::YieldCurrentThread();
     62     PlatformThread::Sleep(50);
     63 
     64     TrivialThread::ThreadMain();
     65   }
     66 
     67   PlatformThreadId thread_id() const { return thread_id_; }
     68 
     69  private:
     70   PlatformThreadId thread_id_;
     71 
     72   DISALLOW_COPY_AND_ASSIGN(FunctionTestThread);
     73 };
     74 
     75 TEST(PlatformThreadTest, Function) {
     76   PlatformThreadId main_thread_id = PlatformThread::CurrentId();
     77 
     78   FunctionTestThread thread;
     79   PlatformThreadHandle handle = kNullThreadHandle;
     80 
     81   ASSERT_FALSE(thread.did_run());
     82   ASSERT_TRUE(PlatformThread::Create(0, &thread, &handle));
     83   PlatformThread::Join(handle);
     84   ASSERT_TRUE(thread.did_run());
     85   EXPECT_NE(thread.thread_id(), main_thread_id);
     86 }
     87 
     88 TEST(PlatformThreadTest, FunctionTimesTen) {
     89   PlatformThreadId main_thread_id = PlatformThread::CurrentId();
     90 
     91   FunctionTestThread thread[10];
     92   PlatformThreadHandle handle[arraysize(thread)];
     93 
     94   for (size_t n = 0; n < arraysize(thread); n++)
     95     ASSERT_FALSE(thread[n].did_run());
     96   for (size_t n = 0; n < arraysize(thread); n++)
     97     ASSERT_TRUE(PlatformThread::Create(0, &thread[n], &handle[n]));
     98   for (size_t n = 0; n < arraysize(thread); n++)
     99     PlatformThread::Join(handle[n]);
    100   for (size_t n = 0; n < arraysize(thread); n++) {
    101     ASSERT_TRUE(thread[n].did_run());
    102     EXPECT_NE(thread[n].thread_id(), main_thread_id);
    103   }
    104 }
    105 
    106 }  // namespace base
    107