1// Copyright (c) 2012 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/thread_id_name_manager.h"
6
7#include "base/threading/platform_thread.h"
8#include "base/threading/thread.h"
9#include "testing/gtest/include/gtest/gtest.h"
10#include "testing/platform_test.h"
11
12typedef PlatformTest ThreadIdNameManagerTest;
13
14namespace {
15
16static const char* kAThread = "a thread";
17static const char* kBThread = "b thread";
18
19TEST_F(ThreadIdNameManagerTest, AddThreads) {
20  base::ThreadIdNameManager* manager = base::ThreadIdNameManager::GetInstance();
21  base::Thread thread_a(kAThread);
22  base::Thread thread_b(kBThread);
23
24  thread_a.Start();
25  thread_b.Start();
26
27  EXPECT_STREQ(kAThread, manager->GetName(thread_a.thread_id()));
28  EXPECT_STREQ(kBThread, manager->GetName(thread_b.thread_id()));
29
30  thread_b.Stop();
31  thread_a.Stop();
32}
33
34TEST_F(ThreadIdNameManagerTest, RemoveThreads) {
35  base::ThreadIdNameManager* manager = base::ThreadIdNameManager::GetInstance();
36  base::Thread thread_a(kAThread);
37
38  thread_a.Start();
39  {
40    base::Thread thread_b(kBThread);
41    thread_b.Start();
42    thread_b.Stop();
43  }
44  EXPECT_STREQ(kAThread, manager->GetName(thread_a.thread_id()));
45
46  thread_a.Stop();
47  EXPECT_STREQ("", manager->GetName(thread_a.thread_id()));
48}
49
50TEST_F(ThreadIdNameManagerTest, RestartThread) {
51  base::ThreadIdNameManager* manager = base::ThreadIdNameManager::GetInstance();
52  base::Thread thread_a(kAThread);
53
54  thread_a.Start();
55  base::PlatformThreadId a_id = thread_a.thread_id();
56  EXPECT_STREQ(kAThread, manager->GetName(a_id));
57  thread_a.Stop();
58
59  thread_a.Start();
60  EXPECT_STREQ("", manager->GetName(a_id));
61  EXPECT_STREQ(kAThread, manager->GetName(thread_a.thread_id()));
62  thread_a.Stop();
63}
64
65TEST_F(ThreadIdNameManagerTest, ThreadNameInterning) {
66  base::ThreadIdNameManager* manager = base::ThreadIdNameManager::GetInstance();
67
68  base::PlatformThreadId a_id = base::PlatformThread::CurrentId();
69  base::PlatformThread::SetName("First Name");
70  std::string version = manager->GetName(a_id);
71
72  base::PlatformThread::SetName("New name");
73  EXPECT_NE(version, manager->GetName(a_id));
74  base::PlatformThread::SetName("");
75}
76
77TEST_F(ThreadIdNameManagerTest, ResettingNameKeepsCorrectInternedValue) {
78  base::ThreadIdNameManager* manager = base::ThreadIdNameManager::GetInstance();
79
80  base::PlatformThreadId a_id = base::PlatformThread::CurrentId();
81  base::PlatformThread::SetName("Test Name");
82  std::string version = manager->GetName(a_id);
83
84  base::PlatformThread::SetName("New name");
85  EXPECT_NE(version, manager->GetName(a_id));
86
87  base::PlatformThread::SetName("Test Name");
88  EXPECT_EQ(version, manager->GetName(a_id));
89
90  base::PlatformThread::SetName("");
91}
92
93}  // namespace
94