1//
2// SemaphoreTest.cpp
3//
4// Copyright (c) 2004-2006, Applied Informatics Software Engineering GmbH.
5// and Contributors.
6//
7// SPDX-License-Identifier: BSL-1.0
8//
9
10
11#include "SemaphoreTest.h"
12#include "Poco/CppUnit/TestCaller.h"
13#include "Poco/CppUnit/TestSuite.h"
14#include "Poco/Thread.h"
15#include "Poco/Runnable.h"
16#include "Poco/Semaphore.h"
17#include "Poco/Exception.h"
18
19
20using Poco::Thread;
21using Poco::Runnable;
22using Poco::Semaphore;
23using Poco::TimeoutException;
24
25
26class SemaRunnable: public Runnable
27{
28public:
29 SemaRunnable(int n, int max): _ran(false), _sema(n, max)
30 {
31 }
32
33 void run()
34 {
35 _sema.wait();
36 _ran = true;
37 }
38
39 bool ran() const
40 {
41 return _ran;
42 }
43
44 void set()
45 {
46 _sema.set();
47 }
48
49 void wait()
50 {
51 _sema.wait();
52 }
53
54 void wait(long milliseconds)
55 {
56 _sema.wait(milliseconds);
57 }
58
59 bool tryWait(long milliseconds)
60 {
61 return _sema.tryWait(milliseconds);
62 }
63
64private:
65 bool _ran;
66 Semaphore _sema;
67};
68
69
70SemaphoreTest::SemaphoreTest(const std::string& rName): CppUnit::TestCase(rName)
71{
72}
73
74
75SemaphoreTest::~SemaphoreTest()
76{
77}
78
79
80void SemaphoreTest::testInitZero()
81{
82 SemaRunnable r(0, 3);
83 assertTrue (!r.tryWait(10));
84 r.set();
85 r.wait();
86 try
87 {
88 r.wait(100);
89 failmsg("must timeout");
90 }
91 catch (TimeoutException&)
92 {
93 }
94 catch (...)
95 {
96 failmsg("wrong exception");
97 }
98 r.set();
99 r.set();
100 assertTrue (r.tryWait(0));
101 r.wait();
102 assertTrue (!r.tryWait(10));
103
104 Thread t;
105 t.start(r);
106 Thread::sleep(100);
107 assertTrue (!r.ran());
108 r.set();
109 t.join();
110 assertTrue (r.ran());
111 assertTrue (!r.tryWait(10));
112}
113
114
115void SemaphoreTest::testInitNonZero()
116{
117 SemaRunnable r(2, 2);
118 r.wait();
119 assertTrue (r.tryWait(10));
120 assertTrue (!r.tryWait(10));
121 r.set();
122 assertTrue (r.tryWait(10));
123 assertTrue (!r.tryWait(10));
124}
125
126
127void SemaphoreTest::setUp()
128{
129}
130
131
132void SemaphoreTest::tearDown()
133{
134}
135
136
137CppUnit::Test* SemaphoreTest::suite()
138{
139 CppUnit::TestSuite* pSuite = new CppUnit::TestSuite("SemaphoreTest");
140
141 CppUnit_addTest(pSuite, SemaphoreTest, testInitZero);
142 CppUnit_addTest(pSuite, SemaphoreTest, testInitNonZero);
143
144 return pSuite;
145}
146