source: ThirdParty/JobMarket/src/unittests/FragmentQueueUnitTest.cpp@ 4464ef

Action_Thermostats Add_AtomRandomPerturbation Add_RotateAroundBondAction Add_SelectAtomByNameAction Adding_Graph_to_ChangeBondActions Adding_MD_integration_tests Adding_StructOpt_integration_tests Automaking_mpqc_open AutomationFragmentation_failures Candidate_v1.6.0 Candidate_v1.6.1 ChangeBugEmailaddress ChangingTestPorts ChemicalSpaceEvaluator Combining_Subpackages Debian_Package_split Debian_package_split_molecuildergui_only Disabling_MemDebug Docu_Python_wait EmpiricalPotential_contain_HomologyGraph_documentation Enable_parallel_make_install Enhance_userguide Enhanced_StructuralOptimization Enhanced_StructuralOptimization_continued Example_ManyWaysToTranslateAtom Exclude_Hydrogens_annealWithBondGraph FitPartialCharges_GlobalError Fix_ChronosMutex Fix_StatusMsg Fix_StepWorldTime_single_argument Fix_Verbose_Codepatterns ForceAnnealing_goodresults ForceAnnealing_oldresults ForceAnnealing_tocheck ForceAnnealing_with_BondGraph ForceAnnealing_with_BondGraph_continued ForceAnnealing_with_BondGraph_continued_betteresults ForceAnnealing_with_BondGraph_contraction-expansion GeometryObjects Gui_displays_atomic_force_velocity IndependentFragmentGrids_IntegrationTest JobMarket_RobustOnKillsSegFaults JobMarket_StableWorkerPool JobMarket_unresolvable_hostname_fix ODR_violation_mpqc_open PartialCharges_OrthogonalSummation PythonUI_with_named_parameters QtGui_reactivate_TimeChanged_changes Recreated_GuiChecks RotateToPrincipalAxisSystem_UndoRedo StoppableMakroAction Subpackage_levmar Subpackage_vmg ThirdParty_MPQC_rebuilt_buildsystem TremoloParser_IncreasedPrecision TremoloParser_MultipleTimesteps Ubuntu_1604_changes stable
Last change on this file since 4464ef was 363f28, checked in by Frederik Heber <heber@…>, 8 years ago

Merge commit '404d2be35f6544290132fcbe8f79a4ff9c6584ad' as 'ThirdParty/JobMarket'

  • Property mode set to 100644
