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 | |
12 | void do_nothing() |
13 | {} |
14 | |
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 | |
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 | |
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 | |
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 | |
127 | void get_thread_id(boost::thread::id* id) |
128 | { |
129 | *id=boost::this_thread::get_id(); |
130 | } |
131 | |
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(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 | |