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