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
9namespace base {
10
11// Trivial tests that thread runs and doesn't crash on create and join ---------
12
13class 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
29TEST(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
39TEST(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
55class 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
75TEST(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
88TEST(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