some tests for DST, some currently failing, maybe bug in glibc.
authorThomas Jarosch <thomas.jarosch@intra2net.com>
Wed, 28 Jan 2009 17:23:30 +0000 (18:23 +0100)
committerThomas Jarosch <thomas.jarosch@intra2net.com>
Wed, 28 Jan 2009 17:23:30 +0000 (18:23 +0100)
more correct get_next_run interval-calculation, but no bug before

src/cron.cpp
test/test_cron.cpp

index 16a2bb3..4fe9ca1 100644 (file)
@@ -10,6 +10,7 @@
 #include <time.h>
 
 #include <stdexcept>
+#include <iostream>
 
 #include <cron.hpp>
 
@@ -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;
index f3ad0c1..b45ff8a 100644 (file)
@@ -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<time_t>(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<time_t>(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<time_t>(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<time_t>(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<time_t>(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<time_t>(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<time_t>(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<time_t>(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<time_t>(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<time_t>(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<time_t>(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<time_t>(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<time_t>(1238288400), cron.get_next_run(1238288399));
+    }
+
+
     /////////////////////////////////////////////////////
     // Intervals
     /////////////////////////////////////////////////////
@@ -169,12 +291,36 @@ public:
         CPPUNIT_ASSERT_EQUAL( static_cast<time_t>(1233100830), cron.get_next_run(1233100822));
     }
 
-    void IntervalLaststep()
+    void IntervalLaststep1()
     {
         WeekCron cron("2345",3600,7200,11);
         CPPUNIT_ASSERT_EQUAL( static_cast<time_t>(1233187200), cron.get_next_run(1233104399));
     }
 
+    void IntervalLaststep2()
+    {
+        WeekCron cron("2345",3600,7200,11);
+        CPPUNIT_ASSERT_EQUAL( static_cast<time_t>(1233187200), cron.get_next_run(1233104398));
+    }
+
+    void IntervalLaststep3()
+    {
+        WeekCron cron("2345",3600,7199,10);
+        CPPUNIT_ASSERT_EQUAL( static_cast<time_t>(1233187200), cron.get_next_run(1233104397));
+    }
+
+    void IntervalLaststep4()
+    {
+        WeekCron cron("2345",3600,7200,3599);
+        CPPUNIT_ASSERT_EQUAL( static_cast<time_t>(1233104399), cron.get_next_run(1233104398));
+    }
+
+    void IntervalLaststep5()
+    {
+        WeekCron cron("2345",3600,7200,3598);
+        CPPUNIT_ASSERT_EQUAL( static_cast<time_t>(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<time_t>(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);