1 /*******************************************************************************
2
3 Copyright:
4 Copyright (c) 2017 dunnhumby Germany GmbH.
5 All rights reserved.
6
7 License:
8 Boost Software License Version 1.0. See LICENSE_BOOST.txt for details.
9 Alternatively, this file may be distributed under the terms of the Tango
10 3-Clause BSD License (see LICENSE_BSD.txt for details).
11
12 *******************************************************************************/
13
14 module ocean.task.util.Timer_test;
15
16 import ocean.task.util.Timer;
17 import ocean.task.Scheduler;
18 import ocean.task.Task;
19 import ocean.core.Test;
20 import core.thread;
21
22 unittest
23 {
24 initScheduler(SchedulerConfiguration.init);
25
26 class SimpleTask : Task
27 {
28 override public void run ( )
29 {
30 for (int i = 0; i < 10; ++i)
31 .wait(10);
32 }
33 }
34
35 auto task = new SimpleTask;
36 theScheduler.schedule(task);
37 theScheduler.eventLoop();
38 }
39
40 unittest
41 {
42 // same as previous, but tests allocated event count inside `.timer` object
43
44 initScheduler(SchedulerConfiguration.init);
45
46 // re-create timer event pool to get rid of slots already allocated by other
47 // test cases
48 .timer = new typeof(.timer);
49
50 class SimpleTask : Task
51 {
52 override public void run ( )
53 {
54 for (int i = 0; i < 10; ++i)
55 .wait(10);
56 }
57 }
58
59 auto task = new SimpleTask;
60 theScheduler.schedule(task);
61 theScheduler.eventLoop();
62
63 test!("==")(.timer.scheduled_events(), 1);
64 }
65
66 unittest
67 {
68 initScheduler(SchedulerConfiguration.init);
69
70 static class InfiniteTask : Task
71 {
72 override public void run ( )
73 {
74 for (;;) .wait(100);
75 }
76 }
77
78 static class RootTask : Task
79 {
80 Task to_wait_for;
81
82 override public void run ( )
83 {
84 bool timeout = .awaitOrTimeout(this.to_wait_for, 5000);
85 test(timeout);
86
87 // `awaitOrTimeout` itself won't terminate awaited task on timeout,
88 // it will only "detach" it from the current context. If former is
89 // desired, it can be trivially done at the call site:
90 if (timeout)
91 this.to_wait_for.kill();
92 }
93 }
94
95 auto root = new RootTask;
96 root.to_wait_for = new InfiniteTask;
97
98 theScheduler.schedule(root);
99 theScheduler.eventLoop();
100
101 test(root.finished());
102 test(root.to_wait_for.finished());
103 }
104
105 unittest
106 {
107 initScheduler(SchedulerConfiguration.init);
108
109 static class FiniteTask : Task
110 {
111 override public void run ( )
112 {
113 .wait(100);
114 }
115 }
116
117 static class RootTask : Task
118 {
119 Task to_wait_for;
120
121 override public void run ( )
122 {
123 bool timeout = .awaitOrTimeout(this.to_wait_for, 1_000_000);
124 test(!timeout);
125 test(this.to_wait_for.finished());
126 }
127 }
128
129 auto root = new RootTask;
130 root.to_wait_for = new FiniteTask;
131
132 theScheduler.schedule(root);
133 theScheduler.eventLoop();
134
135 test(root.finished());
136 test(root.to_wait_for.finished());
137
138 }
139