From: Thomas Jarosch Date: Wed, 28 Jan 2009 17:23:30 +0000 (+0100) Subject: some tests for DST, some currently failing, maybe bug in glibc. X-Git-Tag: v2.6~136^2~15 X-Git-Url: http://developer.intra2net.com/git/?a=commitdiff_plain;h=78b3ba9dee44f5d293104ac69ffad52f68dad264;p=libi2ncommon some tests for DST, some currently failing, maybe bug in glibc. more correct get_next_run interval-calculation, but no bug before --- diff --git a/src/cron.cpp b/src/cron.cpp index 16a2bb3..4fe9ca1 100644 --- a/src/cron.cpp +++ b/src/cron.cpp @@ -10,6 +10,7 @@ #include #include +#include #include @@ -105,7 +106,7 @@ time_t WeekCron::get_next_run(time_t calc_from) time_t next_exec=calc_from+(Every-since_lastrun); // next step at or after end? - if (next_exec >= get_next_point(calc_from,End,true)) + if (next_exec > get_next_point(calc_from,End-1,true)) return get_next_point(calc_from,Begin,true); else return next_exec; diff --git a/test/test_cron.cpp b/test/test_cron.cpp index f3ad0c1..b45ff8a 100644 --- a/test/test_cron.cpp +++ b/test/test_cron.cpp @@ -35,6 +35,19 @@ class TestCronFunc : public TestFixture CPPUNIT_TEST(StartMidnightTomorrow); CPPUNIT_TEST(StartLastDaysec); CPPUNIT_TEST(HalfOpenInterval); + CPPUNIT_TEST(LongBeforeDSTBackwards); + CPPUNIT_TEST(BeforeDSTBackwards); + CPPUNIT_TEST(AtDSTBackwards); + CPPUNIT_TEST(DuringDSTBackwards); + CPPUNIT_TEST(EndDSTBackwards1); + CPPUNIT_TEST(EndDSTBackwards2); + CPPUNIT_TEST(EndDSTBackwards3); + CPPUNIT_TEST(EndDSTBackwards4); + CPPUNIT_TEST(LongBeforeDSTForward); + CPPUNIT_TEST(BeforeDSTForward); + CPPUNIT_TEST(AtDSTForward); + CPPUNIT_TEST(DuringDSTForward); + CPPUNIT_TEST(EndDSTForward); // Intervals CPPUNIT_TEST(IntervalBeginToday); @@ -42,7 +55,11 @@ class TestCronFunc : public TestFixture CPPUNIT_TEST(IntervalBeginNow); CPPUNIT_TEST(IntervalBeginStep); CPPUNIT_TEST(IntervalWithin); - CPPUNIT_TEST(IntervalLaststep); + CPPUNIT_TEST(IntervalLaststep1); + CPPUNIT_TEST(IntervalLaststep2); + CPPUNIT_TEST(IntervalLaststep3); + CPPUNIT_TEST(IntervalLaststep4); + CPPUNIT_TEST(IntervalLaststep5); CPPUNIT_TEST(IntervalLaststepMatch); CPPUNIT_TEST(IntervalEnd); CPPUNIT_TEST(IntervalBigstep); @@ -135,6 +152,111 @@ public: CPPUNIT_ASSERT_THROW(cron.get_next_run(1233097200),std::runtime_error); } + void LongBeforeDSTBackwards() + { + WeekCron cron("0123456",75600); + // calc at: Sun Oct 26 00:00:00 CEST 2008 + // expected next run: Sun Oct 26 21:00:00 CET 2008 + CPPUNIT_ASSERT_EQUAL( static_cast(1225051200), cron.get_next_run(1224968400)); + } + + void BeforeDSTBackwards() + { + WeekCron cron("0123456",7200); + // calc at: Sun Oct 26 02:59:59 CEST 2008 + // expected next run: Sun Oct 26 02:00:00 CET 2008 + CPPUNIT_ASSERT_EQUAL( static_cast(1224979200), cron.get_next_run(1224979199)); + } + + void AtDSTBackwards() + { + WeekCron cron("0123456",7200); + // calc at: Sun Oct 26 02:00:00 CET 2008 + // expected next run: Mon Oct 27 02:00:00 CET 2008 + CPPUNIT_ASSERT_EQUAL( static_cast(1225069200), cron.get_next_run(1224979200)); + } + + void DuringDSTBackwards() + { + WeekCron cron("0123456",7200); + // calc at: Sun Oct 26 02:00:01 CET 2008 + // expected next run: Mon Oct 27 02:00:00 CET 2008 + CPPUNIT_ASSERT_EQUAL( static_cast(1225069200), cron.get_next_run(1224979201)); + } + + void EndDSTBackwards1() + { + WeekCron cron("0123456",10800); + // calc at: Sun Oct 26 02:00:00 CET 2008 + // expected next run: Sun Oct 26 03:00:00 CET 2008 + CPPUNIT_ASSERT_EQUAL( static_cast(1224986400), cron.get_next_run(1224979200)); + } + + void EndDSTBackwards2() + { + WeekCron cron("0123456",10800); + // calc at: Sun Oct 26 02:00:01 CET 2008 + // expected next run: Sun Oct 26 03:00:00 CET 2008 + CPPUNIT_ASSERT_EQUAL( static_cast(1224986400), cron.get_next_run(1224979201)); + } + + void EndDSTBackwards3() + { + WeekCron cron("0123456",10799); + // calc at: Sun Oct 26 02:00:01 CET 2008 + // expected next run: Sun Oct 26 02:59:59 CET 2008 + CPPUNIT_ASSERT_EQUAL( static_cast(1224982799), cron.get_next_run(1224979201)); + } + + void EndDSTBackwards4() + { + WeekCron cron("0123456",10799); + // calc at: Sun Oct 26 03:03:20 CET 2008 + // expected next run: Mon Oct 27 02:59:59 CET 2008 + CPPUNIT_ASSERT_EQUAL( static_cast(1225072799), cron.get_next_run(1224983000)); + } + + void LongBeforeDSTForward() + { + WeekCron cron("0123456",75600); + // calc at: Sat Mar 28 22:00:00 CET 2009 + // expected next run: Sun Mar 29 21:00:00 CEST 2009 + CPPUNIT_ASSERT_EQUAL( static_cast(1238349600), cron.get_next_run(1238274000)); + } + + void BeforeDSTForward() + { + WeekCron cron("0123456",7200); + // calc at: Sun Mar 29 01:59:59 CET 2009 + // expected next run: Sun Mar 29 03:00:00 CEST 2009 + CPPUNIT_ASSERT_EQUAL( static_cast(1238288400), cron.get_next_run(1238288399)); + } + + void AtDSTForward() + { + WeekCron cron("0123456",7200); + // calc at: Sun Mar 29 03:00:00 CEST 2009 + // expected next run: Mon Mar 30 02:00:00 CEST 2009 + CPPUNIT_ASSERT_EQUAL( static_cast(1238367600), cron.get_next_run(1238288400)); + } + + void DuringDSTForward() + { + WeekCron cron("0123456",9000); + // calc at: Sun Mar 29 01:59:59 CET 2009 + // expected next run: Sun Mar 29 03:30:00 CEST 2009 + CPPUNIT_ASSERT_EQUAL( static_cast(1238290200), cron.get_next_run(1238288399)); + } + + void EndDSTForward() + { + WeekCron cron("0123456",10800); + // calc at: Sun Mar 29 01:59:59 CET 2009 + // expected next run: Sun Mar 29 03:00:00 CEST 2009 + CPPUNIT_ASSERT_EQUAL( static_cast(1238288400), cron.get_next_run(1238288399)); + } + + ///////////////////////////////////////////////////// // Intervals ///////////////////////////////////////////////////// @@ -169,12 +291,36 @@ public: CPPUNIT_ASSERT_EQUAL( static_cast(1233100830), cron.get_next_run(1233100822)); } - void IntervalLaststep() + void IntervalLaststep1() { WeekCron cron("2345",3600,7200,11); CPPUNIT_ASSERT_EQUAL( static_cast(1233187200), cron.get_next_run(1233104399)); } + void IntervalLaststep2() + { + WeekCron cron("2345",3600,7200,11); + CPPUNIT_ASSERT_EQUAL( static_cast(1233187200), cron.get_next_run(1233104398)); + } + + void IntervalLaststep3() + { + WeekCron cron("2345",3600,7199,10); + CPPUNIT_ASSERT_EQUAL( static_cast(1233187200), cron.get_next_run(1233104397)); + } + + void IntervalLaststep4() + { + WeekCron cron("2345",3600,7200,3599); + CPPUNIT_ASSERT_EQUAL( static_cast(1233104399), cron.get_next_run(1233104398)); + } + + void IntervalLaststep5() + { + WeekCron cron("2345",3600,7200,3598); + CPPUNIT_ASSERT_EQUAL( static_cast(1233187200), cron.get_next_run(1233104398)); + } + void IntervalLaststepMatch() { WeekCron cron("2345",3600,7200,10); @@ -258,22 +404,6 @@ public: WeekCron cron("2345",0,0,86400); CPPUNIT_ASSERT_EQUAL( static_cast(1233183600), cron.get_next_run(1233097200)); } - - - - // TODO: Tom, add some evil tests here, im done here for yesterday ;) - // ideas: - // - daylightsaving on - // - start, end - // - interval in between - // - at the end of dst-day - // - daylightsaving off - // - start, end - // - interval in between - // - at the end of dst-day - // - year-turn (does our old mktime this correctly?) - // - feb 29 - }; CPPUNIT_TEST_SUITE_REGISTRATION(TestCronFunc);