1 // Copyright (C) 2015-2019 Free Software Foundation, Inc.
2 //
3 // This file is part of the GNU ISO C++ Library.  This library is free
4 // software; you can redistribute it and/or modify it under the
5 // terms of the GNU General Public License as published by the
6 // Free Software Foundation; either version 3, or (at your option)
7 // any later version.
8 
9 // This library is distributed in the hope that it will be useful,
10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12 // GNU General Public License for more details.
13 
14 // You should have received a copy of the GNU General Public License along
15 // with this library; see the file COPYING3.  If not see
16 // <http://www.gnu.org/licenses/>.
17 
18 // { dg-do run { target c++14 } }
19 // { dg-add-options libatomic }
20 // { dg-require-gthreads "" }
21 
22 #include <experimental/timer>
23 #include <testsuite_hooks.h>
24 
25 using std::experimental::net::system_timer;
26 using std::experimental::net::io_context;
27 
28 void
test01()29 test01()
30 {
31   bool test __attribute__((unused)) = false;
32 
33   io_context ctx1, ctx2;
34 
35   system_timer timer1(ctx1);
36   VERIFY( timer1.get_executor() == ctx1.get_executor() );
37   VERIFY( timer1.expiry() == system_timer::time_point() );
38 
39   system_timer timer2(ctx2);
40   VERIFY( timer2.get_executor() == ctx2.get_executor() );
41   VERIFY( timer2.get_executor() != timer1.get_executor() );
42   VERIFY( timer2.expiry() == system_timer::time_point() );
43 
44   system_timer timer3(std::move(timer1));
45   VERIFY( timer3.get_executor() == ctx1.get_executor() );
46   VERIFY( timer3.expiry() == system_timer::time_point() );
47   VERIFY( timer1.expiry() == system_timer::time_point() );
48 
49   system_timer timer4(std::move(timer2));
50   VERIFY( timer4.get_executor() == ctx2.get_executor() );
51   VERIFY( timer4.expiry() == system_timer::time_point() );
52   VERIFY( timer2.expiry() == system_timer::time_point() );
53 }
54 
55 void
test02()56 test02()
57 {
58   bool test __attribute__((unused)) = false;
59 
60   io_context ctx1, ctx2;
61   auto t1 = system_timer::clock_type::now();
62   auto t2 = t1 + system_timer::duration(10);
63 
64   system_timer timer1(ctx1, t1);
65   VERIFY( timer1.get_executor() == ctx1.get_executor() );
66   VERIFY( timer1.expiry() == t1 );
67 
68   system_timer timer2(ctx2, t2);
69   VERIFY( timer2.get_executor() == ctx2.get_executor() );
70   VERIFY( timer2.get_executor() != timer1.get_executor() );
71   VERIFY( timer2.expiry() == t2 );
72 
73   system_timer timer3(std::move(timer1));
74   VERIFY( timer3.get_executor() == ctx1.get_executor() );
75   VERIFY( timer3.expiry() == t1 );
76   VERIFY( timer1.expiry() == system_timer::time_point() );
77 
78   system_timer timer4(std::move(timer2));
79   VERIFY( timer4.get_executor() == ctx2.get_executor() );
80   VERIFY( timer4.expiry() == t2 );
81   VERIFY( timer2.expiry() == system_timer::time_point() );
82 }
83 
84 void
test03()85 test03()
86 {
87   bool test __attribute__((unused)) = false;
88 
89   io_context ctx1, ctx2;
90   auto now = system_timer::clock_type::now();
91   auto d1 = system_timer::duration(10);
92   auto d2 = system_timer::duration(100);
93 
94   system_timer timer1(ctx1, d1);
95   VERIFY( timer1.get_executor() == ctx1.get_executor() );
96   VERIFY( timer1.expiry() > now );
97 
98   system_timer timer2(ctx2, d2);
99   VERIFY( timer2.get_executor() == ctx2.get_executor() );
100   VERIFY( timer2.get_executor() != timer1.get_executor() );
101   VERIFY( timer2.expiry() > now );
102   VERIFY( timer2.expiry() != timer1.expiry() );
103 
104   system_timer timer3(std::move(timer1));
105   VERIFY( timer3.get_executor() == ctx1.get_executor() );
106   VERIFY( timer3.expiry() > now );
107   VERIFY( timer1.expiry() == system_timer::time_point() );
108 
109   system_timer timer4(std::move(timer2));
110   VERIFY( timer4.get_executor() == ctx2.get_executor() );
111   VERIFY( timer4.expiry() > now );
112   VERIFY( timer2.expiry() == system_timer::time_point() );
113 }
114 
115 int
main()116 main()
117 {
118   test01();
119   test02();
120   test03();
121 }
122