• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
do_nothing()12 void do_nothing()
13 {}
14 
BOOST_AUTO_TEST_CASE(test_thread_id_for_default_constructed_thread_is_default_constructed_id)15 BOOST_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 
BOOST_AUTO_TEST_CASE(test_thread_id_for_running_thread_is_not_default_constructed_id)21 BOOST_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 
BOOST_AUTO_TEST_CASE(test_different_threads_have_different_ids)28 BOOST_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 
BOOST_AUTO_TEST_CASE(test_thread_ids_have_a_total_order)37 BOOST_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 
get_thread_id(boost::thread::id * id)127 void get_thread_id(boost::thread::id* id)
128 {
129     *id=boost::this_thread::get_id();
130 }
131 
BOOST_AUTO_TEST_CASE(test_thread_id_of_running_thread_returned_by_this_thread_get_id)132 BOOST_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(get_thread_id,&id));
136     boost::thread::id t_id=t.get_id();
137     t.join();
138     BOOST_CHECK(id==t_id);
139 }
140