123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824 |
- /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
- /* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
- /*
- * file: timetest.c
- * description: test time and date routines
- */
- /***********************************************************************
- ** Includes
- ***********************************************************************/
- /* Used to get the command line option */
- #include "plgetopt.h"
- #include "prinit.h"
- #include "prtime.h"
- #include "prprf.h"
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- int failed_already=0;
- PRBool debug_mode = PR_FALSE;
- static char *dayOfWeek[] =
- { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "???" };
- static char *month[] =
- { "Jan", "Feb", "Mar", "Apr", "May", "Jun",
- "Jul", "Aug", "Sep", "Oct", "Nov", "Dec", "???"
- };
- static void PrintExplodedTime(const PRExplodedTime *et) {
- PRInt32 totalOffset;
- PRInt32 hourOffset, minOffset;
- const char *sign;
- /* Print day of the week, month, day, hour, minute, and second */
- if (debug_mode) printf("%s %s %ld %02ld:%02ld:%02ld ",
- dayOfWeek[et->tm_wday], month[et->tm_month], et->tm_mday,
- et->tm_hour, et->tm_min, et->tm_sec);
- /* Print time zone */
- totalOffset = et->tm_params.tp_gmt_offset + et->tm_params.tp_dst_offset;
- if (totalOffset == 0) {
- if (debug_mode) {
- printf("UTC ");
- }
- } else {
- sign = "+";
- if (totalOffset < 0) {
- totalOffset = -totalOffset;
- sign = "-";
- }
- hourOffset = totalOffset / 3600;
- minOffset = (totalOffset % 3600) / 60;
- if (debug_mode) {
- printf("%s%02ld%02ld ", sign, hourOffset, minOffset);
- }
- }
- /* Print year */
- if (debug_mode) {
- printf("%hd", et->tm_year);
- }
- }
- static int ExplodedTimeIsEqual(const PRExplodedTime *et1,
- const PRExplodedTime *et2)
- {
- if (et1->tm_usec == et2->tm_usec &&
- et1->tm_sec == et2->tm_sec &&
- et1->tm_min == et2->tm_min &&
- et1->tm_hour == et2->tm_hour &&
- et1->tm_mday == et2->tm_mday &&
- et1->tm_month == et2->tm_month &&
- et1->tm_year == et2->tm_year &&
- et1->tm_wday == et2->tm_wday &&
- et1->tm_yday == et2->tm_yday &&
- et1->tm_params.tp_gmt_offset == et2->tm_params.tp_gmt_offset &&
- et1->tm_params.tp_dst_offset == et2->tm_params.tp_dst_offset) {
- return 1;
- } else {
- return 0;
- }
- }
- static void
- testParseTimeString(PRTime t)
- {
- PRExplodedTime et;
- PRTime t2;
- char timeString[128];
- char buf[128];
- PRInt32 totalOffset;
- PRInt32 hourOffset, minOffset;
- const char *sign;
- PRInt64 usec_per_sec;
- /* Truncate the microsecond part of PRTime */
- LL_I2L(usec_per_sec, PR_USEC_PER_SEC);
- LL_DIV(t, t, usec_per_sec);
- LL_MUL(t, t, usec_per_sec);
- PR_ExplodeTime(t, PR_LocalTimeParameters, &et);
- /* Print day of the week, month, day, hour, minute, and second */
- PR_snprintf(timeString, 128, "%s %s %ld %02ld:%02ld:%02ld ",
- dayOfWeek[et.tm_wday], month[et.tm_month], et.tm_mday,
- et.tm_hour, et.tm_min, et.tm_sec);
- /* Print time zone */
- totalOffset = et.tm_params.tp_gmt_offset + et.tm_params.tp_dst_offset;
- if (totalOffset == 0) {
- strcat(timeString, "GMT "); /* I wanted to use "UTC" here, but
- * PR_ParseTimeString doesn't
- * understand "UTC". */
- } else {
- sign = "+";
- if (totalOffset < 0) {
- totalOffset = -totalOffset;
- sign = "-";
- }
- hourOffset = totalOffset / 3600;
- minOffset = (totalOffset % 3600) / 60;
- PR_snprintf(buf, 128, "%s%02ld%02ld ", sign, hourOffset, minOffset);
- strcat(timeString, buf);
- }
- /* Print year */
- PR_snprintf(buf, 128, "%hd", et.tm_year);
- strcat(timeString, buf);
- if (PR_ParseTimeString(timeString, PR_FALSE, &t2) == PR_FAILURE) {
- fprintf(stderr, "PR_ParseTimeString() failed\n");
- exit(1);
- }
- if (LL_NE(t, t2)) {
- fprintf(stderr, "PR_ParseTimeString() incorrect\n");
- PR_snprintf(buf, 128, "t is %lld, t2 is %lld, time string is %s\n",
- t, t2, timeString);
- fprintf(stderr, "%s\n", buf);
- exit(1);
- }
- }
- int main(int argc, char** argv)
- {
- /* The command line argument: -d is used to determine if the test is being run
- in debug mode. The regress tool requires only one line output:PASS or FAIL.
- All of the printfs associated with this test has been handled with a if (debug_mode)
- test.
- Usage: test_name -d
- */
- PLOptStatus os;
- PLOptState *opt;
- PR_STDIO_INIT();
- opt = PL_CreateOptState(argc, argv, "d");
- while (PL_OPT_EOL != (os = PL_GetNextOpt(opt)))
- {
- if (PL_OPT_BAD == os) {
- continue;
- }
- switch (opt->option)
- {
- case 'd': /* debug mode */
- debug_mode = PR_TRUE;
- break;
- default:
- break;
- }
- }
- PL_DestroyOptState(opt);
- /* main test */
- PR_Init(PR_USER_THREAD, PR_PRIORITY_NORMAL, 0);
- /* Testing zero PRTime (the epoch) */
- {
- PRTime t;
- PRExplodedTime et;
- LL_I2L(t, 0);
- if (debug_mode) {
- printf("The NSPR epoch is:\n");
- }
- PR_ExplodeTime(t, PR_LocalTimeParameters, &et);
- PrintExplodedTime(&et);
- if (debug_mode) {
- printf("\n");
- }
- PR_ExplodeTime(t, PR_GMTParameters, &et);
- PrintExplodedTime(&et);
- if (debug_mode) {
- printf("\n\n");
- }
- testParseTimeString(t);
- }
- /*
- *************************************************************
- **
- ** Testing PR_Now(), PR_ExplodeTime, and PR_ImplodeTime
- ** on the current time
- **
- *************************************************************
- */
- {
- PRTime t1, t2;
- PRExplodedTime et;
- if (debug_mode) {
- printf("*********************************************\n");
- printf("** **\n");
- printf("** Testing PR_Now(), PR_ExplodeTime, and **\n");
- printf("** PR_ImplodeTime on the current time **\n");
- printf("** **\n");
- printf("*********************************************\n\n");
- }
- t1 = PR_Now();
- /* First try converting to UTC */
- PR_ExplodeTime(t1, PR_GMTParameters, &et);
- if (et.tm_params.tp_gmt_offset || et.tm_params.tp_dst_offset) {
- if (debug_mode) {
- printf("ERROR: UTC has nonzero gmt or dst offset.\n");
- }
- else {
- failed_already=1;
- }
- return 1;
- }
- if (debug_mode) {
- printf("Current UTC is ");
- }
- PrintExplodedTime(&et);
- if (debug_mode) {
- printf("\n");
- }
- t2 = PR_ImplodeTime(&et);
- if (LL_NE(t1, t2)) {
- if (debug_mode) {
- printf("ERROR: Explode and implode are NOT inverse.\n");
- }
- else {
- printf("FAIL\n");
- }
- return 1;
- }
- /* Next, try converting to local (US Pacific) time */
- PR_ExplodeTime(t1, PR_LocalTimeParameters, &et);
- if (debug_mode) {
- printf("Current local time is ");
- }
- PrintExplodedTime(&et);
- if (debug_mode) {
- printf("\n");
- }
- if (debug_mode) printf("GMT offset is %ld, DST offset is %ld\n",
- et.tm_params.tp_gmt_offset, et.tm_params.tp_dst_offset);
- t2 = PR_ImplodeTime(&et);
- if (LL_NE(t1, t2)) {
- if (debug_mode) {
- printf("ERROR: Explode and implode are NOT inverse.\n");
- }
- return 1;
- }
- if (debug_mode) {
- printf("Please examine the results\n");
- }
- testParseTimeString(t1);
- }
- /*
- *******************************************
- **
- ** Testing PR_NormalizeTime()
- **
- *******************************************
- */
- /* July 4, 2001 is Wednesday */
- {
- PRExplodedTime et;
- if (debug_mode) {
- printf("\n");
- printf("**********************************\n");
- printf("** **\n");
- printf("** Testing PR_NormalizeTime() **\n");
- printf("** **\n");
- printf("**********************************\n\n");
- }
- et.tm_year = 2001;
- et.tm_month = 7 - 1;
- et.tm_mday = 4;
- et.tm_hour = 0;
- et.tm_min = 0;
- et.tm_sec = 0;
- et.tm_usec = 0;
- et.tm_params = PR_GMTParameters(&et);
- PR_NormalizeTime(&et, PR_GMTParameters);
- if (debug_mode) {
- printf("July 4, 2001 is %s.\n", dayOfWeek[et.tm_wday]);
- }
- if (et.tm_wday == 3) {
- if (debug_mode) {
- printf("PASS\n");
- }
- } else {
- if (debug_mode) {
- printf("ERROR: It should be Wednesday\n");
- }
- else {
- failed_already=1;
- }
- return 1;
- }
- testParseTimeString(PR_ImplodeTime(&et));
- /* June 12, 1997 23:00 PST == June 13, 1997 00:00 PDT */
- et.tm_year = 1997;
- et.tm_month = 6 - 1;
- et.tm_mday = 12;
- et.tm_hour = 23;
- et.tm_min = 0;
- et.tm_sec = 0;
- et.tm_usec = 0;
- et.tm_params.tp_gmt_offset = -8 * 3600;
- et.tm_params.tp_dst_offset = 0;
- PR_NormalizeTime(&et, PR_USPacificTimeParameters);
- if (debug_mode) {
- printf("Thu Jun 12, 1997 23:00:00 PST is ");
- }
- PrintExplodedTime(&et);
- if (debug_mode) {
- printf(".\n");
- }
- if (et.tm_wday == 5) {
- if (debug_mode) {
- printf("PASS\n");
- }
- } else {
- if (debug_mode) {
- printf("ERROR: It should be Friday\n");
- }
- else {
- failed_already=1;
- }
- return 1;
- }
- testParseTimeString(PR_ImplodeTime(&et));
- /* Feb 14, 1997 00:00:00 PDT == Feb 13, 1997 23:00:00 PST */
- et.tm_year = 1997;
- et.tm_month = 2 - 1;
- et.tm_mday = 14;
- et.tm_hour = 0;
- et.tm_min = 0;
- et.tm_sec = 0;
- et.tm_usec = 0;
- et.tm_params.tp_gmt_offset = -8 * 3600;
- et.tm_params.tp_dst_offset = 3600;
- PR_NormalizeTime(&et, PR_USPacificTimeParameters);
- if (debug_mode) {
- printf("Fri Feb 14, 1997 00:00:00 PDT is ");
- }
- PrintExplodedTime(&et);
- if (debug_mode) {
- printf(".\n");
- }
- if (et.tm_wday == 4) {
- if (debug_mode) {
- printf("PASS\n");
- }
- } else {
- if (debug_mode) {
- printf("ERROR: It should be Thursday\n");
- }
- else {
- failed_already=1;
- }
- return 1;
- }
- testParseTimeString(PR_ImplodeTime(&et));
- /* What time is Nov. 7, 1996, 18:29:23 PDT? */
- et.tm_year = 1996;
- et.tm_month = 11 - 1;
- et.tm_mday = 7;
- et.tm_hour = 18;
- et.tm_min = 29;
- et.tm_sec = 23;
- et.tm_usec = 0;
- et.tm_params.tp_gmt_offset = -8 * 3600; /* PDT */
- et.tm_params.tp_dst_offset = 3600;
- PR_NormalizeTime(&et, PR_LocalTimeParameters);
- if (debug_mode) {
- printf("Nov 7 18:29:23 PDT 1996 is ");
- }
- PrintExplodedTime(&et);
- if (debug_mode) {
- printf(".\n");
- }
- testParseTimeString(PR_ImplodeTime(&et));
- /* What time is Oct. 7, 1995, 18:29:23 PST? */
- et.tm_year = 1995;
- et.tm_month = 10 - 1;
- et.tm_mday = 7;
- et.tm_hour = 18;
- et.tm_min = 29;
- et.tm_sec = 23;
- et.tm_params.tp_gmt_offset = -8 * 3600; /* PST */
- et.tm_params.tp_dst_offset = 0;
- PR_NormalizeTime(&et, PR_LocalTimeParameters);
- if (debug_mode) {
- printf("Oct 7 18:29:23 PST 1995 is ");
- }
- PrintExplodedTime(&et);
- if (debug_mode) {
- printf(".\n");
- }
- testParseTimeString(PR_ImplodeTime(&et));
- if (debug_mode) {
- printf("Please examine the results\n");
- }
- }
- /*
- **************************************************************
- **
- ** Testing range of years
- **
- **************************************************************
- */
- {
- PRExplodedTime et1, et2;
- PRTime ttt;
- PRTime secs;
- if (debug_mode) {
- printf("\n");
- printf("***************************************\n");
- printf("** **\n");
- printf("** Testing range of years **\n");
- printf("** **\n");
- printf("***************************************\n\n");
- }
- /* April 4, 1917 GMT */
- et1.tm_usec = 0;
- et1.tm_sec = 0;
- et1.tm_min = 0;
- et1.tm_hour = 0;
- et1.tm_mday = 4;
- et1.tm_month = 4 - 1;
- et1.tm_year = 1917;
- et1.tm_params = PR_GMTParameters(&et1);
- PR_NormalizeTime(&et1, PR_LocalTimeParameters);
- secs = PR_ImplodeTime(&et1);
- if (LL_GE_ZERO(secs)) {
- if (debug_mode) {
- printf("ERROR: April 4, 1917 GMT returns a nonnegative second count\n");
- }
- failed_already = 1;
- return 1;
- }
- PR_ExplodeTime(secs, PR_LocalTimeParameters, &et2);
- if (!ExplodedTimeIsEqual(&et1, &et2)) {
- if (debug_mode) {
- printf("ERROR: PR_ImplodeTime and PR_ExplodeTime are not inverse for April 4, 1917 GMT\n");
- }
- failed_already=1;
- return 1;
- }
- ttt = PR_ImplodeTime(&et1);
- testParseTimeString( ttt );
- if (debug_mode) {
- printf("Test passed for April 4, 1917\n");
- }
- /* July 4, 2050 */
- et1.tm_usec = 0;
- et1.tm_sec = 0;
- et1.tm_min = 0;
- et1.tm_hour = 0;
- et1.tm_mday = 4;
- et1.tm_month = 7 - 1;
- et1.tm_year = 2050;
- et1.tm_params = PR_GMTParameters(&et1);
- PR_NormalizeTime(&et1, PR_LocalTimeParameters);
- secs = PR_ImplodeTime(&et1);
- if (!LL_GE_ZERO(secs)) {
- if (debug_mode) {
- printf("ERROR: July 4, 2050 GMT returns a negative second count\n");
- }
- failed_already = 1;
- return 1;
- }
- PR_ExplodeTime(secs, PR_LocalTimeParameters, &et2);
- if (!ExplodedTimeIsEqual(&et1, &et2)) {
- if (debug_mode) {
- printf("ERROR: PR_ImplodeTime and PR_ExplodeTime are not inverse for July 4, 2050 GMT\n");
- }
- failed_already=1;
- return 1;
- }
- testParseTimeString(PR_ImplodeTime(&et1));
- if (debug_mode) {
- printf("Test passed for July 4, 2050\n");
- }
- }
- /*
- **************************************************************
- **
- ** Stress test
- *
- ** Go through four years, starting from
- ** 00:00:00 PST Jan. 1, 2005, incrementing
- ** every 10 minutes.
- **
- **************************************************************
- */
- {
- PRExplodedTime et, et1, et2;
- PRInt64 usecPer10Min;
- int day, hour, min;
- PRTime usecs;
- int dstInEffect = 0;
- if (debug_mode) {
- printf("\n");
- printf("*******************************************************\n");
- printf("** **\n");
- printf("** Stress test Pacific Time **\n");
- printf("** Starting from midnight Jan. 1, 2005 PST, **\n");
- printf("** going through four years in 10-minute increment **\n");
- printf("** **\n");
- printf("*******************************************************\n\n");
- }
- LL_I2L(usecPer10Min, 600000000L);
- /* 00:00:00 PST Jan. 1, 2005 */
- et.tm_usec = 0;
- et.tm_sec = 0;
- et.tm_min = 0;
- et.tm_hour = 0;
- et.tm_mday = 1;
- et.tm_month = 0;
- et.tm_year = 2005;
- et.tm_params.tp_gmt_offset = -8 * 3600;
- et.tm_params.tp_dst_offset = 0;
- usecs = PR_ImplodeTime(&et);
- for (day = 0; day < 4 * 365 + 1; day++) {
- for (hour = 0; hour < 24; hour++) {
- for (min = 0; min < 60; min += 10) {
- LL_ADD(usecs, usecs, usecPer10Min);
- PR_ExplodeTime(usecs, PR_USPacificTimeParameters, &et1);
- et2 = et;
- et2.tm_usec += 600000000L;
- PR_NormalizeTime(&et2, PR_USPacificTimeParameters);
- if (!ExplodedTimeIsEqual(&et1, &et2)) {
- printf("ERROR: componentwise comparison failed\n");
- PrintExplodedTime(&et1);
- printf("\n");
- PrintExplodedTime(&et2);
- printf("\n");
- failed_already=1;
- return 1;
- }
- if (LL_NE(usecs, PR_ImplodeTime(&et1))) {
- printf("ERROR: PR_ExplodeTime and PR_ImplodeTime are not inverse\n");
- PrintExplodedTime(&et1);
- printf("\n");
- failed_already=1;
- return 1;
- }
- testParseTimeString(usecs);
- if (!dstInEffect && et1.tm_params.tp_dst_offset) {
- dstInEffect = 1;
- if (debug_mode) {
- printf("DST changeover from ");
- PrintExplodedTime(&et);
- printf(" to ");
- PrintExplodedTime(&et1);
- printf(".\n");
- }
- } else if (dstInEffect && !et1.tm_params.tp_dst_offset) {
- dstInEffect = 0;
- if (debug_mode) {
- printf("DST changeover from ");
- PrintExplodedTime(&et);
- printf(" to ");
- PrintExplodedTime(&et1);
- printf(".\n");
- }
- }
- et = et1;
- }
- }
- }
- if (debug_mode) {
- printf("Test passed\n");
- }
- }
- /* Same stress test, but with PR_LocalTimeParameters */
- {
- PRExplodedTime et, et1, et2;
- PRInt64 usecPer10Min;
- int day, hour, min;
- PRTime usecs;
- int dstInEffect = 0;
- if (debug_mode) {
- printf("\n");
- printf("*******************************************************\n");
- printf("** **\n");
- printf("** Stress test Local Time **\n");
- printf("** Starting from midnight Jan. 1, 2005 PST, **\n");
- printf("** going through four years in 10-minute increment **\n");
- printf("** **\n");
- printf("*******************************************************\n\n");
- }
- LL_I2L(usecPer10Min, 600000000L);
- /* 00:00:00 PST Jan. 1, 2005 */
- et.tm_usec = 0;
- et.tm_sec = 0;
- et.tm_min = 0;
- et.tm_hour = 0;
- et.tm_mday = 1;
- et.tm_month = 0;
- et.tm_year = 2005;
- et.tm_params.tp_gmt_offset = -8 * 3600;
- et.tm_params.tp_dst_offset = 0;
- usecs = PR_ImplodeTime(&et);
- for (day = 0; day < 4 * 365 + 1; day++) {
- for (hour = 0; hour < 24; hour++) {
- for (min = 0; min < 60; min += 10) {
- LL_ADD(usecs, usecs, usecPer10Min);
- PR_ExplodeTime(usecs, PR_LocalTimeParameters, &et1);
- et2 = et;
- et2.tm_usec += 600000000L;
- PR_NormalizeTime(&et2, PR_LocalTimeParameters);
- if (!ExplodedTimeIsEqual(&et1, &et2)) {
- printf("ERROR: componentwise comparison failed\n");
- PrintExplodedTime(&et1);
- printf("\n");
- PrintExplodedTime(&et2);
- printf("\n");
- return 1;
- }
- if (LL_NE(usecs, PR_ImplodeTime(&et1))) {
- printf("ERROR: PR_ExplodeTime and PR_ImplodeTime are not inverse\n");
- PrintExplodedTime(&et1);
- printf("\n");
- failed_already=1;
- return 1;
- }
- testParseTimeString(usecs);
- if (!dstInEffect && et1.tm_params.tp_dst_offset) {
- dstInEffect = 1;
- if (debug_mode) {
- printf("DST changeover from ");
- PrintExplodedTime(&et);
- printf(" to ");
- PrintExplodedTime(&et1);
- printf(".\n");
- }
- } else if (dstInEffect && !et1.tm_params.tp_dst_offset) {
- dstInEffect = 0;
- if (debug_mode) {
- printf("DST changeover from ");
- PrintExplodedTime(&et);
- printf(" to ");
- PrintExplodedTime(&et1);
- printf(".\n");
- }
- }
- et = et1;
- }
- }
- }
- if (debug_mode) {
- printf("Test passed\n");
- }
- }
- /* Same stress test, but with PR_LocalTimeParameters and going backward */
- {
- PRExplodedTime et, et1, et2;
- PRInt64 usecPer10Min;
- int day, hour, min;
- PRTime usecs;
- int dstInEffect = 0;
- if (debug_mode) {
- printf("\n");
- printf("*******************************************************\n");
- printf("** **\n");
- printf("** Stress test Local Time **\n");
- printf("** Starting from midnight Jan. 1, 2009 PST, **\n");
- printf("** going back four years in 10-minute increment **\n");
- printf("** **\n");
- printf("*******************************************************\n\n");
- }
- LL_I2L(usecPer10Min, 600000000L);
- /* 00:00:00 PST Jan. 1, 2009 */
- et.tm_usec = 0;
- et.tm_sec = 0;
- et.tm_min = 0;
- et.tm_hour = 0;
- et.tm_mday = 1;
- et.tm_month = 0;
- et.tm_year = 2009;
- et.tm_params.tp_gmt_offset = -8 * 3600;
- et.tm_params.tp_dst_offset = 0;
- usecs = PR_ImplodeTime(&et);
- for (day = 0; day < 4 * 365 + 1; day++) {
- for (hour = 0; hour < 24; hour++) {
- for (min = 0; min < 60; min += 10) {
- LL_SUB(usecs, usecs, usecPer10Min);
- PR_ExplodeTime(usecs, PR_LocalTimeParameters, &et1);
- et2 = et;
- et2.tm_usec -= 600000000L;
- PR_NormalizeTime(&et2, PR_LocalTimeParameters);
- if (!ExplodedTimeIsEqual(&et1, &et2)) {
- printf("ERROR: componentwise comparison failed\n");
- PrintExplodedTime(&et1);
- printf("\n");
- PrintExplodedTime(&et2);
- printf("\n");
- return 1;
- }
- if (LL_NE(usecs, PR_ImplodeTime(&et1))) {
- printf("ERROR: PR_ExplodeTime and PR_ImplodeTime are not inverse\n");
- PrintExplodedTime(&et1);
- printf("\n");
- failed_already=1;
- return 1;
- }
- testParseTimeString(usecs);
- if (!dstInEffect && et1.tm_params.tp_dst_offset) {
- dstInEffect = 1;
- if (debug_mode) {
- printf("DST changeover from ");
- PrintExplodedTime(&et);
- printf(" to ");
- PrintExplodedTime(&et1);
- printf(".\n");
- }
- } else if (dstInEffect && !et1.tm_params.tp_dst_offset) {
- dstInEffect = 0;
- if (debug_mode) {
- printf("DST changeover from ");
- PrintExplodedTime(&et);
- printf(" to ");
- PrintExplodedTime(&et1);
- printf(".\n");
- }
- }
- et = et1;
- }
- }
- }
- }
- if (failed_already) {
- return 1;
- }
- else {
- return 0;
- }
- }
|