X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=Utils%2FDaemon%2FDaemon.test.cc;h=b62d7ba15bfacd06f284c451d8f96ac8b43842ca;hb=bd9f9d3fd6fbcff0112a7bf48ab9284da9576b11;hp=aceed1c34d4b19ca3fbda2c23a4885c4b54d9082;hpb=9e69297ff7a7bcd9d952a38e35bbf124cb7f1dda;p=senf.git diff --git a/Utils/Daemon/Daemon.test.cc b/Utils/Daemon/Daemon.test.cc index aceed1c..b62d7ba 100644 --- a/Utils/Daemon/Daemon.test.cc +++ b/Utils/Daemon/Daemon.test.cc @@ -1,8 +1,8 @@ // $Id$ // -// Copyright (C) 2007 -// Fraunhofer Institut fuer offene Kommunikationssysteme (FOKUS) -// Kompetenzzentrum fuer NETwork research (NET) +// Copyright (C) 2007 +// 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 @@ -21,7 +21,7 @@ // 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. /** \file - \brief Daemon.test unit tests */ + \brief Daemon unit tests */ //#include "Daemon.test.hh" //#include "Daemon.test.ih" @@ -34,9 +34,11 @@ #include #include #include "Daemon.hh" -#include "../Utils/Exception.hh" +#include "../Exception.hh" +#include "../Backtrace.hh" +#include "../../Scheduler/Scheduler.hh" -#include "../Utils/auto_unit_test.hh" +#include "../auto_unit_test.hh" #include #define prefix_ @@ -63,11 +65,12 @@ namespace { void init() { std::cout << "Running init()" << std::endl; + std::cerr << "(stderr)" << std::endl; } void run() { std::cout << "Running run()" << std::endl; - delay(1500); + delay(2000); } }; @@ -77,16 +80,41 @@ namespace { return instance.start(argc, argv); } + int pid; + + void backtrace(int) + { + senf::backtrace(std::cerr, 100); + ::signal(SIGABRT, SIG_DFL); + ::kill(::getpid(), SIGABRT); + }; + int run(int argc, char const ** argv) { - int pid (::fork()); - if (pid < 0) senf::throwErrno("::fork()"); + pid = ::fork(); + if (pid < 0) throw senf::SystemException("::fork()"); if (pid == 0) { - ::_exit(myMain(argc, argv)); + signal(SIGABRT, &backtrace); + signal(SIGCHLD, SIG_IGN); + try { + ::_exit(myMain(argc, argv)); + } catch (std::exception & ex) { + std::cerr << "Unexpected exception: " << ex.what() << std::endl; + } catch (...) { + std::cerr << "Unexpected exception" << std::endl; + } + ::_exit(125); } + signal(SIGCHLD, SIG_DFL); int status; - if (::waitpid(pid, &status, 0) < 0) senf::throwErrno("::waitpid()"); - return WIFEXITED(status) ? WEXITSTATUS(status) : -1; + if (::waitpid(pid, &status, 0) < 0) + throw senf::SystemException("::waitpid()"); + if (WIFSIGNALED(status)) + std::cerr << "Terminated with signal " + << senf::signalName(WTERMSIG(status)) << "(" << WTERMSIG(status) << ")\n"; + else if (WIFEXITED(status)) + std::cerr << "Exited normally with exit status " << WEXITSTATUS(status) << "\n"; + return status; } } @@ -94,22 +122,37 @@ namespace { BOOST_AUTO_UNIT_TEST(testDaemon) { char const * args[] = { "run", - "--console-log=testDaemon.log,none", + "--console-log=testDaemon.log", "--pid-file=testDaemon.pid" }; - BOOST_CHECK_EQUAL( run(sizeof(args)/sizeof(*args),args), 0 ); + + SENF_CHECK_NO_THROW( BOOST_CHECK_EQUAL( run(sizeof(args)/sizeof(*args), args), 0 ) ); BOOST_CHECK( ! boost::filesystem::exists("invalid.log") ); BOOST_CHECK( ! boost::filesystem::exists("invalid.pid") ); BOOST_CHECK( boost::filesystem::exists("testDaemon.pid") ); - delay(1000); - BOOST_CHECK( ! boost::filesystem::exists("testDaemon.pid") ); BOOST_REQUIRE( boost::filesystem::exists("testDaemon.log") ); - std::ifstream log ("testDaemon.log"); + boost::filesystem::rename("testDaemon.log", "testDaemon.log.1"); + { + std::ifstream pidFile ("testDaemon.pid"); + int pid (0); + BOOST_CHECK( pidFile >> pid ); + BOOST_CHECK( pid != 0 ); + if (pid != 0) + ::kill(pid, SIGHUP); + } + + delay(2000); + BOOST_CHECK( ! boost::filesystem::exists("testDaemon.pid") ); + BOOST_CHECK( boost::filesystem::exists("testDaemon.log") ); + BOOST_CHECK( boost::filesystem::exists("testDaemon.log.1") ); + + std::ifstream log ("testDaemon.log.1"); std::stringstream data; data << log.rdbuf(); - BOOST_CHECK_EQUAL( data.str(), "Running init()\nRunning run()\n" ); - BOOST_CHECK_NO_THROW( boost::filesystem::remove("testDaemon.log") ); + BOOST_CHECK_EQUAL( data.str(), "Running init()\n(stderr)\nRunning run()\n" ); + SENF_CHECK_NO_THROW( boost::filesystem::remove("testDaemon.log") ); + SENF_CHECK_NO_THROW( boost::filesystem::remove("testDaemon.log.1") ); } ///////////////////////////////cc.e////////////////////////////////////////