*/
#include <time.h>
#include <stdexcept>
+#include <iostream>
#include <cron.hpp>
{
// interval
time_t next_begin = get_next_point(calc_from,Begin,true);
+std::cerr << "next_begin = " << next_begin << std::endl;
+std::cerr << "next_end = " << get_next_point(calc_from,End-1,true) << std::endl;
if (next_begin > get_next_point(calc_from,End-1,true))
{
// next begin > next end means we are at the begin or within the interval
time_t interval_begin=get_previousnow_point(calc_from,Begin,true);
+std::cerr << "interval_begin = " << interval_begin << std::endl;
time_t within_interval=calc_from - interval_begin;
time_t since_lastrun=within_interval % Every;
time_t next_exec=calc_from+(Every-since_lastrun);
+std::cerr << "next_exec = " << next_exec << std::endl;
+
// next step at or after end?
if (next_exec > get_next_point(calc_from,End-1,true))
return get_next_point(calc_from,Begin,true);
// take care of the weekday
ft.tm_mday+=Week.days_till_set(static_cast<Week::WeekDay>(ft.tm_wday)); //lint !e737 !e713
- ft.tm_hour=0;
- ft.tm_min=0;
- ft.tm_sec=0;
+ fill_tm_with_wallclock(&ft,daysec);
+
// tm_isdst means to use the dst in use at the given time
ft.tm_isdst=-1;
- // get unixtime of start of the day and add daysec
- time_t target=mktime(&ft)+daysec;
+ time_t target=mktime(&ft);
+
+ // check for completely illegal time, should not happen without bug in this func,
+ // return calc_from as safeguard
if (target == (time_t)-1)
return calc_from;
// take care of the weekday
ft.tm_mday-=Week.days_since_set(static_cast<Week::WeekDay>(ft.tm_wday)); //lint !e737 !e713
- ft.tm_hour=0;
- ft.tm_min=0;
- ft.tm_sec=0;
- // tm_isdst=-1 means to use the dst in use at the given time
+ fill_tm_with_wallclock(&ft,daysec);
+
+ // tm_isdst means to use the dst in use at the given time
ft.tm_isdst=-1;
- // get unixtime of start of the day and add daysec
- time_t target=mktime(&ft)+daysec;
+ time_t target=mktime(&ft);
+
+ // check for completely illegal time, should not happen without bug in this func,
+ // return calc_from as safeguard
if (target == (time_t)-1)
return calc_from;
return target;
}
+/**
+ * Converts #daysec into hour/minute/second and fills it into the provided struct tm
+ * @param ft struct tm to fill wallclock time into
+ * @param daysec Start point of time in seconds since the start of the day
+ */
+void WeekCron::fill_tm_with_wallclock(struct tm *ft, const int daysec) const
+{
+ int remain=daysec;
+
+ ft->tm_hour=remain/3600;
+ remain-=ft->tm_hour*3600;
+
+ ft->tm_min=remain/60;
+ remain-=ft->tm_min*60;
+
+ ft->tm_sec=remain;
+}
+
}
}
CPPUNIT_TEST(StartLastDaysec);
CPPUNIT_TEST(HalfOpenInterval);
CPPUNIT_TEST(LongBeforeDSTBackwards);
- CPPUNIT_TEST(BeforeDSTBackwards);
+ CPPUNIT_TEST(BeforeDSTBackwards1);
+ CPPUNIT_TEST(BeforeDSTBackwards2);
CPPUNIT_TEST(AtDSTBackwards);
CPPUNIT_TEST(DuringDSTBackwards);
CPPUNIT_TEST(EndDSTBackwards1);
CPPUNIT_TEST(OverDSTBackwards);
CPPUNIT_TEST(OverDSTBackwardsDaychange);
CPPUNIT_TEST(LongBeforeDSTForward);
- CPPUNIT_TEST(BeforeDSTForward);
+ CPPUNIT_TEST(BeforeDSTForward1);
+ CPPUNIT_TEST(BeforeDSTForward2);
CPPUNIT_TEST(AtDSTForward);
CPPUNIT_TEST(DuringDSTForward);
CPPUNIT_TEST(EndDSTForward1);
CPPUNIT_TEST(EndDSTForward2);
CPPUNIT_TEST(EndDSTForward3);
+ CPPUNIT_TEST(EndDSTForward4);
CPPUNIT_TEST(OverDSTForward);
CPPUNIT_TEST(OverDSTForwardDaychange);
{
WeekCron cron("0123456",75600);
// calc at: Sun Oct 26 00:00:00 CEST 2008
- // expected next run: Sun Oct 26 20:00:00 2008
- CPPUNIT_ASSERT_EQUAL( static_cast<time_t>(1225047600), cron.get_next_run(1224968400));
+ // expected next run: Sun Oct 26 21:00:00 CET 2008
+ CPPUNIT_ASSERT_EQUAL( static_cast<time_t>(1225051200), cron.get_next_run(1224972000));
}
- void BeforeDSTBackwards()
+ void BeforeDSTBackwards1()
+ {
+ WeekCron cron("0123456",7200);
+ // calc at: Sun Oct 26 01:59:59 CEST 2008
+ // expected next run: Sun Oct 26 02:00:00 CET 2008
+ CPPUNIT_ASSERT_EQUAL( static_cast<time_t>(1224982800), cron.get_next_run(1224979199));
+ }
+
+ void BeforeDSTBackwards2()
{
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));
+ CPPUNIT_ASSERT_EQUAL( static_cast<time_t>(1224982800), cron.get_next_run(1224982799));
}
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));
+ CPPUNIT_ASSERT_EQUAL( static_cast<time_t>(1225069200), cron.get_next_run(1224982800));
}
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));
+ CPPUNIT_ASSERT_EQUAL( static_cast<time_t>(1225069200), cron.get_next_run(1224982801));
}
void EndDSTBackwards1()
{
WeekCron cron("0123456",10800);
- // calc at: Sun Oct 26 02:00:00 CET 2008
- // expected next run: Sun Oct 26 02:00:00 2008
- CPPUNIT_ASSERT_EQUAL( static_cast<time_t>(1224982800), cron.get_next_run(1224979200));
+ // calc at: Sun Oct 26 02:00:00 CEST 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 02:00:00 2008
- CPPUNIT_ASSERT_EQUAL( static_cast<time_t>(1224982800), cron.get_next_run(1224979201));
+ // calc at: Sun Oct 26 02:00:01 CEST 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
+ // calc at: Sun Oct 26 02:00:01 CEST 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));
+ CPPUNIT_ASSERT_EQUAL( static_cast<time_t>(1224986399), cron.get_next_run(1224979201));
}
void EndDSTBackwards4()
{
WeekCron cron("0123456",10799);
- // calc at: Sun Oct 26 02:03:20 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));
+ // calc at: Sun Oct 26 02:03:20 CET 2008
+ // expected next run: Sun Oct 26 02:59:59 CET 2008
+ CPPUNIT_ASSERT_EQUAL( static_cast<time_t>(1224986399), cron.get_next_run(1224983000));
}
void OverDSTBackwards()
{
WeekCron cron("234",10800);
- // calc at: Sat Oct 25 05:00:00 2008
- // expected next run: Tue Oct 28 03:00:00 2008
+ // calc at: Sat Oct 25 05:00:00 CEST 2008
+ // expected next run: Tue Oct 28 03:00:00 CET 2008
CPPUNIT_ASSERT_EQUAL( static_cast<time_t>(1225159200), cron.get_next_run(1224903600));
}
void OverDSTBackwardsDaychange()
{
WeekCron cron("234",0);
- // calc at: Sat Oct 25 00:00:00 2008
- // expected next run: Tue Oct 28 00:00:00 2008
+ // calc at: Sat Oct 25 00:00:00 CEST 2008
+ // expected next run: Tue Oct 28 00:00:00 CET 2008
CPPUNIT_ASSERT_EQUAL( static_cast<time_t>(1225148400), cron.get_next_run(1224885600));
}
{
WeekCron cron("0123456",75600);
// calc at: Sat Mar 28 22:00:00 CET 2009
- // expected next run: Sun Mar 29 22:00:00 2009
- CPPUNIT_ASSERT_EQUAL( static_cast<time_t>(1238356800), cron.get_next_run(1238274000));
+ // expected next run: Sun Mar 29 21:00:00 CEST 2009
+ CPPUNIT_ASSERT_EQUAL( static_cast<time_t>(1238353200), cron.get_next_run(1238274000));
}
- void BeforeDSTForward()
+ void BeforeDSTForward1()
{
WeekCron cron("0123456",7200);
// calc at: Sun Mar 29 01:59:59 CET 2009
CPPUNIT_ASSERT_EQUAL( static_cast<time_t>(1238288400), cron.get_next_run(1238288399));
}
+ void BeforeDSTForward2()
+ {
+ WeekCron cron("0123456",0);
+ // calc at: Sun Mar 29 01:59:59 CET 2009
+ // expected next run: Mon Mar 30 00:00:00 CEST 2009
+ CPPUNIT_ASSERT_EQUAL( static_cast<time_t>(1238364000), cron.get_next_run(1238288399));
+ }
+
void AtDSTForward()
{
WeekCron cron("0123456",7200);
{
WeekCron cron("0123456",10800);
// calc at: Sun Mar 29 01:59:59 CET 2009
- // expected next run: Sun Mar 29 04:00:00 2009
- CPPUNIT_ASSERT_EQUAL( static_cast<time_t>(1238292000), cron.get_next_run(1238288399));
+ // 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 EndDSTForward2()
{
WeekCron cron("0123456",10800);
- // calc at: Sun Mar 29 03:00:00 2009
- // expected next run: Sun Mar 29 04:00:00 2009
- CPPUNIT_ASSERT_EQUAL( static_cast<time_t>(1238292000), cron.get_next_run(1238288400));
+ // calc at: Sun Mar 29 03:00:00 CEST 2009
+ // expected next run: Mon Mar 30 03:00:00 CEST 2009
+ CPPUNIT_ASSERT_EQUAL( static_cast<time_t>(1238374800), cron.get_next_run(1238288400));
}
void EndDSTForward3()
{
WeekCron cron("0123456",10800);
- // calc at: Sun Mar 29 04:00:00 2009
- // expected next run: Mon Mar 30 03:00:00 2009
+ // calc at: Sun Mar 29 04:00:00 CEST 2009
+ // expected next run: Mon Mar 30 03:00:00 CEST 2009
CPPUNIT_ASSERT_EQUAL( static_cast<time_t>(1238374800), cron.get_next_run(1238292000));
}
+ void EndDSTForward4()
+ {
+ WeekCron cron("0123456",86339);
+ // calc at: Sun Mar 29 11:42:06 CEST 2009
+ // expected next run: Sun Mar 29 23:58:59 CEST 2009
+ CPPUNIT_ASSERT_EQUAL( static_cast<time_t>(1238363939), cron.get_next_run(1238319726));
+ }
+
void OverDSTForward()
{
WeekCron cron("234",10800);
- // calc at: Sat Mar 28 23:00:00 2009
- // expected next run: Tue Mar 31 03:00:00 2009
+ // calc at: Sat Mar 28 23:00:00 CET 2009
+ // expected next run: Tue Mar 31 03:00:00 CEST 2009
CPPUNIT_ASSERT_EQUAL( static_cast<time_t>(1238461200), cron.get_next_run(1238277600));
}
void OverDSTForwardDaychange()
{
WeekCron cron("1234",0);
- // calc at: Sun Mar 29 00:00:00 2009
- // expected next run: Mon Mar 30 00:00:00 2009
+ // calc at: Sun Mar 29 00:00:00 CET 2009
+ // expected next run: Mon Mar 30 00:00:00 CEST 2009
CPPUNIT_ASSERT_EQUAL( static_cast<time_t>(1238364000), cron.get_next_run(1238281200));
}