Add Unit Test for SingleThreadedSchedulerClient
Ensures ordering of callbacks within a SingleThreadedSchedulerClient with respect to each other
This commit is contained in:
parent
34dd1a6d5e
commit
9994d01d8b
1 changed files with 43 additions and 1 deletions
|
@ -65,7 +65,7 @@ BOOST_AUTO_TEST_CASE(manythreads)
|
||||||
size_t nTasks = microTasks.getQueueInfo(first, last);
|
size_t nTasks = microTasks.getQueueInfo(first, last);
|
||||||
BOOST_CHECK(nTasks == 0);
|
BOOST_CHECK(nTasks == 0);
|
||||||
|
|
||||||
for (int i = 0; i < 100; i++) {
|
for (int i = 0; i < 100; ++i) {
|
||||||
boost::chrono::system_clock::time_point t = now + boost::chrono::microseconds(randomMsec(rng));
|
boost::chrono::system_clock::time_point t = now + boost::chrono::microseconds(randomMsec(rng));
|
||||||
boost::chrono::system_clock::time_point tReschedule = now + boost::chrono::microseconds(500 + randomMsec(rng));
|
boost::chrono::system_clock::time_point tReschedule = now + boost::chrono::microseconds(500 + randomMsec(rng));
|
||||||
int whichCounter = zeroToNine(rng);
|
int whichCounter = zeroToNine(rng);
|
||||||
|
@ -112,4 +112,46 @@ BOOST_AUTO_TEST_CASE(manythreads)
|
||||||
BOOST_CHECK_EQUAL(counterSum, 200);
|
BOOST_CHECK_EQUAL(counterSum, 200);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BOOST_AUTO_TEST_CASE(singlethreadedscheduler_ordered)
|
||||||
|
{
|
||||||
|
CScheduler scheduler;
|
||||||
|
|
||||||
|
// each queue should be well ordered with respect to itself but not other queues
|
||||||
|
SingleThreadedSchedulerClient queue1(&scheduler);
|
||||||
|
SingleThreadedSchedulerClient queue2(&scheduler);
|
||||||
|
|
||||||
|
// create more threads than queues
|
||||||
|
// if the queues only permit execution of one task at once then
|
||||||
|
// the extra threads should effectively be doing nothing
|
||||||
|
// if they don't we'll get out of order behaviour
|
||||||
|
boost::thread_group threads;
|
||||||
|
for (int i = 0; i < 5; ++i) {
|
||||||
|
threads.create_thread(boost::bind(&CScheduler::serviceQueue, &scheduler));
|
||||||
|
}
|
||||||
|
|
||||||
|
// these are not atomic, if SinglethreadedSchedulerClient prevents
|
||||||
|
// parallel execution at the queue level no synchronization should be required here
|
||||||
|
int counter1 = 0;
|
||||||
|
int counter2 = 0;
|
||||||
|
|
||||||
|
// just simply count up on each queue - if execution is properly ordered then
|
||||||
|
// the callbacks should run in exactly the order in which they were enqueued
|
||||||
|
for (int i = 0; i < 100; ++i) {
|
||||||
|
queue1.AddToProcessQueue([i, &counter1]() {
|
||||||
|
BOOST_CHECK_EQUAL(i, counter1++);
|
||||||
|
});
|
||||||
|
|
||||||
|
queue2.AddToProcessQueue([i, &counter2]() {
|
||||||
|
BOOST_CHECK_EQUAL(i, counter2++);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// finish up
|
||||||
|
scheduler.stop(true);
|
||||||
|
threads.join_all();
|
||||||
|
|
||||||
|
BOOST_CHECK_EQUAL(counter1, 100);
|
||||||
|
BOOST_CHECK_EQUAL(counter2, 100);
|
||||||
|
}
|
||||||
|
|
||||||
BOOST_AUTO_TEST_SUITE_END()
|
BOOST_AUTO_TEST_SUITE_END()
|
||||||
|
|
Loading…
Reference in a new issue