Utils/Console: Add short help to 'ls' output
[senf.git] / Scheduler / Scheduler.test.cc
index b8c5b50..14e01bc 100644 (file)
 // Free Software Foundation, Inc.,
 // 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 
-// Unit tests
+/** \file
+    \brief Scheduler unit tests */
 
-//#include "scheduler.test.hh"
-//#include "scheduler.test.ih"
+//#include "Scheduler.test.hh"
+//#include "Scheduler.test.ih"
 
 // Custom includes
 #include <sys/types.h>
@@ -241,14 +242,14 @@ void schedulerTest()
 
     ///////////////////////////////////////////////////////////////////////////
 
-    senf::scheduler::EventHook evev ("eventCounter", eventeventhandler, true,
-                                      senf::scheduler::EventHook::PRE);
+    senf::scheduler::EventHook evev ("eventCounter", eventeventhandler,
+                                     senf::scheduler::EventHook::PRE);
 
     {
         senf::scheduler::FdEvent fde1 ("testFdEvent", boost::bind(&callback, sock, _1),
                                       sock, senf::scheduler::FdEvent::EV_READ);
         event = senf::scheduler::FdEvent::EV_NONE;
-        BOOST_CHECK_NO_THROW( senf::scheduler::process() );
+        SENF_CHECK_NO_THROW( senf::scheduler::process() );
         BOOST_CHECK_EQUAL( event, senf::scheduler::FdEvent::EV_READ );
         BOOST_REQUIRE_EQUAL( size, 4 );
         buffer[size]=0;
@@ -260,13 +261,13 @@ void schedulerTest()
         strcpy(buffer,"WRITE");
         size=5;
         event = senf::scheduler::FdEvent::EV_NONE;
-        BOOST_CHECK_NO_THROW( senf::scheduler::process() );
+        SENF_CHECK_NO_THROW( senf::scheduler::process() );
         BOOST_CHECK_EQUAL( event, senf::scheduler::FdEvent::EV_WRITE );
 
         SENF_CHECK_NO_THROW( fde2.disable() );
         event = senf::scheduler::FdEvent::EV_NONE;
         sleep(1);
-        BOOST_CHECK_NO_THROW( senf::scheduler::process() );
+        SENF_CHECK_NO_THROW( senf::scheduler::process() );
         BOOST_CHECK_EQUAL( event, senf::scheduler::FdEvent::EV_READ|senf::scheduler::FdEvent::EV_HUP );
         BOOST_REQUIRE_EQUAL( size, 2 );
         buffer[size]=0;
@@ -281,24 +282,24 @@ void schedulerTest()
                                             
         event = senf::scheduler::FdEvent::EV_NONE;
         senf::ClockService::clock_type t (senf::ClockService::now());
-        BOOST_CHECK_NO_THROW( senf::scheduler::process() );
+        SENF_CHECK_NO_THROW( senf::scheduler::process() );
         BOOST_CHECK_PREDICATE( is_close, (senf::ClockService::now()-t) (senf::ClockService::milliseconds(200)) );
         BOOST_CHECK( timeoutCalled );
         BOOST_CHECK( ! timer1.enabled() );
         BOOST_CHECK_EQUAL( event, senf::scheduler::FdEvent::EV_NONE );
         BOOST_CHECK_PREDICATE( is_close, (senf::ClockService::now()) (senf::scheduler::eventTime()) );
         timeoutCalled = false;
-        BOOST_CHECK_NO_THROW( senf::scheduler::process() );
+        SENF_CHECK_NO_THROW( senf::scheduler::process() );
         BOOST_CHECK_PREDICATE( is_close, (senf::ClockService::now()-t) (senf::ClockService::milliseconds(400)) );
         BOOST_CHECK( timeoutCalled );
         BOOST_CHECK_EQUAL( event, senf::scheduler::FdEvent::EV_NONE );
         BOOST_CHECK( ! timer2.enabled() );
 
-        BOOST_WARN_MESSAGE( false, "A 'Scheduler task hanging' error is expected to be signaled here." );
-        BOOST_CHECK_NO_THROW( timer1.action(&blockingHandler) );
-        BOOST_CHECK_NO_THROW( timer1.timeout(senf::ClockService::now()) );
-        BOOST_CHECK_NO_THROW( senf::scheduler::process() );
-        BOOST_CHECK_EQUAL( senf::scheduler::hangCount(), 1u );
+        BOOST_MESSAGE( "A 'Scheduler task hanging' error is expected to be signaled here." );
+        SENF_CHECK_NO_THROW( timer1.action(&blockingHandler) );
+        SENF_CHECK_NO_THROW( timer1.timeout(senf::ClockService::now()) );
+        SENF_CHECK_NO_THROW( senf::scheduler::process() );
+        BOOST_CHECK_EQUAL( senf::scheduler::watchdogEvents(), 1u );
     }
 
     {
@@ -309,10 +310,10 @@ void schedulerTest()
         senf::ClockService::clock_type t = senf::ClockService::now();
         ::kill(::getpid(), SIGUSR1);
         delay(200);
-        BOOST_CHECK_NO_THROW( senf::scheduler::process() ); 
+        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)) );
-        BOOST_CHECK_NO_THROW( senf::scheduler::process() ); 
+        SENF_CHECK_NO_THROW( senf::scheduler::process() ); 
     } 
 
     BOOST_CHECK( eventCount >= 8u );
@@ -333,13 +334,28 @@ BOOST_AUTO_UNIT_TEST(testSchedulerPollTimers)
 
 BOOST_AUTO_UNIT_TEST(testSchedulerHiresTimers)
 {
-    senf::scheduler::hiresTimers();
+    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::scheduler::loresTimers();
+    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<senf::scheduler::detail::TimerSource>(
+                                     new senf::scheduler::detail::POSIXTimerSource())) );
+        schedulerTest();
+        senf::scheduler::loresTimers();
+    }
+}
+
 namespace {
     
     void sigme()
@@ -365,14 +381,14 @@ BOOST_AUTO_UNIT_TEST(blockSignals)
     senf::scheduler::SignalEvent sig (SIGUSR1, &sigusr);
     
     senf::ClockService::clock_type t = senf::ClockService::now();
-    BOOST_CHECK_NO_THROW( senf::scheduler::process() ); 
+    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)) );
 
-    BOOST_CHECK_NO_THROW( senf::scheduler::process() ); 
+    SENF_CHECK_NO_THROW( senf::scheduler::process() ); 
 }
 
 ///////////////////////////////cc.e////////////////////////////////////////