michael@0: /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ michael@0: /* This Source Code Form is subject to the terms of the Mozilla Public michael@0: * License, v. 2.0. If a copy of the MPL was not distributed with this michael@0: * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ michael@0: michael@0: /* michael@0: * file: y2k.c michael@0: * description: Test for y2k compliance for NSPR. michael@0: * michael@0: * Sep 1999. lth. Added "Sun" specified dates to the test data. michael@0: */ michael@0: /*********************************************************************** michael@0: ** Includes michael@0: ***********************************************************************/ michael@0: /* Used to get the command line option */ michael@0: #include "plgetopt.h" michael@0: michael@0: #include "prinit.h" michael@0: #include "prtime.h" michael@0: #include "prprf.h" michael@0: #include "prlog.h" michael@0: michael@0: #include michael@0: #include michael@0: #include michael@0: michael@0: #define PRINT_DETAILS michael@0: michael@0: int failed_already=0; michael@0: PRBool debug_mode = PR_FALSE; michael@0: michael@0: static char *dayOfWeek[] = michael@0: { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "???" }; michael@0: static char *month[] = michael@0: { "Jan", "Feb", "Mar", "Apr", "May", "Jun", michael@0: "Jul", "Aug", "Sep", "Oct", "Nov", "Dec", "???" }; michael@0: michael@0: PRLogModuleInfo *lm; michael@0: michael@0: static void PrintExplodedTime(const PRExplodedTime *et) { michael@0: PRInt32 totalOffset; michael@0: PRInt32 hourOffset, minOffset; michael@0: const char *sign; michael@0: michael@0: /* Print day of the week, month, day, hour, minute, and second */ michael@0: printf("%s %s %2ld %02ld:%02ld:%02ld ", michael@0: dayOfWeek[et->tm_wday], month[et->tm_month], et->tm_mday, michael@0: et->tm_hour, et->tm_min, et->tm_sec); michael@0: michael@0: /* Print year */ michael@0: printf("%hd ", et->tm_year); michael@0: michael@0: /* Print time zone */ michael@0: totalOffset = et->tm_params.tp_gmt_offset + et->tm_params.tp_dst_offset; michael@0: if (totalOffset == 0) { michael@0: printf("UTC "); michael@0: } else { michael@0: sign = "+"; michael@0: if (totalOffset < 0) { michael@0: totalOffset = -totalOffset; michael@0: sign = "-"; michael@0: } michael@0: hourOffset = totalOffset / 3600; michael@0: minOffset = (totalOffset % 3600) / 60; michael@0: printf("%s%02ld%02ld ", sign, hourOffset, minOffset); michael@0: } michael@0: #ifdef PRINT_DETAILS michael@0: printf("{%d, %d, %d, %d, %d, %d, %d, %d, %d, { %d, %d}}\n",et->tm_usec, michael@0: et->tm_sec, michael@0: et->tm_min, michael@0: et->tm_hour, michael@0: et->tm_mday, michael@0: et->tm_month, michael@0: et->tm_year, michael@0: et->tm_wday, michael@0: et->tm_yday, michael@0: et->tm_params.tp_gmt_offset, michael@0: et->tm_params.tp_dst_offset); michael@0: #endif michael@0: } michael@0: michael@0: static int ExplodedTimeIsEqual(const PRExplodedTime *et1, michael@0: const PRExplodedTime *et2) michael@0: { michael@0: if (et1->tm_usec == et2->tm_usec && michael@0: et1->tm_sec == et2->tm_sec && michael@0: et1->tm_min == et2->tm_min && michael@0: et1->tm_hour == et2->tm_hour && michael@0: et1->tm_mday == et2->tm_mday && michael@0: et1->tm_month == et2->tm_month && michael@0: et1->tm_year == et2->tm_year && michael@0: et1->tm_wday == et2->tm_wday && michael@0: et1->tm_yday == et2->tm_yday && michael@0: et1->tm_params.tp_gmt_offset == et2->tm_params.tp_gmt_offset && michael@0: et1->tm_params.tp_dst_offset == et2->tm_params.tp_dst_offset) { michael@0: return 1; michael@0: } else { michael@0: return 0; michael@0: } michael@0: } michael@0: michael@0: /* michael@0: * TEST 1: TestExplodeImplodeTime michael@0: * Description: michael@0: * For each given timestamp T (a PRTime value), call PR_ExplodeTime michael@0: * with GMT, US Pacific, and local time parameters. Compare the michael@0: * resulting calendar (exploded) time values with the expected michael@0: * values. michael@0: * michael@0: * Note: the expected local time values depend on the local time michael@0: * zone. The local time values stored in this test are for the US michael@0: * Pacific Time Zone. If you are running this test in a different michael@0: * time zone, you need to modify the values in the localt array. michael@0: * An example is provided below. michael@0: * michael@0: * Call PR_ImplodeTime for each of the exploded values and compare michael@0: * the resulting PRTime values with the original input. michael@0: * michael@0: * This test is run for the values of time T corresponding to the michael@0: * following dates: michael@0: * - 12/31/99 - before 2000 michael@0: * - 01/01/00 - after 2000 michael@0: * - Leap year - Feb 29, 2000 michael@0: * - March 1st, 2001 (after 1 year) michael@0: * - March 1st, 2005 (after second leap year) michael@0: * - 09/09/99 (used by some programs as an end of file marker) michael@0: * michael@0: * Call PR_Now, convert to calendar time using PR_ExplodeTime and michael@0: * manually check the result for correctness. The time should match michael@0: * the system clock. michael@0: * michael@0: * Tested functions: PR_Now, PR_ExplodeTime, PR_ImplodeTime, michael@0: * PR_LocalTimeParameters, PR_GMTParameters. michael@0: */ michael@0: michael@0: static PRTime prt[] = { michael@0: LL_INIT(220405, 2133125120), /* 946634400000000 */ michael@0: LL_INIT(220425, 2633779200), /* 946720800000000 */ michael@0: LL_INIT(221612, 2107598848), /* 951818400000000 */ michael@0: LL_INIT(228975, 663398400), /* 983440800000000 */ michael@0: LL_INIT(258365, 1974568960), /* 1109671200000000 */ michael@0: LL_INIT(218132, 1393788928), /* 936871200000000 */ michael@0: /* Sun's dates follow */ michael@0: LL_INIT( 213062, 4077979648 ), /* Dec 31 1998 10:00:00 */ michael@0: LL_INIT( 218152, 1894443008 ), /* Sep 10 1999 10:00:00 */ michael@0: LL_INIT( 221592, 1606944768 ), /* Feb 28 2000 10:00:00 */ michael@0: LL_INIT( 227768, 688924672 ), /* Dec 31 2000 10:00:00 */ michael@0: LL_INIT( 227788, 1189578752 ), /* Jan 1 2001 10:00:00 */ michael@0: }; michael@0: michael@0: static PRExplodedTime gmt[] = { michael@0: { 0, 0, 0, 10, 31, 11, 1999, 5, 364, {0, 0}}, /* 1999/12/31 10:00:00 GMT */ michael@0: { 0, 0, 0, 10, 1, 0, 2000, 6, 0, {0, 0}}, /* 2000/01/01 10:00:00 GMT */ michael@0: { 0, 0, 0, 10, 29, 1, 2000, 2, 59, {0, 0}}, /* 2000/02/29 10:00:00 GMT */ michael@0: { 0, 0, 0, 10, 1, 2, 2001, 4, 59, {0, 0}}, /* 2001/3/1 10:00:00 GMT */ michael@0: { 0, 0, 0, 10, 1, 2, 2005, 2, 59, {0, 0}}, /* 2005/3/1 10:00:00 GMT */ michael@0: { 0, 0, 0, 10, 9, 8, 1999, 4, 251, {0, 0}}, /* 1999/9/9 10:00:00 GMT */ michael@0: /* Sun's dates follow */ michael@0: { 0, 0, 0, 10, 31, 11, 1998, 4, 364, {0, 0}}, /* 12/31/1998 10:00:00 GMT */ michael@0: { 0, 0, 0, 10, 10, 8, 1999, 5, 252, {0, 0}}, /* 9/10/1999 10:00:00 GMT */ michael@0: { 0, 0, 0, 10, 28, 1, 2000, 1, 58, {0, 0}}, /* 2/28/2000 10:00:00 GMT */ michael@0: { 0, 0, 0, 10, 31, 11, 2000, 0, 365, {0, 0}}, /* 12/31/2000 10:00:00 GMT */ michael@0: { 0, 0, 0, 10, 1, 0, 2001, 1, 0, {0, 0}} /* 1/1/2001 10:00:00 GMT */ michael@0: }; michael@0: michael@0: static PRExplodedTime uspt[] = { michael@0: { 0, 0, 0, 2, 31, 11, 1999, 5, 364, {-28800, 0}}, /* 1999/12/31 2:00:00 PST */ michael@0: { 0, 0, 0, 2, 1, 0, 2000, 6, 0, {-28800, 0}}, /* 2000/01/01 2:00:00 PST */ michael@0: { 0, 0, 0, 2, 29, 1, 2000, 2, 59, {-28800, 0}}, /* 2000/02/29 2:00:00 PST */ michael@0: { 0, 0, 0, 2, 1, 2, 2001, 4, 59, {-28800, 0}}, /* 2001/3/1 2:00:00 PST */ michael@0: { 0, 0, 0, 2, 1, 2, 2005, 2, 59, {-28800, 0}}, /* 2005/3/1 2:00:00 PST */ michael@0: { 0, 0, 0, 3, 9, 8, 1999, 4, 251, {-28800, 3600}}, /* 1999/9/9 3:00:00 PDT */ michael@0: /* Sun's dates follow */ michael@0: { 0, 0, 0, 2, 31, 11, 1998, 4, 364, {-28800, 0}}, /* 12/31/1998 00:00:00 GMT */ michael@0: { 0, 0, 0, 3, 10, 8, 1999, 5, 252, {-28800, 3600}}, /* 9/10/1999 00:00:00 GMT */ michael@0: { 0, 0, 0, 2, 28, 1, 2000, 1, 58, {-28800, 0}}, /* 2/28/2000 00:00:00 GMT */ michael@0: { 0, 0, 0, 2, 31, 11, 2000, 0, 365, {-28800, 0}}, /* 12/31/2000 00:00:00 GMT */ michael@0: { 0, 0, 0, 2, 1, 0, 2001, 1, 0, {-28800, 0}} /* 1/1/2001 00:00:00 GMT */ michael@0: }; michael@0: michael@0: /* michael@0: * This test assumes that we are in US Pacific Time Zone. michael@0: * If you are running this test in a different time zone, michael@0: * you need to modify the localt array and fill in the michael@0: * expected results. The localt array for US Eastern Time michael@0: * Zone is provided as an example. michael@0: */ michael@0: static PRExplodedTime localt[] = { michael@0: { 0, 0, 0, 2, 31, 11, 1999, 5, 364, {-28800, 0}}, /* 1999/12/31 2:00:00 PST */ michael@0: { 0, 0, 0, 2, 1, 0, 2000, 6, 0, {-28800, 0}}, /* 2000/01/01 2:00:00 PST */ michael@0: { 0, 0, 0, 2, 29, 1, 2000, 2, 59, {-28800, 0}}, /* 2000/02/29 2:00:00 PST */ michael@0: { 0, 0, 0, 2, 1, 2, 2001, 4, 59, {-28800, 0}}, /* 2001/3/1 2:00:00 PST */ michael@0: { 0, 0, 0, 2, 1, 2, 2005, 2, 59, {-28800, 0}}, /* 2005/3/1 2:00:00 PST */ michael@0: { 0, 0, 0, 3, 9, 8, 1999, 4, 251, {-28800, 3600}}, /* 1999/9/9 3:00:00 PDT */ michael@0: /* Sun's dates follow */ michael@0: { 0, 0, 0, 2, 31, 11, 1998, 4, 364, {-28800, 0}}, /* 12/31/1998 00:00:00 GMT */ michael@0: { 0, 0, 0, 3, 10, 8, 1999, 5, 252, {-28800, 3600}}, /* 9/10/1999 00:00:00 GMT */ michael@0: { 0, 0, 0, 2, 28, 1, 2000, 1, 58, {-28800, 0}}, /* 2/28/2000 00:00:00 GMT */ michael@0: { 0, 0, 0, 2, 31, 11, 2000, 0, 365, {-28800, 0}}, /* 12/31/2000 00:00:00 GMT */ michael@0: { 0, 0, 0, 2, 1, 0, 2001, 1, 0, {-28800, 0}} /* 1/1/2001 00:00:00 GMT */ michael@0: }; michael@0: michael@0: #ifdef US_EASTERN_TIME michael@0: static PRExplodedTime localt[] = { michael@0: { 0, 0, 0, 5, 31, 11, 1999, 5, 364, {-18000, 0}}, /* 1999/12/31 2:00:00 EST */ michael@0: { 0, 0, 0, 5, 1, 0, 2000, 6, 0, {-18000, 0}}, /* 2000/01/01 2:00:00 EST */ michael@0: { 0, 0, 0, 5, 29, 1, 2000, 2, 59, {-18000, 0}}, /* 2000/02/29 2:00:00 EST */ michael@0: { 0, 0, 0, 5, 1, 2, 2001, 4, 59, {-18000, 0}}, /* 2001/3/1 2:00:00 EST */ michael@0: { 0, 0, 0, 5, 1, 2, 2005, 2, 59, {-18000, 0}}, /* 2005/3/1 2:00:00 EST */ michael@0: { 0, 0, 0, 6, 9, 8, 1999, 4, 251, {-18000, 3600}}, /* 1999/9/9 3:00:00 EDT */ michael@0: /* Sun's dates follow */ michael@0: { 0, 0, 0, 5, 31, 11, 1998, 4, 364, {-18000 0}}, /* 12/31/1998 00:00:00 GMT */ michael@0: { 0, 0, 0, 6, 10, 8, 1999, 5, 252, {-18000 3600}}, /* 9/10/1999 00:00:00 GMT */ michael@0: { 0, 0, 0, 5, 28, 1, 2000, 1, 58, {-18000 0}}, /* 2/28/2000 00:00:00 GMT */ michael@0: { 0, 0, 0, 5, 31, 11, 2000, 0, 365, {-18000 0}}, /* 12/31/2000 00:00:00 GMT */ michael@0: { 0, 0, 0, 5, 1, 0, 2001, 1, 0, {-18000 0}} /* 1/1/2001 00:00:00 GMT */ michael@0: }; michael@0: #endif michael@0: michael@0: static PRStatus TestExplodeImplodeTime(void) michael@0: { michael@0: PRTime prt_tmp; michael@0: PRTime now; michael@0: int idx; michael@0: int array_size = sizeof(prt) / sizeof(PRTime); michael@0: PRExplodedTime et_tmp; michael@0: char buf[1024]; michael@0: michael@0: for (idx = 0; idx < array_size; idx++) { michael@0: PR_snprintf(buf, sizeof(buf), "%lld", prt[idx]); michael@0: if (debug_mode) printf("Time stamp %s\n", buf); michael@0: PR_ExplodeTime(prt[idx], PR_GMTParameters, &et_tmp); michael@0: if (!ExplodedTimeIsEqual(&et_tmp, &gmt[idx])) { michael@0: fprintf(stderr, "GMT not equal\n"); michael@0: PrintExplodedTime(&et_tmp); michael@0: PrintExplodedTime(&gmt[idx]); michael@0: exit(1); michael@0: } michael@0: prt_tmp = PR_ImplodeTime(&et_tmp); michael@0: if (LL_NE(prt_tmp, prt[idx])) { michael@0: fprintf(stderr, "PRTime not equal\n"); michael@0: exit(1); michael@0: } michael@0: if (debug_mode) { michael@0: printf("GMT: "); michael@0: PrintExplodedTime(&et_tmp); michael@0: printf("\n"); michael@0: } michael@0: michael@0: PR_ExplodeTime(prt[idx], PR_USPacificTimeParameters, &et_tmp); michael@0: if (!ExplodedTimeIsEqual(&et_tmp, &uspt[idx])) { michael@0: fprintf(stderr, "US Pacific Time not equal\n"); michael@0: PrintExplodedTime(&et_tmp); michael@0: PrintExplodedTime(&uspt[idx]); michael@0: exit(1); michael@0: } michael@0: prt_tmp = PR_ImplodeTime(&et_tmp); michael@0: if (LL_NE(prt_tmp, prt[idx])) { michael@0: fprintf(stderr, "PRTime not equal\n"); michael@0: exit(1); michael@0: } michael@0: if (debug_mode) { michael@0: printf("US Pacific Time: "); michael@0: PrintExplodedTime(&et_tmp); michael@0: printf("\n"); michael@0: } michael@0: michael@0: PR_ExplodeTime(prt[idx], PR_LocalTimeParameters, &et_tmp); michael@0: if (!ExplodedTimeIsEqual(&et_tmp, &localt[idx])) { michael@0: fprintf(stderr, "not equal\n"); michael@0: PrintExplodedTime(&et_tmp); michael@0: PrintExplodedTime(&localt[idx]); michael@0: exit(1); michael@0: } michael@0: prt_tmp = PR_ImplodeTime(&et_tmp); michael@0: if (LL_NE(prt_tmp, prt[idx])) { michael@0: fprintf(stderr, "not equal\n"); michael@0: exit(1); michael@0: } michael@0: if (debug_mode) { michael@0: printf("Local time:"); michael@0: PrintExplodedTime(&et_tmp); michael@0: printf("\n\n"); michael@0: } michael@0: } michael@0: michael@0: now = PR_Now(); michael@0: PR_ExplodeTime(now, PR_GMTParameters, &et_tmp); michael@0: printf("Current GMT is "); michael@0: PrintExplodedTime(&et_tmp); michael@0: printf("\n"); michael@0: prt_tmp = PR_ImplodeTime(&et_tmp); michael@0: if (LL_NE(prt_tmp, now)) { michael@0: fprintf(stderr, "not equal\n"); michael@0: exit(1); michael@0: } michael@0: PR_ExplodeTime(now, PR_USPacificTimeParameters, &et_tmp); michael@0: printf("Current US Pacific Time is "); michael@0: PrintExplodedTime(&et_tmp); michael@0: printf("\n"); michael@0: prt_tmp = PR_ImplodeTime(&et_tmp); michael@0: if (LL_NE(prt_tmp, now)) { michael@0: fprintf(stderr, "not equal\n"); michael@0: exit(1); michael@0: } michael@0: PR_ExplodeTime(now, PR_LocalTimeParameters, &et_tmp); michael@0: printf("Current local time is "); michael@0: PrintExplodedTime(&et_tmp); michael@0: printf("\n"); michael@0: prt_tmp = PR_ImplodeTime(&et_tmp); michael@0: if (LL_NE(prt_tmp, now)) { michael@0: fprintf(stderr, "not equal\n"); michael@0: exit(1); michael@0: } michael@0: printf("Please verify the results\n\n"); michael@0: michael@0: if (debug_mode) printf("Test 1 passed\n"); michael@0: return PR_SUCCESS; michael@0: } michael@0: /* End of Test 1: TestExplodeImplodeTime */ michael@0: michael@0: /* michael@0: * Test 2: Normalize Time michael@0: */ michael@0: michael@0: /* michael@0: * time increment for addition to PRExplodeTime michael@0: */ michael@0: typedef struct time_increment { michael@0: PRInt32 ti_usec; michael@0: PRInt32 ti_sec; michael@0: PRInt32 ti_min; michael@0: PRInt32 ti_hour; michael@0: } time_increment_t; michael@0: michael@0: /* michael@0: * Data for testing PR_Normalize michael@0: * Add the increment to base_time, normalize it to GMT and US Pacific michael@0: * Time zone. michael@0: */ michael@0: typedef struct normalize_test_data { michael@0: PRExplodedTime base_time; michael@0: time_increment_t increment; michael@0: PRExplodedTime expected_gmt_time; michael@0: PRExplodedTime expected_uspt_time; michael@0: } normalize_test_data_t; michael@0: michael@0: michael@0: /* michael@0: * Test data - the base time values cover dates of interest including y2k - 1, michael@0: * y2k + 1, y2k leap year, y2k leap date + 1year, michael@0: * y2k leap date + 4 years michael@0: */ michael@0: normalize_test_data_t normalize_test_array[] = { michael@0: /*usec sec min hour mday mo year wday yday {gmtoff, dstoff }*/ michael@0: michael@0: /* Fri 12/31/1999 19:32:48 PST */ michael@0: {{0, 48, 32, 19, 31, 11, 1999, 5, 364, { -28800, 0}}, michael@0: {0, 0, 30, 20}, michael@0: {0, 48, 2, 0, 2, 0, 2000, 0, 1, { 0, 0}}, /*Sun Jan 2 00:02:48 UTC 2000*/ michael@0: {0, 48, 2, 16, 1, 0, 2000, 6, 0, { -28800, 0}},/* Sat Jan 1 16:02:48 michael@0: PST 2000*/ michael@0: }, michael@0: /* Fri 99-12-31 23:59:02 GMT */ michael@0: {{0, 2, 59, 23, 31, 11, 1999, 5, 364, { 0, 0}}, michael@0: {0, 0, 45, 0}, michael@0: {0, 2, 44, 0, 1, 0, 2000, 6, 0, { 0, 0}},/* Sat Jan 1 00:44:02 UTC 2000*/ michael@0: {0, 2, 44, 16, 31, 11, 1999, 5, 364, { -28800, 0}}/*Fri Dec 31 16:44:02 michael@0: PST 1999*/ michael@0: }, michael@0: /* 99-12-25 12:00:00 GMT */ michael@0: {{0, 0, 0, 12, 25, 11, 1999, 6, 358, { 0, 0}}, michael@0: {0, 0, 0, 364 * 24}, michael@0: {0, 0, 0, 12, 23, 11, 2000, 6, 357, { 0, 0}},/*Sat Dec 23 12:00:00 michael@0: 2000 UTC*/ michael@0: {0, 0, 0, 4, 23, 11, 2000, 6, 357, { -28800, 0}}/*Sat Dec 23 04:00:00 michael@0: 2000 -0800*/ michael@0: }, michael@0: /* 00-01-1 00:00:00 PST */ michael@0: {{0, 0, 0, 0, 1, 0, 2000, 6, 0, { -28800, 0}}, michael@0: {0, 0, 0, 48}, michael@0: {0, 0, 0, 8, 3, 0, 2000, 1, 2, { 0, 0}},/*Mon Jan 3 08:00:00 2000 UTC*/ michael@0: {0, 0, 0, 0, 3, 0, 2000, 1, 2, { -28800, 0}}/*Mon Jan 3 00:00:00 2000 michael@0: -0800*/ michael@0: }, michael@0: /* 00-01-10 12:00:00 PST */ michael@0: {{0, 0, 0, 12, 10, 0, 2000, 1, 9, { -28800, 0}}, michael@0: {0, 0, 0, 364 * 5 * 24}, michael@0: {0, 0, 0, 20, 3, 0, 2005, 1, 2, { 0, 0}},/*Mon Jan 3 20:00:00 2005 UTC */ michael@0: {0, 0, 0, 12, 3, 0, 2005, 1, 2, { -28800, 0}}/*Mon Jan 3 12:00:00 michael@0: 2005 -0800*/ michael@0: }, michael@0: /* 00-02-28 15:39 GMT */ michael@0: {{0, 0, 39, 15, 28, 1, 2000, 1, 58, { 0, 0}}, michael@0: {0, 0, 0, 24}, michael@0: {0, 0, 39, 15, 29, 1, 2000, 2, 59, { 0, 0}}, /*Tue Feb 29 15:39:00 2000 michael@0: UTC*/ michael@0: {0, 0, 39, 7, 29, 1, 2000, 2, 59, { -28800, 0}}/*Tue Feb 29 07:39:00 michael@0: 2000 -0800*/ michael@0: }, michael@0: /* 01-03-01 12:00 PST */ michael@0: {{0, 0, 0, 12, 3, 0, 2001, 3, 2, { -28800, 0}},/*Wed Jan 3 12:00:00 michael@0: -0800 2001*/ michael@0: {0, 30, 30,45}, michael@0: {0, 30, 30, 17, 5, 0, 2001, 5, 4, { 0, 0}}, /*Fri Jan 5 17:30:30 2001 michael@0: UTC*/ michael@0: {0, 30, 30, 9, 5, 0, 2001, 5, 4, { -28800, 0}} /*Fri Jan 5 09:30:30 michael@0: 2001 -0800*/ michael@0: }, michael@0: /* 2004-04-26 12:00 GMT */ michael@0: {{0, 0, 0, 20, 3, 0, 2001, 3, 2, { 0, 0}}, michael@0: {0, 0, 30,0}, michael@0: {0, 0, 30, 20, 3, 0, 2001, 3, 2, { 0, 0}},/*Wed Jan 3 20:30:00 2001 UTC*/ michael@0: {0, 0, 30, 12, 3, 0, 2001, 3, 2, { -28800, 0}}/*Wed Jan 3 12:30:00 michael@0: 2001 -0800*/ michael@0: }, michael@0: /* 99-09-09 00:00 GMT */ michael@0: {{0, 0, 0, 0, 9, 8, 1999, 4, 251, { 0, 0}}, michael@0: {0, 0, 0, 12}, michael@0: {0, 0, 0, 12, 9, 8, 1999, 4, 251, { 0, 0}},/*Thu Sep 9 12:00:00 1999 UTC*/ michael@0: {0, 0, 0, 5, 9, 8, 1999, 4, 251, { -28800, 3600}}/*Thu Sep 9 05:00:00 michael@0: 1999 -0700*/ michael@0: } michael@0: }; michael@0: michael@0: void add_time_increment(PRExplodedTime *et1, time_increment_t *it) michael@0: { michael@0: et1->tm_usec += it->ti_usec; michael@0: et1->tm_sec += it->ti_sec; michael@0: et1->tm_min += it->ti_min; michael@0: et1->tm_hour += it->ti_hour; michael@0: } michael@0: michael@0: /* michael@0: ** TestNormalizeTime() -- Test PR_NormalizeTime() michael@0: ** For each data item, add the time increment to the base_time and then michael@0: ** normalize it for GMT and local time zones. This test assumes that michael@0: ** the local time zone is the Pacific Time Zone. The normalized values michael@0: ** should match the expected values in the data item. michael@0: ** michael@0: */ michael@0: PRStatus TestNormalizeTime(void) michael@0: { michael@0: int idx, count; michael@0: normalize_test_data_t *itemp; michael@0: time_increment_t *itp; michael@0: michael@0: count = sizeof(normalize_test_array)/sizeof(normalize_test_array[0]); michael@0: for (idx = 0; idx < count; idx++) { michael@0: itemp = &normalize_test_array[idx]; michael@0: if (debug_mode) { michael@0: printf("%2d. %15s",idx +1,"Base time: "); michael@0: PrintExplodedTime(&itemp->base_time); michael@0: printf("\n"); michael@0: } michael@0: itp = &itemp->increment; michael@0: if (debug_mode) { michael@0: printf("%20s %2d hrs %2d min %3d sec\n","Add",itp->ti_hour, michael@0: itp->ti_min, itp->ti_sec); michael@0: } michael@0: add_time_increment(&itemp->base_time, &itemp->increment); michael@0: PR_NormalizeTime(&itemp->base_time, PR_LocalTimeParameters); michael@0: if (debug_mode) { michael@0: printf("%19s","PST time: "); michael@0: PrintExplodedTime(&itemp->base_time); michael@0: printf("\n"); michael@0: } michael@0: if (!ExplodedTimeIsEqual(&itemp->base_time, michael@0: &itemp->expected_uspt_time)) { michael@0: printf("PR_NormalizeTime failed\n"); michael@0: if (debug_mode) michael@0: PrintExplodedTime(&itemp->expected_uspt_time); michael@0: return PR_FAILURE; michael@0: } michael@0: PR_NormalizeTime(&itemp->base_time, PR_GMTParameters); michael@0: if (debug_mode) { michael@0: printf("%19s","GMT time: "); michael@0: PrintExplodedTime(&itemp->base_time); michael@0: printf("\n"); michael@0: } michael@0: michael@0: if (!ExplodedTimeIsEqual(&itemp->base_time, michael@0: &itemp->expected_gmt_time)) { michael@0: printf("PR_NormalizeTime failed\n"); michael@0: return PR_FAILURE; michael@0: } michael@0: } michael@0: return PR_SUCCESS; michael@0: } michael@0: michael@0: michael@0: /* michael@0: ** ParseTest. Structure defining a string time and a matching exploded time michael@0: ** michael@0: */ michael@0: typedef struct ParseTest michael@0: { michael@0: char *sDate; /* string to be converted using PR_ParseTimeString() */ michael@0: PRExplodedTime et; /* expected result of the conversion */ michael@0: } ParseTest; michael@0: michael@0: static ParseTest parseArray[] = michael@0: { michael@0: /* |<----- expected result ------------------------------------------->| */ michael@0: /* "string to test" usec sec min hour day mo year wday julian {gmtoff, dstoff }*/ michael@0: { "Thursday 1 Jan 1970 00:00:00", { 000000, 00, 00, 00, 1, 0, 1970, 4, 0, {-28800, 0 }}}, michael@0: { "1 Jan 1970 00:00:00", { 000000, 00, 00, 00, 1, 0, 1970, 4, 0, {-28800, 0 }}}, michael@0: { "1-Jan-1970 00:00:00", { 000000, 00, 00, 00, 1, 0, 1970, 4, 0, {-28800, 0 }}}, michael@0: { "01-Jan-1970 00:00:00", { 000000, 00, 00, 00, 1, 0, 1970, 4, 0, {-28800, 0 }}}, michael@0: { "January 1, 1970", { 000000, 00, 00, 00, 1, 0, 1970, 4, 0, {-28800, 0 }}}, michael@0: { "January 1, 1970 00:00", { 000000, 00, 00, 00, 1, 0, 1970, 4, 0, {-28800, 0 }}}, michael@0: { "January 01, 1970 00:00", { 000000, 00, 00, 00, 1, 0, 1970, 4, 0, {-28800, 0 }}}, michael@0: { "January 01 1970 00:00", { 000000, 00, 00, 00, 1, 0, 1970, 4, 0, {-28800, 0 }}}, michael@0: { "January 01 1970 00:00:00", { 000000, 00, 00, 00, 1, 0, 1970, 4, 0, {-28800, 0 }}}, michael@0: { "01-01-1970", { 000000, 00, 00, 00, 1, 0, 1970, 4, 0, {-28800, 0 }}}, michael@0: { "01/01/1970", { 000000, 00, 00, 00, 1, 0, 1970, 4, 0, {-28800, 0 }}}, michael@0: { "01/01/70", { 000000, 00, 00, 00, 1, 0, 1970, 4, 0, {-28800, 0 }}}, michael@0: { "01/01/70 00:00:00", { 000000, 00, 00, 00, 1, 0, 1970, 4, 0, {-28800, 0 }}}, michael@0: { "70/01/01 00:00:00", { 000000, 00, 00, 00, 1, 0, 1970, 4, 0, {-28800, 0 }}}, michael@0: { "70/1/1 00:00:", { 000000, 00, 00, 00, 1, 0, 1970, 4, 0, {-28800, 0 }}}, michael@0: { "00:00 Thursday, January 1, 1970",{ 000000, 00, 00, 00, 1, 0, 1970, 4, 0, {-28800, 0 }}}, michael@0: { "1-Jan-70 00:00:00", { 000000, 00, 00, 00, 1, 0, 1970, 4, 0, {-28800, 0 }}}, michael@0: { "70-01-01 00:00:00", { 000000, 00, 00, 00, 1, 0, 1970, 4, 0, {-28800, 0 }}}, michael@0: { "70/01/01 00:00:00", { 000000, 00, 00, 00, 1, 0, 1970, 4, 0, {-28800, 0 }}}, michael@0: michael@0: /* 31-Dec-1969 */ michael@0: { "Wed 31 Dec 1969 00:00:00", { 000000, 00, 00, 00, 31, 11, 1969, 3, 364, {-28800, 0 }}}, michael@0: { "31 Dec 1969 00:00:00", { 000000, 00, 00, 00, 31, 11, 1969, 3, 364, {-28800, 0 }}}, michael@0: { "12/31/69 00:00:00", { 000000, 00, 00, 00, 31, 11, 2069, 2, 364, {-28800, 0 }}}, michael@0: { "12/31/1969 00:00:00", { 000000, 00, 00, 00, 31, 11, 1969, 3, 364, {-28800, 0 }}}, michael@0: { "12-31-69 00:00:00", { 000000, 00, 00, 00, 31, 11, 2069, 2, 364, {-28800, 0 }}}, michael@0: { "12-31-1969 00:00:00", { 000000, 00, 00, 00, 31, 11, 1969, 3, 364, {-28800, 0 }}}, michael@0: { "69-12-31 00:00:00", { 000000, 00, 00, 00, 31, 11, 2069, 2, 364, {-28800, 0 }}}, michael@0: { "69/12/31 00:00:00", { 000000, 00, 00, 00, 31, 11, 2069, 2, 364, {-28800, 0 }}}, michael@0: michael@0: /* "Sun". 31-Dec-1998 (?) */ michael@0: { "Thu 31 Dec 1998 00:00:00", { 00000, 00, 00, 00, 31, 11, 1998, 4, 364, {-28800, 0 }}}, michael@0: { "12/31/98 00:00:00", { 00000, 00, 00, 00, 31, 11, 1998, 4, 364, {-28800, 0 }}}, michael@0: { "12/31/1998 00:00:00", { 00000, 00, 00, 00, 31, 11, 1998, 4, 364, {-28800, 0 }}}, michael@0: { "12-31-98 00:00:00", { 00000, 00, 00, 00, 31, 11, 1998, 4, 364, {-28800, 0 }}}, michael@0: { "12-31-1998 00:00:00", { 00000, 00, 00, 00, 31, 11, 1998, 4, 364, {-28800, 0 }}}, michael@0: { "98-12-31 00:00:00", { 00000, 00, 00, 00, 31, 11, 1998, 4, 364, {-28800, 0 }}}, michael@0: { "98/12/31 00:00:00", { 00000, 00, 00, 00, 31, 11, 1998, 4, 364, {-28800, 0 }}}, michael@0: michael@0: /* 09-Sep-1999. Interesting because of its use as an eof marker? */ michael@0: { "09 Sep 1999 00:00:00", { 000000, 00, 00, 00, 9, 8, 1999, 4, 251, {-28800, 3600 }}}, michael@0: { "9/9/99 00:00:00", { 000000, 00, 00, 00, 9, 8, 1999, 4, 251, {-28800, 3600 }}}, michael@0: { "9/9/1999 00:00:00", { 000000, 00, 00, 00, 9, 8, 1999, 4, 251, {-28800, 3600 }}}, michael@0: { "9-9-99 00:00:00", { 000000, 00, 00, 00, 9, 8, 1999, 4, 251, {-28800, 3600 }}}, michael@0: { "9-9-1999 00:00:00", { 000000, 00, 00, 00, 9, 8, 1999, 4, 251, {-28800, 3600 }}}, michael@0: { "09-09-99 00:00:00", { 000000, 00, 00, 00, 9, 8, 1999, 4, 251, {-28800, 3600 }}}, michael@0: { "09-09-1999 00:00:00", { 000000, 00, 00, 00, 9, 8, 1999, 4, 251, {-28800, 3600 }}}, michael@0: { "99-09-09 00:00:00", { 000000, 00, 00, 00, 9, 8, 1999, 4, 251, {-28800, 3600 }}}, michael@0: michael@0: /* "Sun". 10-Sep-1999. Because Sun said so. */ michael@0: { "10 Sep 1999 00:00:00", { 000000, 00, 00, 00, 10, 8, 1999, 5, 252, {-28800, 3600 }}}, michael@0: { "9/10/99 00:00:00", { 000000, 00, 00, 00, 10, 8, 1999, 5, 252, {-28800, 3600 }}}, michael@0: { "9/10/1999 00:00:00", { 000000, 00, 00, 00, 10, 8, 1999, 5, 252, {-28800, 3600 }}}, michael@0: { "9-10-99 00:00:00", { 000000, 00, 00, 00, 10, 8, 1999, 5, 252, {-28800, 3600 }}}, michael@0: { "9-10-1999 00:00:00", { 000000, 00, 00, 00, 10, 8, 1999, 5, 252, {-28800, 3600 }}}, michael@0: { "09-10-99 00:00:00", { 000000, 00, 00, 00, 10, 8, 1999, 5, 252, {-28800, 3600 }}}, michael@0: { "09-10-1999 00:00:00", { 000000, 00, 00, 00, 10, 8, 1999, 5, 252, {-28800, 3600 }}}, michael@0: { "99-09-10 00:00:00", { 000000, 00, 00, 00, 10, 8, 1999, 5, 252, {-28800, 3600 }}}, michael@0: michael@0: /* 31-Dec-1999 */ michael@0: { "31 Dec 1999 00:00:00", { 000000, 00, 00, 00, 31, 11, 1999, 5, 364, {-28800, 0 }}}, michael@0: { "12/31/99 00:00:00", { 000000, 00, 00, 00, 31, 11, 1999, 5, 364, {-28800, 0 }}}, michael@0: { "12/31/1999 00:00:00", { 000000, 00, 00, 00, 31, 11, 1999, 5, 364, {-28800, 0 }}}, michael@0: { "12-31-99 00:00:00", { 000000, 00, 00, 00, 31, 11, 1999, 5, 364, {-28800, 0 }}}, michael@0: { "12-31-1999 00:00:00", { 000000, 00, 00, 00, 31, 11, 1999, 5, 364, {-28800, 0 }}}, michael@0: { "99-12-31 00:00:00", { 000000, 00, 00, 00, 31, 11, 1999, 5, 364, {-28800, 0 }}}, michael@0: { "99/12/31 00:00:00", { 000000, 00, 00, 00, 31, 11, 1999, 5, 364, {-28800, 0 }}}, michael@0: michael@0: /* 01-Jan-2000 */ michael@0: { "01 Jan 2000 00:00:00", { 000000, 00, 00, 00, 1, 0, 2000, 6, 0, {-28800, 0 }}}, michael@0: { "1/1/00 00:00:00", { 000000, 00, 00, 00, 1, 0, 2000, 6, 0, {-28800, 0 }}}, michael@0: { "1/1/2000 00:00:00", { 000000, 00, 00, 00, 1, 0, 2000, 6, 0, {-28800, 0 }}}, michael@0: { "1-1-00 00:00:00", { 000000, 00, 00, 00, 1, 0, 2000, 6, 0, {-28800, 0 }}}, michael@0: { "1-1-2000 00:00:00", { 000000, 00, 00, 00, 1, 0, 2000, 6, 0, {-28800, 0 }}}, michael@0: { "01-01-00 00:00:00", { 000000, 00, 00, 00, 1, 0, 2000, 6, 0, {-28800, 0 }}}, michael@0: { "Saturday 01-01-2000 00:00:00", { 000000, 00, 00, 00, 1, 0, 2000, 6, 0, {-28800, 0 }}}, michael@0: michael@0: /* "Sun". 28-Feb-2000 */ michael@0: { "28 Feb 2000 00:00:00", { 000000, 00, 00, 00, 28, 1, 2000, 1, 58, {-28800, 0 }}}, michael@0: { "2/28/00 00:00:00", { 000000, 00, 00, 00, 28, 1, 2000, 1, 58, {-28800, 0 }}}, michael@0: { "2/28/2000 00:00:00", { 000000, 00, 00, 00, 28, 1, 2000, 1, 58, {-28800, 0 }}}, michael@0: { "2-28-00 00:00:00", { 000000, 00, 00, 00, 28, 1, 2000, 1, 58, {-28800, 0 }}}, michael@0: { "2-28-2000 00:00:00", { 000000, 00, 00, 00, 28, 1, 2000, 1, 58, {-28800, 0 }}}, michael@0: { "02-28-00 00:00:00", { 000000, 00, 00, 00, 28, 1, 2000, 1, 58, {-28800, 0 }}}, michael@0: { "02-28-2000 00:00:00", { 000000, 00, 00, 00, 28, 1, 2000, 1, 58, {-28800, 0 }}}, michael@0: michael@0: /* 29-Feb-2000 */ michael@0: { "29 Feb 2000 00:00:00", { 000000, 00, 00, 00, 29, 1, 2000, 2, 59, {-28800, 0 }}}, michael@0: { "2/29/00 00:00:00", { 000000, 00, 00, 00, 29, 1, 2000, 2, 59, {-28800, 0 }}}, michael@0: { "2/29/2000 00:00:00", { 000000, 00, 00, 00, 29, 1, 2000, 2, 59, {-28800, 0 }}}, michael@0: { "2-29-00 00:00:00", { 000000, 00, 00, 00, 29, 1, 2000, 2, 59, {-28800, 0 }}}, michael@0: { "2-29-2000 00:00:00", { 000000, 00, 00, 00, 29, 1, 2000, 2, 59, {-28800, 0 }}}, michael@0: { "02-29-00 00:00:00", { 000000, 00, 00, 00, 29, 1, 2000, 2, 59, {-28800, 0 }}}, michael@0: { "02-29-2000 00:00:00", { 000000, 00, 00, 00, 29, 1, 2000, 2, 59, {-28800, 0 }}}, michael@0: michael@0: /* 01-Mar-2000 */ michael@0: { "01 Mar 2000 00:00:00", { 000000, 00, 00, 00, 1, 2, 2000, 3, 60, {-28800, 0 }}}, michael@0: { "3/1/00 00:00:00", { 000000, 00, 00, 00, 1, 2, 2000, 3, 60, {-28800, 0 }}}, michael@0: { "3/1/2000 00:00:00", { 000000, 00, 00, 00, 1, 2, 2000, 3, 60, {-28800, 0 }}}, michael@0: { "3-1-00 00:00:00", { 000000, 00, 00, 00, 1, 2, 2000, 3, 60, {-28800, 0 }}}, michael@0: { "03-01-00 00:00:00", { 000000, 00, 00, 00, 1, 2, 2000, 3, 60, {-28800, 0 }}}, michael@0: { "03-01-2000 00:00:00", { 000000, 00, 00, 00, 1, 2, 2000, 3, 60, {-28800, 0 }}}, michael@0: michael@0: /* "Sun". 31-Dec-2000 */ michael@0: { "31 Dec 2000 00:00:00", { 000000, 00, 00, 00, 31, 11, 2000, 0, 365, {-28800, 0 }}}, michael@0: { "12/31/00 00:00:00", { 000000, 00, 00, 00, 31, 11, 2000, 0, 365, {-28800, 0 }}}, michael@0: { "12/31/2000 00:00:00", { 000000, 00, 00, 00, 31, 11, 2000, 0, 365, {-28800, 0 }}}, michael@0: { "12-31-00 00:00:00", { 000000, 00, 00, 00, 31, 11, 2000, 0, 365, {-28800, 0 }}}, michael@0: { "12-31-2000 00:00:00", { 000000, 00, 00, 00, 31, 11, 2000, 0, 365, {-28800, 0 }}}, michael@0: { "00-12-31 00:00:00", { 000000, 00, 00, 00, 31, 11, 2000, 0, 365, {-28800, 0 }}}, michael@0: { "00/12/31 00:00:00", { 000000, 00, 00, 00, 31, 11, 2000, 0, 365, {-28800, 0 }}}, michael@0: michael@0: /* "Sun". 01-Jan-2001 */ michael@0: { "01 Jan 2001 00:00:00", { 000000, 00, 00, 00, 1, 0, 2001, 1, 0, {-28800, 0 }}}, michael@0: { "1/1/01 00:00:00", { 000000, 00, 00, 00, 1, 0, 2001, 1, 0, {-28800, 0 }}}, michael@0: { "1/1/2001 00:00:00", { 000000, 00, 00, 00, 1, 0, 2001, 1, 0, {-28800, 0 }}}, michael@0: { "1-1-01 00:00:00", { 000000, 00, 00, 00, 1, 0, 2001, 1, 0, {-28800, 0 }}}, michael@0: { "1-1-2001 00:00:00", { 000000, 00, 00, 00, 1, 0, 2001, 1, 0, {-28800, 0 }}}, michael@0: { "01-01-01 00:00:00", { 000000, 00, 00, 00, 1, 0, 2001, 1, 0, {-28800, 0 }}}, michael@0: { "Saturday 01-01-2001 00:00:00", { 000000, 00, 00, 00, 1, 0, 2001, 1, 0, {-28800, 0 }}}, michael@0: michael@0: /* 01-Mar-2001 */ michael@0: { "01 Mar 2001 00:00:00", { 000000, 00, 00, 00, 1, 2, 2001, 4, 59, {-28800, 0 }}}, michael@0: { "3/1/01 00:00:00", { 000000, 00, 00, 00, 1, 2, 2001, 4, 59, {-28800, 0 }}}, michael@0: { "3/1/2001 00:00:00", { 000000, 00, 00, 00, 1, 2, 2001, 4, 59, {-28800, 0 }}}, michael@0: { "3-1-01 00:00:00", { 000000, 00, 00, 00, 1, 2, 2001, 4, 59, {-28800, 0 }}}, michael@0: { "3-1-2001 00:00:00", { 000000, 00, 00, 00, 1, 2, 2001, 4, 59, {-28800, 0 }}}, michael@0: { "03-01-01 00:00:00", { 000000, 00, 00, 00, 1, 2, 2001, 4, 59, {-28800, 0 }}}, michael@0: { "03-01-2001 00:00:00", { 000000, 00, 00, 00, 1, 2, 2001, 4, 59, {-28800, 0 }}}, michael@0: michael@0: /* 29-Feb-2004 */ michael@0: { "29 Feb 2004 00:00:00", { 000000, 00, 00, 00, 29, 1, 2004, 0, 59, {-28800, 0 }}}, michael@0: { "2/29/04 00:00:00", { 000000, 00, 00, 00, 29, 1, 2004, 0, 59, {-28800, 0 }}}, michael@0: { "2/29/2004 00:00:00", { 000000, 00, 00, 00, 29, 1, 2004, 0, 59, {-28800, 0 }}}, michael@0: { "2-29-04 00:00:00", { 000000, 00, 00, 00, 29, 1, 2004, 0, 59, {-28800, 0 }}}, michael@0: { "2-29-2004 00:00:00", { 000000, 00, 00, 00, 29, 1, 2004, 0, 59, {-28800, 0 }}}, michael@0: michael@0: /* 01-Mar-2004 */ michael@0: { "01 Mar 2004 00:00:00", { 000000, 00, 00, 00, 1, 2, 2004, 1, 60, {-28800, 0 }}}, michael@0: { "3/1/04 00:00:00", { 000000, 00, 00, 00, 1, 2, 2004, 1, 60, {-28800, 0 }}}, michael@0: { "3/1/2004 00:00:00", { 000000, 00, 00, 00, 1, 2, 2004, 1, 60, {-28800, 0 }}}, michael@0: { "3-1-04 00:00:00", { 000000, 00, 00, 00, 1, 2, 2004, 1, 60, {-28800, 0 }}}, michael@0: { "3-1-2004 00:00:00", { 000000, 00, 00, 00, 1, 2, 2004, 1, 60, {-28800, 0 }}}, michael@0: { "03-01-04 00:00:00", { 000000, 00, 00, 00, 1, 2, 2004, 1, 60, {-28800, 0 }}}, michael@0: { "03-01-2004 00:00:00", { 000000, 00, 00, 00, 1, 2, 2004, 1, 60, {-28800, 0 }}}, michael@0: michael@0: /* 01-Mar-2005 */ michael@0: { "01 Mar 2005 00:00:00", { 000000, 00, 00, 00, 1, 2, 2005, 2, 59, {-28800, 0 }}}, michael@0: { "3/1/05 00:00:00", { 000000, 00, 00, 00, 1, 2, 2005, 2, 59, {-28800, 0 }}}, michael@0: { "3/1/2005 00:00:00", { 000000, 00, 00, 00, 1, 2, 2005, 2, 59, {-28800, 0 }}}, michael@0: { "3-1-05 00:00:00", { 000000, 00, 00, 00, 1, 2, 2005, 2, 59, {-28800, 0 }}}, michael@0: { "3-1-2005 00:00:00", { 000000, 00, 00, 00, 1, 2, 2005, 2, 59, {-28800, 0 }}}, michael@0: { "03-01-05 00:00:00", { 000000, 00, 00, 00, 1, 2, 2005, 2, 59, {-28800, 0 }}}, michael@0: { "03-01-2005 00:00:00", { 000000, 00, 00, 00, 1, 2, 2005, 2, 59, {-28800, 0 }}}, michael@0: michael@0: /* last element. string must be null */ michael@0: { NULL } michael@0: }; /* end array of ParseTest */ michael@0: michael@0: /* michael@0: ** TestParseTime() -- Test PR_ParseTimeString() for y2k compliance michael@0: ** michael@0: ** TestParseTime() loops thru the array parseArray. For each element in michael@0: ** the array, he calls PR_ParseTimeString() with sDate as the conversion michael@0: ** argument. The result (ct) is then converted to a PRExplodedTime structure michael@0: ** and compared with the exploded time value (parseArray[n].et) in the michael@0: ** array element; if equal, the element passes the test. michael@0: ** michael@0: ** The array parseArray[] contains entries that are interesting to the michael@0: ** y2k problem. michael@0: ** michael@0: ** michael@0: */ michael@0: static PRStatus TestParseTime( void ) michael@0: { michael@0: ParseTest *ptp = parseArray; michael@0: PRTime ct; michael@0: PRExplodedTime cet; michael@0: char *sp = ptp->sDate; michael@0: PRStatus rc; michael@0: PRStatus rv = PR_SUCCESS; michael@0: michael@0: while ( sp != NULL) michael@0: { michael@0: rc = PR_ParseTimeString( sp, PR_FALSE, &ct ); michael@0: if ( PR_FAILURE == rc ) michael@0: { michael@0: printf("TestParseTime(): PR_ParseTimeString() failed to convert: %s\n", sp ); michael@0: rv = PR_FAILURE; michael@0: failed_already = 1; michael@0: } michael@0: else michael@0: { michael@0: PR_ExplodeTime( ct, PR_LocalTimeParameters , &cet ); michael@0: michael@0: if ( !ExplodedTimeIsEqual( &cet, &ptp->et )) michael@0: { michael@0: printf("TestParseTime(): Exploded time compare failed: %s\n", sp ); michael@0: if ( debug_mode ) michael@0: { michael@0: PrintExplodedTime( &cet ); michael@0: printf("\n"); michael@0: PrintExplodedTime( &ptp->et ); michael@0: printf("\n"); michael@0: } michael@0: michael@0: rv = PR_FAILURE; michael@0: failed_already = 1; michael@0: } michael@0: } michael@0: michael@0: /* point to next element in array, keep going */ michael@0: ptp++; michael@0: sp = ptp->sDate; michael@0: } /* end while() */ michael@0: michael@0: return( rv ); michael@0: } /* end TestParseTime() */ michael@0: michael@0: int main(int argc, char** argv) michael@0: { michael@0: /* The command line argument: -d is used to determine if the test is being run michael@0: in debug mode. The regress tool requires only one line output:PASS or FAIL. michael@0: All of the printfs associated with this test has been handled with a if (debug_mode) michael@0: test. michael@0: Usage: test_name -d michael@0: */ michael@0: PLOptStatus os; michael@0: PLOptState *opt; michael@0: michael@0: PR_STDIO_INIT(); michael@0: opt = PL_CreateOptState(argc, argv, "d"); michael@0: while (PL_OPT_EOL != (os = PL_GetNextOpt(opt))) michael@0: { michael@0: if (PL_OPT_BAD == os) continue; michael@0: switch (opt->option) michael@0: { michael@0: case 'd': /* debug mode */ michael@0: debug_mode = PR_TRUE; michael@0: break; michael@0: default: michael@0: break; michael@0: } michael@0: } michael@0: PL_DestroyOptState(opt); michael@0: michael@0: /* main test */ michael@0: michael@0: PR_Init(PR_USER_THREAD, PR_PRIORITY_NORMAL, 0); michael@0: lm = PR_NewLogModule("test"); michael@0: michael@0: if ( PR_FAILURE == TestExplodeImplodeTime()) michael@0: { michael@0: PR_LOG( lm, PR_LOG_ERROR, michael@0: ("TestExplodeImplodeTime() failed")); michael@0: } michael@0: else michael@0: printf("Test 1: Calendar Time Test passed\n"); michael@0: michael@0: if ( PR_FAILURE == TestNormalizeTime()) michael@0: { michael@0: PR_LOG( lm, PR_LOG_ERROR, michael@0: ("TestNormalizeTime() failed")); michael@0: } michael@0: else michael@0: printf("Test 2: Normalize Time Test passed\n"); michael@0: michael@0: if ( PR_FAILURE == TestParseTime()) michael@0: { michael@0: PR_LOG( lm, PR_LOG_ERROR, michael@0: ("TestParseTime() failed")); michael@0: } michael@0: else michael@0: printf("Test 3: Parse Time Test passed\n"); michael@0: michael@0: if (failed_already) michael@0: return 1; michael@0: else michael@0: return 0; michael@0: } /* end main() y2k.c */ michael@0: