X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=Scheduler%2FScheduler.test.cc;h=0a135182e2abfe34b4d070d822365eab52d4c629;hb=f2f5d59e83863f3b513950173baee1b6da2aee3c;hp=78aaa4d29c602e0545b394160fe5f7ce094c5252;hpb=85ab07d100a382467a42e19d741d403a7a96c951;p=senf.git diff --git a/Scheduler/Scheduler.test.cc b/Scheduler/Scheduler.test.cc index 78aaa4d..0a13518 100644 --- a/Scheduler/Scheduler.test.cc +++ b/Scheduler/Scheduler.test.cc @@ -1,9 +1,9 @@ // $Id$ // // Copyright (C) 2006 -// Fraunhofer Institut fuer offene Kommunikationssysteme (FOKUS) -// Kompetenzzentrum fuer Satelitenkommunikation (SatCom) -// Stefan Bund +// Fraunhofer Institute for Open Communication Systems (FOKUS) +// Competence Center NETwork research (NET), St. Augustin, GERMANY +// Stefan Bund // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by @@ -20,10 +20,11 @@ // 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 @@ -35,17 +36,16 @@ #include #include #include +#include #include "Scheduler.hh" -#include +#include "../Utils/auto_unit_test.hh" #include #define prefix_ ///////////////////////////////cc.p//////////////////////////////////////// -using namespace senf; - namespace { char const * SOCK_PATH = "/tmp/sched_test.sock"; @@ -100,6 +100,7 @@ namespace { unlink(SOCK_PATH); int pid = fork(); if (pid == 0) { + signal(SIGCHLD, SIG_IGN); server(); _exit(0); } @@ -107,6 +108,7 @@ namespace { error("fork"); return 0; } + signal(SIGCHLD, SIG_DFL); sleep(1); // Wait for the server socket to be opened return pid; @@ -140,33 +142,28 @@ namespace { int size; int event; - void callback(int fd, Scheduler::EventId ev) + void callback(int fd, int ev) { event = ev; - switch (event) { - case Scheduler::EV_READ: + switch (event & senf::scheduler::FdEvent::EV_ALL) { + case senf::scheduler::FdEvent::EV_READ: size = recv(fd,buffer,1024,0); break; - case Scheduler::EV_PRIO: + case senf::scheduler::FdEvent::EV_PRIO: size = recv(fd,buffer,1024,MSG_OOB); - Scheduler::instance().terminate(); break; - case Scheduler::EV_WRITE: + case senf::scheduler::FdEvent::EV_WRITE: size = write(fd,buffer,size); - Scheduler::instance().terminate(); break; - case Scheduler::EV_HUP: - case Scheduler::EV_ERR: - case Scheduler::EV_NONE: - case Scheduler::EV_ALL: - ; } - Scheduler::instance().terminate(); + senf::scheduler::terminate(); } + bool timeoutCalled = false; void timeout() { - Scheduler::instance().terminate(); + timeoutCalled = true; + senf::scheduler::terminate(); } struct HandleWrapper @@ -181,21 +178,49 @@ namespace { return handle.fd_; } - void handleCallback(HandleWrapper const & handle, Scheduler::EventId event) + void handleCallback(HandleWrapper const & handle, int event) { if (handle.tag_ != "TheTag") return; callback(handle.fd_,event); } - bool is_close(MicroTime a, MicroTime b) + bool is_close(senf::ClockService::clock_type a, senf::ClockService::clock_type b) + { + return (a= 8u ); + + /////////////////////////////////////////////////////////////////////////// close(sock); @@ -258,6 +326,71 @@ BOOST_AUTO_UNIT_TEST(scheduler) 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_ @@ -268,4 +401,6 @@ BOOST_AUTO_UNIT_TEST(scheduler) // c-file-style: "senf" // indent-tabs-mode: nil // ispell-local-dictionary: "american" +// compile-command: "scons -u test" +// comment-column: 40 // End: