1// Copyright (C) 2007 Anthony Williams
2//
3// Distributed under the Boost Software License, Version 1.0. (See accompanying
4// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
5
6#define BOOST_TEST_MODULE Boost.Threads: thread::get_id test suite
7
8#include <boost/thread/thread_only.hpp>
9#include <boost/test/unit_test.hpp>
10#include <boost/bind/bind.hpp>
11
12void do_nothing()
13{}
14
15BOOST_AUTO_TEST_CASE(test_thread_id_for_default_constructed_thread_is_default_constructed_id)
16{
17 boost::thread t;
18 BOOST_CHECK(t.get_id()==boost::thread::id());
19}
20
21BOOST_AUTO_TEST_CASE(test_thread_id_for_running_thread_is_not_default_constructed_id)
22{
23 boost::thread t(&do_nothing);
24 BOOST_CHECK(t.get_id()!=boost::thread::id());
25 t.join();
26}
27
28BOOST_AUTO_TEST_CASE(test_different_threads_have_different_ids)
29{
30 boost::thread t(do_nothing);
31 boost::thread t2(do_nothing);
32 BOOST_CHECK(t.get_id()!=t2.get_id());
33 t.join();
34 t2.join();
35}
36
37BOOST_AUTO_TEST_CASE(test_thread_ids_have_a_total_order)
38{
39 boost::thread t(do_nothing);
40 boost::thread t2(do_nothing);
41 boost::thread t3(do_nothing);
42 BOOST_CHECK(t.get_id()!=t2.get_id());
43 BOOST_CHECK(t.get_id()!=t3.get_id());
44 BOOST_CHECK(t2.get_id()!=t3.get_id());
45
46 BOOST_CHECK((t.get_id()<t2.get_id()) != (t2.get_id()<t.get_id()));
47 BOOST_CHECK((t.get_id()<t3.get_id()) != (t3.get_id()<t.get_id()));
48 BOOST_CHECK((t2.get_id()<t3.get_id()) != (t3.get_id()<t2.get_id()));
49
50 BOOST_CHECK((t.get_id()>t2.get_id()) != (t2.get_id()>t.get_id()));
51 BOOST_CHECK((t.get_id()>t3.get_id()) != (t3.get_id()>t.get_id()));
52 BOOST_CHECK((t2.get_id()>t3.get_id()) != (t3.get_id()>t2.get_id()));
53
54 BOOST_CHECK((t.get_id()<t2.get_id()) == (t2.get_id()>t.get_id()));
55 BOOST_CHECK((t2.get_id()<t.get_id()) == (t.get_id()>t2.get_id()));
56 BOOST_CHECK((t.get_id()<t3.get_id()) == (t3.get_id()>t.get_id()));
57 BOOST_CHECK((t3.get_id()<t.get_id()) == (t.get_id()>t3.get_id()));
58 BOOST_CHECK((t2.get_id()<t3.get_id()) == (t3.get_id()>t2.get_id()));
59 BOOST_CHECK((t3.get_id()<t2.get_id()) == (t2.get_id()>t3.get_id()));
60
61 BOOST_CHECK((t.get_id()<t2.get_id()) == (t2.get_id()>=t.get_id()));
62 BOOST_CHECK((t2.get_id()<t.get_id()) == (t.get_id()>=t2.get_id()));
63 BOOST_CHECK((t.get_id()<t3.get_id()) == (t3.get_id()>=t.get_id()));
64 BOOST_CHECK((t3.get_id()<t.get_id()) == (t.get_id()>=t3.get_id()));
65 BOOST_CHECK((t2.get_id()<t3.get_id()) == (t3.get_id()>=t2.get_id()));
66 BOOST_CHECK((t3.get_id()<t2.get_id()) == (t2.get_id()>=t3.get_id()));
67
68 BOOST_CHECK((t.get_id()<=t2.get_id()) == (t2.get_id()>t.get_id()));
69 BOOST_CHECK((t2.get_id()<=t.get_id()) == (t.get_id()>t2.get_id()));
70 BOOST_CHECK((t.get_id()<=t3.get_id()) == (t3.get_id()>t.get_id()));
71 BOOST_CHECK((t3.get_id()<=t.get_id()) == (t.get_id()>t3.get_id()));
72 BOOST_CHECK((t2.get_id()<=t3.get_id()) == (t3.get_id()>t2.get_id()));
73 BOOST_CHECK((t3.get_id()<=t2.get_id()) == (t2.get_id()>t3.get_id()));
74
75 if((t.get_id()<t2.get_id()) && (t2.get_id()<t3.get_id()))
76 {
77 BOOST_CHECK(t.get_id()<t3.get_id());
78 }
79 else if((t.get_id()<t3.get_id()) && (t3.get_id()<t2.get_id()))
80 {
81 BOOST_CHECK(t.get_id()<t2.get_id());
82 }
83 else if((t2.get_id()<t3.get_id()) && (t3.get_id()<t.get_id()))
84 {
85 BOOST_CHECK(t2.get_id()<t.get_id());
86 }
87 else if((t2.get_id()<t.get_id()) && (t.get_id()<t3.get_id()))
88 {
89 BOOST_CHECK(t2.get_id()<t3.get_id());
90 }
91 else if((t3.get_id()<t.get_id()) && (t.get_id()<t2.get_id()))
92 {
93 BOOST_CHECK(t3.get_id()<t2.get_id());
94 }
95 else if((t3.get_id()<t2.get_id()) && (t2.get_id()<t.get_id()))
96 {
97 BOOST_CHECK(t3.get_id()<t.get_id());
98 }
99 else
100 {
101 BOOST_CHECK(false);
102 }
103
104 boost::thread::id default_id;
105
106 BOOST_CHECK(default_id < t.get_id());
107 BOOST_CHECK(default_id < t2.get_id());
108 BOOST_CHECK(default_id < t3.get_id());
109
110 BOOST_CHECK(default_id <= t.get_id());
111 BOOST_CHECK(default_id <= t2.get_id());
112 BOOST_CHECK(default_id <= t3.get_id());
113
114 BOOST_CHECK(!(default_id > t.get_id()));
115 BOOST_CHECK(!(default_id > t2.get_id()));
116 BOOST_CHECK(!(default_id > t3.get_id()));
117
118 BOOST_CHECK(!(default_id >= t.get_id()));
119 BOOST_CHECK(!(default_id >= t2.get_id()));
120 BOOST_CHECK(!(default_id >= t3.get_id()));
121
122 t.join();
123 t2.join();
124 t3.join();
125}
126
127void get_thread_id(boost::thread::id* id)
128{
129 *id=boost::this_thread::get_id();
130}
131
132BOOST_AUTO_TEST_CASE(test_thread_id_of_running_thread_returned_by_this_thread_get_id)
133{
134 boost::thread::id id;
135 boost::thread t(boost::bind(f: get_thread_id,a1: &id));
136 boost::thread::id t_id=t.get_id();
137 t.join();
138 BOOST_CHECK(id==t_id);
139}
140

source code of boost/libs/thread/test/test_thread_id.cpp