123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121 |
- // Copyright (c) 2012 The Chromium Authors. All rights reserved.
- // Use of this source code is governed by a BSD-style license that can be
- // found in the LICENSE file.
- #include "butil/compiler_specific.h"
- #include "butil/threading/platform_thread.h"
- #include <gtest/gtest.h>
- namespace butil {
- // Trivial tests that thread runs and doesn't crash on create and join ---------
- class TrivialThread : public PlatformThread::Delegate {
- public:
- TrivialThread() : did_run_(false) {}
- virtual void ThreadMain() OVERRIDE {
- did_run_ = true;
- }
- bool did_run() const { return did_run_; }
- private:
- bool did_run_;
- DISALLOW_COPY_AND_ASSIGN(TrivialThread);
- };
- TEST(PlatformThreadTest, Trivial) {
- TrivialThread thread;
- PlatformThreadHandle handle;
- ASSERT_FALSE(thread.did_run());
- ASSERT_TRUE(PlatformThread::Create(0, &thread, &handle));
- PlatformThread::Join(handle);
- ASSERT_TRUE(thread.did_run());
- }
- TEST(PlatformThreadTest, TrivialTimesTen) {
- TrivialThread thread[10];
- PlatformThreadHandle handle[arraysize(thread)];
- for (size_t n = 0; n < arraysize(thread); n++)
- ASSERT_FALSE(thread[n].did_run());
- for (size_t n = 0; n < arraysize(thread); n++)
- ASSERT_TRUE(PlatformThread::Create(0, &thread[n], &handle[n]));
- for (size_t n = 0; n < arraysize(thread); n++)
- PlatformThread::Join(handle[n]);
- for (size_t n = 0; n < arraysize(thread); n++)
- ASSERT_TRUE(thread[n].did_run());
- }
- // Tests of basic thread functions ---------------------------------------------
- class FunctionTestThread : public TrivialThread {
- public:
- FunctionTestThread() : thread_id_(0) {}
- virtual void ThreadMain() OVERRIDE {
- thread_id_ = PlatformThread::CurrentId();
- PlatformThread::YieldCurrentThread();
- PlatformThread::Sleep(TimeDelta::FromMilliseconds(50));
- // Make sure that the thread ID is the same across calls.
- EXPECT_EQ(thread_id_, PlatformThread::CurrentId());
- TrivialThread::ThreadMain();
- }
- PlatformThreadId thread_id() const { return thread_id_; }
- private:
- PlatformThreadId thread_id_;
- DISALLOW_COPY_AND_ASSIGN(FunctionTestThread);
- };
- TEST(PlatformThreadTest, Function) {
- PlatformThreadId main_thread_id = PlatformThread::CurrentId();
- FunctionTestThread thread;
- PlatformThreadHandle handle;
- ASSERT_FALSE(thread.did_run());
- ASSERT_TRUE(PlatformThread::Create(0, &thread, &handle));
- PlatformThread::Join(handle);
- ASSERT_TRUE(thread.did_run());
- EXPECT_NE(thread.thread_id(), main_thread_id);
- // Make sure that the thread ID is the same across calls.
- EXPECT_EQ(main_thread_id, PlatformThread::CurrentId());
- }
- TEST(PlatformThreadTest, FunctionTimesTen) {
- PlatformThreadId main_thread_id = PlatformThread::CurrentId();
- FunctionTestThread thread[10];
- PlatformThreadHandle handle[arraysize(thread)];
- for (size_t n = 0; n < arraysize(thread); n++)
- ASSERT_FALSE(thread[n].did_run());
- for (size_t n = 0; n < arraysize(thread); n++)
- ASSERT_TRUE(PlatformThread::Create(0, &thread[n], &handle[n]));
- for (size_t n = 0; n < arraysize(thread); n++)
- PlatformThread::Join(handle[n]);
- for (size_t n = 0; n < arraysize(thread); n++) {
- ASSERT_TRUE(thread[n].did_run());
- EXPECT_NE(thread[n].thread_id(), main_thread_id);
- // Make sure no two threads get the same ID.
- for (size_t i = 0; i < n; ++i) {
- EXPECT_NE(thread[i].thread_id(), thread[n].thread_id());
- }
- }
- // Make sure that the thread ID is the same across calls.
- EXPECT_EQ(main_thread_id, PlatformThread::CurrentId());
- }
- } // namespace butil
|