File size: 12.1 KB
Line 
1/*
2 * Project: JobMarket
3 * Description: asynchronous Server/Controller/Client-approach to parallel computing, based on boost::asio
4 * Copyright (C) 2011 Frederik Heber. All rights reserved.
5 *
6 */
7
8/*
9 * FragmentQueueUnitTest.cpp
10 *
11 * Created on: Oct 23, 2011
12 * Author: heber
13 */
14
15// include config.h
16#ifdef HAVE_CONFIG_H
17#include <config.h>
18#endif
19
20#include <cppunit/CompilerOutputter.h>
21#include <cppunit/extensions/TestFactoryRegistry.h>
22#include <cppunit/ui/text/TestRunner.h>
23
24#include "FragmentQueueUnitTest.hpp"
25
26#include <limits>
27#include <vector>
28
29#include "CodePatterns/Assert.hpp"
30#include "JobMarket/FragmentQueue.hpp"
31
32#include "CodePatterns/Observer/Channels.hpp"
33
34#ifdef HAVE_TESTRUNNER
35#include "JobMarket/UnitTestMain.hpp"
36#endif /*HAVE_TESTRUNNER*/
37
38/********************************************** Test classes **************************************/
39
40#include "stubs/FragmentJobStub.hpp"
41#include "stubs/ObserverStub.hpp"
42
43// Registers the fixture into the 'registry'
44CPPUNIT_TEST_SUITE_REGISTRATION( FragmentQueueTest );
45
46
47void FragmentQueueTest::setUp()
48{
49 // Throw assertions
50 ASSERT_DO(Assert::Throw);
51
52 queue = new FragmentQueue();
53 addobserver = new NotificationObserver(queue->getChannel(FragmentQueue::JobAdded));
54
55 // and sign on
56 queue->signOn(addobserver, FragmentQueue::JobAdded);
57}
58
59
60void FragmentQueueTest::tearDown()
61{
62 queue->signOff(addobserver, FragmentQueue::JobAdded);
63
64 delete queue;
65 delete addobserver;
66}
67
68/** UnitTest for working JobQueue
69 */
70void FragmentQueueTest::JobTest()
71{
72 FragmentJob::ptr testJob(new FragmentJobStub(JobId::IllegalJob));
73 /// check for illegal id
74#ifndef NDEBUG
75 std::cout << "The following assertion is intended and does not indicate a failure." << std::endl;
76 CPPUNIT_ASSERT_THROW( queue->pushJob(testJob), Assert::AssertionFailure );
77#endif
78 // set to valid id
79 testJob->setId(1);
80
81 CPPUNIT_ASSERT_EQUAL(false, queue->isJobPresent() );
82
83#ifndef NDEBUG
84 CPPUNIT_ASSERT_NO_THROW( queue->pushJob(testJob) );
85#else
86 queue->pushJob(testJob);
87#endif
88 CPPUNIT_ASSERT( addobserver->wasNotified );
89 addobserver->wasNotified = false;
90
91 CPPUNIT_ASSERT_EQUAL((size_t)1, queue->jobs.size());
92 CPPUNIT_ASSERT_EQUAL(true, queue->isJobPresent() );
93 CPPUNIT_ASSERT_EQUAL((size_t)1, queue->results.size());
94 {
95 FragmentQueue::ResultMap::const_iterator iter = queue->results.find((JobId_t)1);
96 CPPUNIT_ASSERT( iter != queue->results.end() );
97 CPPUNIT_ASSERT( queue->getNoResult() == iter->second );
98 }
99
100 // push same id again
101#ifndef NDEBUG
102 std::cout << "The following assertion is intended and does not indicate a failure." << std::endl;
103 CPPUNIT_ASSERT_THROW( queue->pushJob(testJob), Assert::AssertionFailure );
104#endif
105
106 CPPUNIT_ASSERT_EQUAL((size_t)1, queue->jobs.size());
107 CPPUNIT_ASSERT_EQUAL((size_t)1, queue->results.size());
108
109 FragmentJob::ptr poppedJob;
110#ifndef NDEBUG
111 CPPUNIT_ASSERT_NO_THROW( poppedJob = queue->popJob() );
112#else
113 poppedJob = queue->popJob();
114#endif
115 CPPUNIT_ASSERT( !addobserver->wasNotified );
116 CPPUNIT_ASSERT( poppedJob == testJob );
117
118 CPPUNIT_ASSERT_EQUAL((size_t)0, queue->jobs.size());
119 CPPUNIT_ASSERT_EQUAL(false, queue->isJobPresent() );
120 CPPUNIT_ASSERT_EQUAL((size_t)1, queue->results.size());
121 {
122 FragmentQueue::ResultMap::const_iterator iter = queue->results.find((JobId_t)1);
123 CPPUNIT_ASSERT( iter != queue->results.end() );
124 CPPUNIT_ASSERT( queue->getNoResultQueued() == iter->second );
125 }
126
127#ifndef NDEBUG
128 std::cout << "The following assertion is intended and does not indicate a failure." << std::endl;
129 CPPUNIT_ASSERT_THROW( queue->popJob(), Assert::AssertionFailure );
130#endif
131}
132
133/** UnitTest for adding multiple jobs at a time.
134 */
135void FragmentQueueTest::JobsTest()
136{
137 // prepare some jobs
138 FragmentJob::ptr testJob(new FragmentJobStub(JobId::IllegalJob));
139 testJob->setId((JobId_t)1);
140 FragmentJob::ptr anothertestJob(new FragmentJobStub(JobId::IllegalJob));
141 anothertestJob->setId((JobId_t)2);
142
143 // prepare a vector of them
144 std::vector<FragmentJob::ptr> testjobs;
145 testjobs.push_back(testJob);
146 testjobs.push_back(anothertestJob);
147
148 // prepare another vector of them
149 std::vector<FragmentJob::ptr> sametestjobs;
150 sametestjobs.push_back(testJob);
151 sametestjobs.push_back(anothertestJob);
152
153 // push the vector
154 CPPUNIT_ASSERT_EQUAL( (size_t)0, queue->jobs.size() );
155#ifndef NDEBUG
156 CPPUNIT_ASSERT_NO_THROW( queue->pushJobs(testjobs) );
157#else
158 queue->pushJobs(testjobs);
159#endif
160 CPPUNIT_ASSERT_EQUAL( (size_t)2, queue->jobs.size() );
161 CPPUNIT_ASSERT_EQUAL((size_t)2, queue->results.size());
162 {
163 FragmentQueue::ResultMap::const_iterator iter = queue->results.find((JobId_t)1);
164 CPPUNIT_ASSERT( iter != queue->results.end() );
165 CPPUNIT_ASSERT( queue->getNoResult() == iter->second );
166 }
167 {
168 FragmentQueue::ResultMap::const_iterator iter = queue->results.find((JobId_t)2);
169 CPPUNIT_ASSERT( iter != queue->results.end() );
170 CPPUNIT_ASSERT( queue->getNoResult() == iter->second );
171 }
172 // push again
173#ifndef NDEBUG
174 std::cout << "The following assertion is intended and does not indicate a failure." << std::endl;
175 CPPUNIT_ASSERT_THROW( queue->pushJobs(testjobs), Assert::AssertionFailure );
176#endif
177
178 CPPUNIT_ASSERT_EQUAL( (size_t)2, queue->jobs.size() );
179 CPPUNIT_ASSERT_EQUAL((size_t)2, queue->results.size());
180}
181
182/** UnitTest for adding multiple jobs with different priorities.
183 */
184void FragmentQueueTest::PriorityTest()
185{
186 // prepare some jobs
187 const size_t MAXJOBS = 10;
188 std::vector<FragmentJob::ptr> testjobs;
189 for(size_t i=1; i<= MAXJOBS; ++i) {
190 FragmentJob::ptr testJob(new FragmentJobStub((JobId_t)i));
191 FragmentJob::priority_t priority = rand() % 10;
192 testJob->setPriority(priority);
193 testjobs.push_back(testJob);
194 }
195
196 // push the vector
197 CPPUNIT_ASSERT_EQUAL( (size_t)0, queue->jobs.size() );
198#ifndef NDEBUG
199 CPPUNIT_ASSERT_NO_THROW( queue->pushJobs(testjobs) );
200#else
201 queue->pushJobs(testjobs);
202#endif
203 CPPUNIT_ASSERT_EQUAL( MAXJOBS, queue->jobs.size() );
204 CPPUNIT_ASSERT_EQUAL( MAXJOBS, queue->results.size());
205
206 // pop and check their ids
207 FragmentJob::priority_t old_priority =
208 std::numeric_limits<FragmentJob::priority_t>::max();
209 while(queue->isJobPresent()) {
210 FragmentJob::ptr testjob = queue->popJob();
211 const FragmentJob::priority_t &new_priority =
212 testjob->priority;
213 CPPUNIT_ASSERT( old_priority >= new_priority);
214 old_priority = new_priority;
215 }
216}
217
218
219/** UnitTest for working ResultMap
220 */
221void FragmentQueueTest::ResultsTest()
222{
223 // prepare a job
224 FragmentJob::ptr testJob(new FragmentJobStub(JobId::IllegalJob));
225 testJob->setId(1);
226#ifndef NDEBUG
227 CPPUNIT_ASSERT_NO_THROW( queue->pushJob(testJob) );
228#else
229 queue->pushJob(testJob);
230#endif
231
232 // check for present job to do
233 CPPUNIT_ASSERT_EQUAL( (size_t)1, queue->getPresentJobs() );
234
235#ifndef NDEBUG
236 CPPUNIT_ASSERT_NO_THROW( queue->popJob() );
237#else
238 queue->popJob();
239#endif
240
241 // check for present job to do
242 CPPUNIT_ASSERT_EQUAL( (size_t)0, queue->getPresentJobs() );
243
244 // prepare a result
245 FragmentResult::ptr testResult( new FragmentResult(1) );
246 FragmentResult::ptr wrongIdResult( new FragmentResult(2) );
247
248 // check that none are present and we can't get result yet
249 CPPUNIT_ASSERT_EQUAL( (size_t)0, queue->getDoneJobs() );
250 CPPUNIT_ASSERT( !queue->isResultPresent(1) );
251 CPPUNIT_ASSERT( !queue->isResultPresent(2) );
252#ifndef NDEBUG
253 std::cout << "The following assertion is intended and does not indicate a failure." << std::endl;
254 CPPUNIT_ASSERT_THROW( queue->getResult(1), Assert::AssertionFailure );
255#endif
256
257 /// check for admonishing wrong id
258#ifndef NDEBUG
259 std::cout << "The following assertion is intended and does not indicate a failure." << std::endl;
260 CPPUNIT_ASSERT_THROW( queue->pushResult(wrongIdResult), Assert::AssertionFailure );
261#endif
262
263 // push correct result
264#ifndef NDEBUG
265 CPPUNIT_ASSERT_NO_THROW( queue->pushResult(testResult) );
266#else
267 queue->pushResult(testResult);
268#endif
269
270 // check presence again
271 CPPUNIT_ASSERT( queue->isResultPresent(1) );
272 CPPUNIT_ASSERT_EQUAL( (size_t)1, queue->getDoneJobs() );
273 CPPUNIT_ASSERT_EQUAL( (size_t)0, queue->getPresentJobs() );
274
275 // obtain result again
276#ifndef NDEBUG
277 CPPUNIT_ASSERT_NO_THROW( queue->getResult(1) );
278#else
279 queue->getResult(1);
280#endif
281
282 // check presence one more time
283 CPPUNIT_ASSERT_EQUAL( (size_t)0, queue->getDoneJobs() );
284 CPPUNIT_ASSERT_EQUAL( (size_t)0, queue->getPresentJobs() );
285 CPPUNIT_ASSERT( !queue->isResultPresent(1) );
286 CPPUNIT_ASSERT( !queue->isResultPresent(2) );
287#ifndef NDEBUG
288 std::cout << "The following assertion is intended and does not indicate a failure." << std::endl;
289 CPPUNIT_ASSERT_THROW( queue->getResult(1), Assert::AssertionFailure );
290#endif
291}
292
293/** UnitTest for working ResultMap
294 */
295void FragmentQueueTest::AllResultsTest()
296{
297 // prepare a job
298 FragmentJob::ptr testJob( new FragmentJobStub(JobId::IllegalJob) );
299 testJob->setId((JobId_t)1);
300 FragmentJob::ptr anothertestJob( new FragmentJobStub(JobId::IllegalJob) );
301 anothertestJob->setId((JobId_t)2);
302
303#ifndef NDEBUG
304 CPPUNIT_ASSERT_NO_THROW( queue->pushJob(testJob) );
305 CPPUNIT_ASSERT_NO_THROW( queue->pushJob(anothertestJob) );
306#else
307 queue->pushJob(testJob);
308 queue->pushJob(anothertestJob);
309#endif
310
311 // check that no results are returned.
312 {
313 const std::vector<FragmentResult::ptr> results = queue->getAllResults();
314 CPPUNIT_ASSERT_EQUAL( (size_t)0, results.size() );
315 }
316
317 // pop both as if some work was being done
318#ifndef NDEBUG
319 CPPUNIT_ASSERT_NO_THROW( queue->popJob() );
320 CPPUNIT_ASSERT_NO_THROW( queue->popJob() );
321#else
322 queue->popJob();
323 queue->popJob();
324#endif
325
326 // prepare a result
327 FragmentResult::ptr testResult( new FragmentResult(1) );
328 FragmentResult::ptr anothertestResult( new FragmentResult(2) );
329
330 // push correct result
331#ifndef NDEBUG
332 CPPUNIT_ASSERT_NO_THROW( queue->pushResult(testResult) );
333 CPPUNIT_ASSERT_NO_THROW( queue->pushResult(anothertestResult) );
334#else
335 queue->pushResult(testResult);
336 queue->pushResult(anothertestResult);
337#endif
338
339 // check that two results are returned.
340 {
341 const std::vector<FragmentResult::ptr> results = queue->getAllResults();
342 CPPUNIT_ASSERT_EQUAL( (size_t)2, results.size() );
343 }
344}
345
346/** Unit test for resubmitJob().
347 *
348 */
349void FragmentQueueTest::removeWaitingResultsTest()
350{
351 // prepare a job
352 FragmentJob::ptr testJob(new FragmentJobStub(JobId::IllegalJob));
353 testJob->setId(1);
354#ifndef NDEBUG
355 CPPUNIT_ASSERT_NO_THROW( queue->pushJob(testJob) );
356#else
357 queue->pushJob(testJob);
358#endif
359
360 CPPUNIT_ASSERT_EQUAL( (size_t)1, queue->results.size() );
361 // now remove all waiting results although there are none
362 queue->removeWaitingResults();
363 CPPUNIT_ASSERT_EQUAL( (size_t)1, queue->results.size() );
364
365 // pop job as if we do some work
366 queue->popJob();
367
368 // prepare a result for the job
369 FragmentResult::ptr testResult( new FragmentResult(1) );
370 // push correct result
371#ifndef NDEBUG
372 CPPUNIT_ASSERT_NO_THROW( queue->pushResult(testResult) );
373#else
374 queue->pushResult(testResult);
375#endif
376
377 // check that one job is done
378 CPPUNIT_ASSERT_EQUAL( (size_t)1, queue->getDoneJobs() );
379
380 // now remove all waiting results
381 queue->removeWaitingResults();
382
383 // check that no results are returned.
384 {
385 CPPUNIT_ASSERT_EQUAL( (size_t)0, queue->getDoneJobs() );
386 const std::vector<FragmentResult::ptr> results = queue->getAllResults();
387 CPPUNIT_ASSERT_EQUAL( (size_t)0, results.size() );
388 }
389}
390
391/** Unit test for resubmitJob().
392 *
393 */
394void FragmentQueueTest::resubmitTest()
395{
396 FragmentJob::ptr testJob(new FragmentJobStub(1));
397
398 // push a Job into queue
399#ifndef NDEBUG
400 CPPUNIT_ASSERT_NO_THROW( queue->pushJob(testJob) );
401#else
402 queue->pushJob(testJob);
403#endif
404 CPPUNIT_ASSERT_EQUAL((size_t)1, queue->jobs.size());
405 CPPUNIT_ASSERT_EQUAL((size_t)1, queue->results.size());
406
407 // pop the job
408 // pop both as if some work was being done
409#ifndef NDEBUG
410 CPPUNIT_ASSERT_NO_THROW( queue->popJob() );
411#else
412 queue->popJob();
413#endif
414 CPPUNIT_ASSERT_EQUAL((size_t)0, queue->jobs.size());
415 CPPUNIT_ASSERT_EQUAL((size_t)1, queue->results.size());
416
417 // resubmit
418#ifndef NDEBUG
419 CPPUNIT_ASSERT_NO_THROW( queue->resubmitJob((JobId_t)1) );
420#else
421 queue->resubmitJob((JobId_t)1);
422#endif
423
424 // check whethers it's present again
425 CPPUNIT_ASSERT_EQUAL((size_t)1, queue->jobs.size());
426 CPPUNIT_ASSERT_EQUAL((size_t)1, queue->results.size());
427}
428
Note: See TracBrowser for help on using the repository browser.