• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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:
TrivialThread()15   TrivialThread() : did_run_(false) {}
16 
ThreadMain()17   virtual void ThreadMain() {
18     did_run_ = true;
19   }
20 
did_run() const21   bool did_run() const { return did_run_; }
22 
23  private:
24   bool did_run_;
25 
26   DISALLOW_COPY_AND_ASSIGN(TrivialThread);
27 };
28 
TEST(PlatformThreadTest,Trivial)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 
TEST(PlatformThreadTest,TrivialTimesTen)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:
FunctionTestThread()57   FunctionTestThread() : thread_id_(0) {}
58 
ThreadMain()59   virtual void ThreadMain() {
60     thread_id_ = PlatformThread::CurrentId();
61     PlatformThread::YieldCurrentThread();
62     PlatformThread::Sleep(50);
63 
64     TrivialThread::ThreadMain();
65   }
66 
thread_id() const67   PlatformThreadId thread_id() const { return thread_id_; }
68 
69  private:
70   PlatformThreadId thread_id_;
71 
72   DISALLOW_COPY_AND_ASSIGN(FunctionTestThread);
73 };
74 
TEST(PlatformThreadTest,Function)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 
TEST(PlatformThreadTest,FunctionTimesTen)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