1 //
2 // ActiveMethodTest.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 "ActiveMethodTest.h"
12 #include "CppUnit/TestCaller.h"
13 #include "CppUnit/TestSuite.h"
14 #include "Poco/ActiveMethod.h"
15 #include "Poco/Thread.h"
16 #include "Poco/Event.h"
17 #include "Poco/Exception.h"
18 
19 
20 using Poco::ActiveMethod;
21 using Poco::ActiveResult;
22 using Poco::Thread;
23 using Poco::Event;
24 using Poco::Exception;
25 
26 
27 namespace
28 {
29 	class ActiveObject
30 	{
31 	public:
32 		typedef ActiveMethod<int, int, ActiveObject>   IntIntType;
33 		typedef ActiveMethod<void, int, ActiveObject>  VoidIntType;
34 		typedef ActiveMethod<void, void, ActiveObject> VoidVoidType;
35 		typedef ActiveMethod<int, void, ActiveObject>  IntVoidType;
36 
ActiveObject()37 		ActiveObject():
38 			testMethod(this, &ActiveObject::testMethodImpl),
39 			testVoid(this,&ActiveObject::testVoidOutImpl),
40 			testVoidInOut(this,&ActiveObject::testVoidInOutImpl),
41 			testVoidIn(this,&ActiveObject::testVoidInImpl)
42 		{
43 		}
44 
~ActiveObject()45 		~ActiveObject()
46 		{
47 		}
48 
49 		IntIntType testMethod;
50 
51 		VoidIntType testVoid;
52 
53 		VoidVoidType testVoidInOut;
54 
55 		IntVoidType testVoidIn;
56 
cont()57 		void cont()
58 		{
59 			_continue.set();
60 		}
61 
62 	protected:
testMethodImpl(const int & n)63 		int testMethodImpl(const int& n)
64 		{
65 			if (n == 100) throw Exception("n == 100");
66 			_continue.wait();
67 			return n;
68 		}
69 
testVoidOutImpl(const int & n)70 		void testVoidOutImpl(const int& n)
71 		{
72 			if (n == 100) throw Exception("n == 100");
73 			_continue.wait();
74 		}
75 
testVoidInOutImpl()76 		void testVoidInOutImpl()
77 		{
78 			_continue.wait();
79 		}
80 
testVoidInImpl()81 		int testVoidInImpl()
82 		{
83 			_continue.wait();
84 			return 123;
85 		}
86 
87 	private:
88 		Event _continue;
89 	};
90 }
91 
92 
ActiveMethodTest(const std::string & name)93 ActiveMethodTest::ActiveMethodTest(const std::string& name): CppUnit::TestCase(name)
94 {
95 }
96 
97 
~ActiveMethodTest()98 ActiveMethodTest::~ActiveMethodTest()
99 {
100 }
101 
102 
testWait()103 void ActiveMethodTest::testWait()
104 {
105 	ActiveObject activeObj;
106 	ActiveResult<int> result = activeObj.testMethod(123);
107 	assertTrue (!result.available());
108 	activeObj.cont();
109 	result.wait();
110 	assertTrue (result.available());
111 	assertTrue (result.data() == 123);
112 	assertTrue (!result.failed());
113 }
114 
115 
testCopy()116 void ActiveMethodTest::testCopy()
117 {
118 	ActiveObject activeObj;
119 
120 	ActiveObject::IntIntType ii = activeObj.testMethod;
121 	ActiveResult<int> rii = ii(123);
122 	assertTrue (!rii.available());
123 	activeObj.cont();
124 	rii.wait();
125 	assertTrue (rii.available());
126 	assertTrue (rii.data() == 123);
127 	assertTrue (!rii.failed());
128 
129 	ActiveObject::VoidIntType  vi = activeObj.testVoid;
130 	ActiveResult<void> rvi = vi(123);
131 	assertTrue (!rvi.available());
132 	activeObj.cont();
133 	rvi.wait();
134 	assertTrue (rvi.available());
135 	assertTrue (!rvi.failed());
136 
137 	ActiveObject::VoidVoidType vv = activeObj.testVoidInOut;
138 	ActiveResult<void> rvv = vv();
139 	assertTrue (!rvv.available());
140 	activeObj.cont();
141 	rvv.wait();
142 	assertTrue (rvv.available());
143 	assertTrue (!rvv.failed());
144 
145 	ActiveObject::IntVoidType  iv = activeObj.testVoidIn;
146 	ActiveResult<int> riv = iv();
147 	assertTrue (!riv.available());
148 	activeObj.cont();
149 	riv.wait();
150 	assertTrue (riv.available());
151 	assertTrue (riv.data() == 123);
152 	assertTrue (!riv.failed());
153 }
154 
155 
testWaitInterval()156 void ActiveMethodTest::testWaitInterval()
157 {
158 	ActiveObject activeObj;
159 	ActiveResult<int> result = activeObj.testMethod(123);
160 	assertTrue (!result.available());
161 	try
162 	{
163 		result.wait(100);
164 		fail("wait must fail");
165 	}
166 	catch (Exception&)
167 	{
168 	}
169 	activeObj.cont();
170 	result.wait(10000);
171 	assertTrue (result.available());
172 	assertTrue (result.data() == 123);
173 	assertTrue (!result.failed());
174 }
175 
176 
testTryWait()177 void ActiveMethodTest::testTryWait()
178 {
179 	ActiveObject activeObj;
180 	ActiveResult<int> result = activeObj.testMethod(123);
181 	assertTrue (!result.available());
182 	assertTrue (!result.tryWait(200));
183 	activeObj.cont();
184 	assertTrue (result.tryWait(10000));
185 	assertTrue (result.available());
186 	assertTrue (result.data() == 123);
187 	assertTrue (!result.failed());
188 }
189 
190 
testFailure()191 void ActiveMethodTest::testFailure()
192 {
193 	ActiveObject activeObj;
194 	ActiveResult<int> result = activeObj.testMethod(100);
195 	result.wait();
196 	assertTrue (result.available());
197 	assertTrue (result.failed());
198 	std::string msg = result.error();
199 	assertTrue (msg == "n == 100");
200 }
201 
202 
testVoidOut()203 void ActiveMethodTest::testVoidOut()
204 {
205 	ActiveObject activeObj;
206 	ActiveResult<void> result = activeObj.testVoid(101);
207 	activeObj.cont();
208 	result.wait();
209 	assertTrue (result.available());
210 	assertTrue (!result.failed());
211 }
212 
213 
testVoidInOut()214 void ActiveMethodTest::testVoidInOut()
215 {
216 	ActiveObject activeObj;
217 	ActiveResult<void> result = activeObj.testVoidInOut();
218 	activeObj.cont();
219 	result.wait();
220 	assertTrue (result.available());
221 	assertTrue (!result.failed());
222 }
223 
224 
testVoidIn()225 void ActiveMethodTest::testVoidIn()
226 {
227 	ActiveObject activeObj;
228 	ActiveResult<int> result = activeObj.testVoidIn();
229 	activeObj.cont();
230 	result.wait();
231 	assertTrue (result.available());
232 	assertTrue (!result.failed());
233 	assertTrue (result.data() == 123);
234 }
235 
236 
setUp()237 void ActiveMethodTest::setUp()
238 {
239 }
240 
241 
tearDown()242 void ActiveMethodTest::tearDown()
243 {
244 }
245 
246 
suite()247 CppUnit::Test* ActiveMethodTest::suite()
248 {
249 	CppUnit::TestSuite* pSuite = new CppUnit::TestSuite("ActiveMethodTest");
250 
251 	CppUnit_addTest(pSuite, ActiveMethodTest, testWait);
252 	CppUnit_addTest(pSuite, ActiveMethodTest, testCopy);
253 	CppUnit_addTest(pSuite, ActiveMethodTest, testWaitInterval);
254 	CppUnit_addTest(pSuite, ActiveMethodTest, testTryWait);
255 	CppUnit_addTest(pSuite, ActiveMethodTest, testFailure);
256 	CppUnit_addTest(pSuite, ActiveMethodTest, testVoidOut);
257 	CppUnit_addTest(pSuite, ActiveMethodTest, testVoidIn);
258 	CppUnit_addTest(pSuite, ActiveMethodTest, testVoidInOut);
259 
260 	return pSuite;
261 }
262