X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=Scheduler%2FScheduler.test.cc;h=f328d32ea255db648c59d25d0c5fd4a8d33154b4;hb=d270abd20469df1cac466fe24d8dfa3dc119d987;hp=e270b060374a306ad02ca70b9b7761556fc24661;hpb=ac90835cbb00ca83a51ab9efb23fdcb75518e808;p=senf.git diff --git a/Scheduler/Scheduler.test.cc b/Scheduler/Scheduler.test.cc index e270b06..f328d32 100644 --- a/Scheduler/Scheduler.test.cc +++ b/Scheduler/Scheduler.test.cc @@ -1,4 +1,3 @@ - // $Id$ // // Copyright (C) 2006 @@ -46,8 +45,6 @@ #define prefix_ ///////////////////////////////cc.p//////////////////////////////////////// -using namespace senf; - namespace { char const * SOCK_PATH = "/tmp/sched_test.sock"; @@ -102,6 +99,7 @@ namespace { unlink(SOCK_PATH); int pid = fork(); if (pid == 0) { + signal(SIGCHLD, SIG_IGN); server(); _exit(0); } @@ -109,6 +107,7 @@ namespace { error("fork"); return 0; } + signal(SIGCHLD, SIG_DFL); sleep(1); // Wait for the server socket to be opened return pid; @@ -185,16 +184,16 @@ namespace { callback(handle.fd_,event); } - bool is_close(ClockService::clock_type a, ClockService::clock_type b) + bool is_close(senf::ClockService::clock_type a, senf::ClockService::clock_type b) { - return (a= 8u ); + + /////////////////////////////////////////////////////////////////////////// close(sock); @@ -314,6 +325,71 @@ BOOST_AUTO_UNIT_TEST(testScheduler) BOOST_CHECK (stop_server(pid)); } +BOOST_AUTO_UNIT_TEST(testSchedulerPollTimers) +{ + BOOST_CHECK( ! senf::scheduler::usingHiresTimers() ); + schedulerTest(); +} + +BOOST_AUTO_UNIT_TEST(testSchedulerHiresTimers) +{ + if (senf::scheduler::haveScalableHiresTimers()) + BOOST_MESSAGE( "Using timerfd() hires timers" ); + else + BOOST_MESSAGE( "Using POSIX hires timers"); + SENF_CHECK_NO_THROW( senf::scheduler::hiresTimers() ); + BOOST_CHECK( senf::scheduler::usingHiresTimers() ); + schedulerTest(); + SENF_CHECK_NO_THROW( senf::scheduler::loresTimers() ); + BOOST_CHECK( ! senf::scheduler::usingHiresTimers() ); +} + +BOOST_AUTO_UNIT_TEST(testSchedulerPOSIXTimers) +{ + if (senf::scheduler::haveScalableHiresTimers()) { + SENF_CHECK_NO_THROW( senf::scheduler::detail::TimerDispatcher::instance().timerSource( + std::auto_ptr( + new senf::scheduler::detail::POSIXTimerSource())) ); + schedulerTest(); + senf::scheduler::loresTimers(); + } +} + +namespace { + + void sigme() + { + senf::scheduler::BlockSignals signalBlocker; + signalBlocker.block(); + signalBlocker.unblock(); + BOOST_CHECK( ! signalBlocker.blocked() ); + signalBlocker.unblock(); + signalBlocker.block(); + BOOST_CHECK( signalBlocker.blocked() ); + ::kill(::getpid(), SIGUSR1); + delay(200); + } + +} + +BOOST_AUTO_UNIT_TEST(blockSignals) +{ + senf::scheduler::TimerEvent signaler ("sigme", &sigme, senf::ClockService::now()); + senf::scheduler::TimerEvent timer ( + "testWatchdog", &timeout, senf::ClockService::now()+senf::ClockService::milliseconds(400)); + senf::scheduler::SignalEvent sig (SIGUSR1, &sigusr); + + senf::ClockService::clock_type t = senf::ClockService::now(); + SENF_CHECK_NO_THROW( senf::scheduler::process() ); + + BOOST_CHECK_PREDICATE( is_close, + (senf::ClockService::now()) + (t+senf::ClockService::milliseconds(200)) ); + BOOST_CHECK_PREDICATE( is_close, (sigtime) (t+senf::ClockService::milliseconds(200)) ); + + SENF_CHECK_NO_THROW( senf::scheduler::process() ); +} + ///////////////////////////////cc.e//////////////////////////////////////// #undef prefix_