Home | History | Annotate | Download | only in platform
      1 // Copyright 2014 the V8 project 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 "src/base/platform/platform.h"
      6 
      7 #if V8_OS_POSIX
      8 #include <unistd.h>  // NOLINT
      9 #endif
     10 
     11 #if V8_OS_WIN
     12 #include "src/base/win32-headers.h"
     13 #endif
     14 #include "testing/gtest/include/gtest/gtest.h"
     15 
     16 namespace v8 {
     17 namespace base {
     18 
     19 TEST(OS, GetCurrentProcessId) {
     20 #if V8_OS_POSIX
     21   EXPECT_EQ(static_cast<int>(getpid()), OS::GetCurrentProcessId());
     22 #endif
     23 
     24 #if V8_OS_WIN
     25   EXPECT_EQ(static_cast<int>(::GetCurrentProcessId()),
     26             OS::GetCurrentProcessId());
     27 #endif
     28 }
     29 
     30 
     31 namespace {
     32 
     33 class SelfJoinThread FINAL : public Thread {
     34  public:
     35   SelfJoinThread() : Thread(Options("SelfJoinThread")) {}
     36   virtual void Run() OVERRIDE { Join(); }
     37 };
     38 
     39 }  // namespace
     40 
     41 
     42 TEST(Thread, SelfJoin) {
     43   SelfJoinThread thread;
     44   thread.Start();
     45   thread.Join();
     46 }
     47 
     48 
     49 namespace {
     50 
     51 class ThreadLocalStorageTest : public Thread, public ::testing::Test {
     52  public:
     53   ThreadLocalStorageTest() : Thread(Options("ThreadLocalStorageTest")) {
     54     for (size_t i = 0; i < arraysize(keys_); ++i) {
     55       keys_[i] = Thread::CreateThreadLocalKey();
     56     }
     57   }
     58   ~ThreadLocalStorageTest() {
     59     for (size_t i = 0; i < arraysize(keys_); ++i) {
     60       Thread::DeleteThreadLocalKey(keys_[i]);
     61     }
     62   }
     63 
     64   virtual void Run() FINAL OVERRIDE {
     65     for (size_t i = 0; i < arraysize(keys_); i++) {
     66       CHECK(!Thread::HasThreadLocal(keys_[i]));
     67     }
     68     for (size_t i = 0; i < arraysize(keys_); i++) {
     69       Thread::SetThreadLocal(keys_[i], GetValue(i));
     70     }
     71     for (size_t i = 0; i < arraysize(keys_); i++) {
     72       CHECK(Thread::HasThreadLocal(keys_[i]));
     73     }
     74     for (size_t i = 0; i < arraysize(keys_); i++) {
     75       CHECK_EQ(GetValue(i), Thread::GetThreadLocal(keys_[i]));
     76       CHECK_EQ(GetValue(i), Thread::GetExistingThreadLocal(keys_[i]));
     77     }
     78     for (size_t i = 0; i < arraysize(keys_); i++) {
     79       Thread::SetThreadLocal(keys_[i], GetValue(arraysize(keys_) - i - 1));
     80     }
     81     for (size_t i = 0; i < arraysize(keys_); i++) {
     82       CHECK(Thread::HasThreadLocal(keys_[i]));
     83     }
     84     for (size_t i = 0; i < arraysize(keys_); i++) {
     85       CHECK_EQ(GetValue(arraysize(keys_) - i - 1),
     86                Thread::GetThreadLocal(keys_[i]));
     87       CHECK_EQ(GetValue(arraysize(keys_) - i - 1),
     88                Thread::GetExistingThreadLocal(keys_[i]));
     89     }
     90   }
     91 
     92  private:
     93   static void* GetValue(size_t x) {
     94     return reinterpret_cast<void*>(static_cast<uintptr_t>(x + 1));
     95   }
     96 
     97   Thread::LocalStorageKey keys_[256];
     98 };
     99 
    100 }  // namespace
    101 
    102 
    103 TEST_F(ThreadLocalStorageTest, DoTest) {
    104   Run();
    105   Start();
    106   Join();
    107 }
    108 
    109 }  // namespace base
    110 }  // namespace v8
    111