diff --git a/src/libCom/test/Makefile b/src/libCom/test/Makefile index e8e94a3e6..7e1b5a020 100644 --- a/src/libCom/test/Makefile +++ b/src/libCom/test/Makefile @@ -68,6 +68,10 @@ epicsTimeTest_SRCS += epicsTimeTest.cpp testHarness_SRCS += epicsTimeTest.cpp TESTS += epicsTimeTest +TESTPROD_HOST += epicsTimeZoneTest +epicsTimeZoneTest_SRCS += epicsTimeZoneTest.c +TESTS += epicsTimeZoneTest + TESTPROD_HOST += epicsThreadTest epicsThreadTest_SRCS += epicsThreadTest.cpp testHarness_SRCS += epicsThreadTest.cpp diff --git a/src/libCom/test/epicsTimeZoneTest.c b/src/libCom/test/epicsTimeZoneTest.c new file mode 100644 index 000000000..dd12b1acf --- /dev/null +++ b/src/libCom/test/epicsTimeZoneTest.c @@ -0,0 +1,117 @@ +/*************************************************************************\ +* Copyright (c) 2015 Michael Davidsaver +* EPICS BASE is distributed subject to a Software License Agreement found +* in file LICENSE that is included with this distribution. +\*************************************************************************/ + +#include + +#include "envDefs.h" +#include "epicsTime.h" +#include "epicsUnitTest.h" + +#include "testMain.h" + +#if defined(_WIN32) +# define tzset _tzset +#endif + +static +void setTZ(const char *base, const char *dst, int offset) +{ + char tz[20]; + if(offset!=0 || dst) + sprintf(tz, "%s%d%s", base, offset/3600, dst); + else + sprintf(tz, "%s", base); + testDiag("TZ=\"%s\"", tz); + + epicsEnvSet("TZ", tz); + tzset(); +} + +static +void test_localtime(time_t T, int sec, int min, int hour, + int mday, int mon, int year, + int wday, int yday, int isdst) +{ + struct tm B; + testDiag("test_localtime(%ld, ...)", (long)T); + if(epicsTime_localtime(&T, &B)!=epicsTimeOK) { + testFail("epicsTime_localtime() error"); + testSkip(9, "epicsTime_localtime() failed"); + } else { + B.tm_year += 1900; /* for readability */ + testPass("epicsTime_localtime() success"); +#define TEST(FLD) testOk(B.tm_##FLD==FLD, "%s %d==%d", #FLD, B.tm_##FLD, FLD) + TEST(sec); + TEST(min); + TEST(hour); + TEST(mday); + TEST(mon); + TEST(year); + TEST(wday); + TEST(yday); + TEST(isdst); +#undef TEST + } +} + +static +void test_gmtime(time_t T, int sec, int min, int hour, + int mday, int mon, int year, + int wday, int yday, int isdst) +{ + struct tm B; + testDiag("test_gmtime(%ld, ...)", (long)T); + if(epicsTime_gmtime(&T, &B)!=epicsTimeOK) { + testFail("epicsTime_localtime() error"); + testSkip(9, "epicsTime_localtime() failed"); + } else { + B.tm_year += 1900; /* for readability */ + testPass("epicsTime_localtime() success"); +#define TEST(FLD) testOk(B.tm_##FLD==FLD, "%s %d==%d", #FLD, B.tm_##FLD, FLD) + TEST(sec); + TEST(min); + TEST(hour); + TEST(mday); + TEST(mon); + TEST(year); + TEST(wday); + TEST(yday); + TEST(isdst); +#undef TEST + } +} + +MAIN(epicsTimeZoneTest) +{ + testPlan(80); + /* 1445259616 + * Mon Oct 19 09:00:16 2015 EDT + * Mon Oct 19 08:00:16 2015 CDT + * Mon Oct 19 13:00:16 2015 UTC + */ + testDiag("POSIX 1445259616"); + setTZ("EST", "EDT", 5*3600); + test_localtime(1445259616ul, 16, 0, 9, 19, 9, 2015, 1, 291, 1); + setTZ("CST", "CDT", 6*3600); + test_localtime(1445259616ul, 16, 0, 8, 19, 9, 2015, 1, 291, 1); + setTZ("UTC", NULL, 0); + test_localtime(1445259616ul, 16, 0, 13, 19, 9, 2015, 1, 291, 0); + test_gmtime(1445259616ul, 16, 0, 13, 19, 9, 2015, 1, 291, 0); + /* 1421244931 + * Wed Jan 14 09:15:31 2015 EST + * Wed Jan 14 08:15:31 2015 CST + * Wed Jan 14 14:15:31 2015 UTC + */ + testDiag("POSIX 1421244931"); + setTZ("EST", "EDT", 5*3600); + test_localtime(1421244931ul, 31, 15, 9, 14, 0, 2015, 3, 13, 0); + setTZ("CST", "CDT", 6*3600); + test_localtime(1421244931ul, 31, 15, 8, 14, 0, 2015, 3, 13, 0); + setTZ("UTC", NULL, 0); + test_localtime(1421244931ul, 31, 15, 14, 14, 0, 2015, 3, 13, 0); + test_gmtime(1421244931ul, 31, 15, 14, 14, 0, 2015, 3, 13, 0); + return testDone(); +}