#include "Scheduler.hh"
-#include <boost/test/auto_unit_test.hpp>
+#include "../Utils/auto_unit_test.hh"
#include <boost/test/test_tools.hpp>
#define prefix_
bool is_close(ClockService::clock_type a, ClockService::clock_type b)
{
- return (a<b ? b-a : a-b) < 10100000UL; // a little bit over 10ms
+ return (a<b ? b-a : a-b) < ClockService::milliseconds(100);
}
+
+ ClockService::clock_type sigtime (0);
+ void sigusr()
+ {
+ sigtime = ClockService::now();
+ Scheduler::instance().terminate();
+ }
+
+ void delay(unsigned long milliseconds)
+ {
+ struct timespec ts;
+ ts.tv_sec = milliseconds / 1000;
+ ts.tv_nsec = (milliseconds % 1000) * 1000000;
+ while (nanosleep(&ts,&ts) < 0 && errno == EINTR) ;
+ }
}
BOOST_AUTO_UNIT_TEST(scheduler)
BOOST_CHECK_NO_THROW( Scheduler::instance() );
- BOOST_CHECK_NO_THROW( Scheduler::instance().add(sock,&callback,Scheduler::EV_READ) );
+ BOOST_CHECK_NO_THROW( Scheduler::instance().add(sock,boost::bind(&callback, sock, _1),
+ Scheduler::EV_READ) );
event = Scheduler::EV_NONE;
BOOST_CHECK_NO_THROW( Scheduler::instance().process() );
BOOST_CHECK_EQUAL( event, Scheduler::EV_READ );
BOOST_CHECK_EQUAL( buffer, "READ" );
BOOST_CHECK_NO_THROW( Scheduler::instance().timeout(
- ClockService::now()+100000000UL,&timeout) );
+ ClockService::now()+ClockService::milliseconds(200),&timeout) );
BOOST_CHECK_NO_THROW( Scheduler::instance().timeout(
- ClockService::now()+200000000UL,&timeout) );
+ ClockService::now()+ClockService::milliseconds(400),&timeout) );
ClockService::clock_type t (ClockService::now());
BOOST_CHECK_NO_THROW( Scheduler::instance().process() );
- BOOST_CHECK_PREDICATE( is_close, (ClockService::now()) (t+100000000UL) );
+ BOOST_CHECK_PREDICATE( is_close, (ClockService::now()) (t+ClockService::milliseconds(200)) );
BOOST_CHECK_NO_THROW( Scheduler::instance().process() );
- BOOST_CHECK_PREDICATE( is_close, (ClockService::now()) (t+200000000UL) );
+ BOOST_CHECK_PREDICATE( is_close, (ClockService::now()) (t+ClockService::milliseconds(400)) );
HandleWrapper handle(sock,"TheTag");
- BOOST_CHECK_NO_THROW( Scheduler::instance().add(handle,&handleCallback,Scheduler::EV_WRITE) );
+ BOOST_CHECK_NO_THROW( Scheduler::instance().add(handle,
+ boost::bind(&handleCallback,handle,_1),
+ Scheduler::EV_WRITE) );
strcpy(buffer,"WRITE");
size=5;
event = Scheduler::EV_NONE;
BOOST_REQUIRE_EQUAL( size, 2 );
buffer[size]=0;
BOOST_CHECK_EQUAL( buffer, "OK" );
+ BOOST_CHECK_NO_THROW( Scheduler::instance().remove(handle) );
+
+ unsigned tid (Scheduler::instance().timeout(
+ ClockService::now()+ClockService::milliseconds(400),&timeout));
+ BOOST_CHECK_NO_THROW( Scheduler::instance().registerSignal(SIGUSR1, &sigusr) );
+ t = ClockService::now();
+ ::kill(::getpid(), SIGUSR1);
+ delay(100);
+ BOOST_CHECK_NO_THROW( Scheduler::instance().process() );
+ BOOST_CHECK_PREDICATE( is_close, (ClockService::now()) (t+ClockService::milliseconds(200)) );
+ BOOST_CHECK_PREDICATE( is_close, (sigtime) (t+ClockService::milliseconds(200)) );
+ Scheduler::instance().cancelTimeout(tid);
+ BOOST_CHECK_NO_THROW( Scheduler::instance().unregisterSignal(SIGUSR1) );
///////////////////////////////////////////////////////////////////////////