| 1 | /* $Id: 625main.c 904 2003-12-15 16:01:51Z bird $
 | 
|---|
| 2 |  *
 | 
|---|
| 3 |  * TZ (tzset++) testcase.
 | 
|---|
| 4 |  *
 | 
|---|
| 5 |  * InnoTek Systemberatung GmbH confidential
 | 
|---|
| 6 |  *
 | 
|---|
| 7 |  * Copyright (c) 2003 InnoTek Systemberatung GmbH
 | 
|---|
| 8 |  * Author: knut st. osmundsen <bird-srcspam@anduin.net>
 | 
|---|
| 9 |  *
 | 
|---|
| 10 |  * All Rights Reserved
 | 
|---|
| 11 |  *
 | 
|---|
| 12 |  */
 | 
|---|
| 13 | #include <time.h>
 | 
|---|
| 14 | #include <stdio.h>
 | 
|---|
| 15 | #include <stdlib.h>
 | 
|---|
| 16 | #include <string.h>
 | 
|---|
| 17 | 
 | 
|---|
| 18 | static struct times
 | 
|---|
| 19 | {
 | 
|---|
| 20 |     time_t   time;
 | 
|---|
| 21 | }   aTimes[7] =
 | 
|---|
| 22 | {
 | 
|---|
| 23 |    0,                                       /* 1970-01-01 00:00:00 */
 | 
|---|
| 24 |    13046400,                                /* 1970-06-01 00:00:00 */
 | 
|---|
| 25 |    -(10*365+3-31-29)*24*3600 - 12*3600,     /* 1960-03-01 12:00:00 */
 | 
|---|
| 26 |    -0x7fffffff + (365*24*60*60),            /* 1901-12-14 20:45:52 */
 | 
|---|
| 27 |    0x7fffffff - (24*60*60),                 /* 2038-01-18 03:14:07 */
 | 
|---|
| 28 |    31*365*24*3600 + 132,                    /* 2000-12-23 16:01:12 */
 | 
|---|
| 29 |    (33*365 + 172)*24*3600 + 132,            /* 2000-12-23 16:01:12 */
 | 
|---|
| 30 | };
 | 
|---|
| 31 | 
 | 
|---|
| 32 | static struct testcase
 | 
|---|
| 33 | {
 | 
|---|
| 34 |     const char *pszTZ;
 | 
|---|
| 35 |     const char *pszTZRes;
 | 
|---|
| 36 |     const char *apszRes[9];
 | 
|---|
| 37 | }   aTests[] =
 | 
|---|
| 38 | {
 | 
|---|
| 39 |     {
 | 
|---|
| 40 |         "TZ=PST8",
 | 
|---|
| 41 |         "timezone=28800  daylight=0  tzname='PST','",
 | 
|---|
| 42 |         {
 | 
|---|
| 43 |             "1969-12-31 16:00:00  3  364  not-dst(0)",
 | 
|---|
| 44 |             "1970-05-31 16:00:00  0  150  not-dst(0)",
 | 
|---|
| 45 |             "1960-02-29 04:00:00  1   59  not-dst(0)",
 | 
|---|
| 46 |             "1902-12-13 12:45:53  6  346  not-dst(0)",
 | 
|---|
| 47 |             "2038-01-17 19:14:07  0   16  not-dst(0)",
 | 
|---|
| 48 |             "2000-12-23 16:02:12  6  357  not-dst(0)",
 | 
|---|
| 49 |             "2003-06-13 16:02:12  5  163  not-dst(0)",
 | 
|---|
| 50 |         }
 | 
|---|
| 51 |     },
 | 
|---|
| 52 |     {
 | 
|---|
| 53 |         "TZ=UCT0",
 | 
|---|
| 54 |         "timezone=0      daylight=0  tzname='UCT','",
 | 
|---|
| 55 |         {
 | 
|---|
| 56 |             "1970-01-01 00:00:00  4    0  not-dst(0)",
 | 
|---|
| 57 |             "1970-06-01 00:00:00  1  151  not-dst(0)",
 | 
|---|
| 58 |             "1960-02-29 12:00:00  1   59  not-dst(0)",
 | 
|---|
| 59 |             "1902-12-13 20:45:53  6  346  not-dst(0)",
 | 
|---|
| 60 |             "2038-01-18 03:14:07  1   17  not-dst(0)",
 | 
|---|
| 61 |             "2000-12-24 00:02:12  0  358  not-dst(0)",
 | 
|---|
| 62 |             "2003-06-14 00:02:12  6  164  not-dst(0)",
 | 
|---|
| 63 |         }
 | 
|---|
| 64 |     },
 | 
|---|
| 65 |     {
 | 
|---|
| 66 |         "TZ=PST8PDT",
 | 
|---|
| 67 |         "timezone=28800  daylight=1  tzname='PST','PDT'",
 | 
|---|
| 68 |         {
 | 
|---|
| 69 |             "1969-12-31 16:00:00  3  364  not-dst(0)",
 | 
|---|
| 70 |             "1970-05-31 17:00:00  0  150  dst(1)",
 | 
|---|
| 71 |             "1960-02-29 04:00:00  1   59  not-dst(0)",
 | 
|---|
| 72 |             "1902-12-13 12:45:53  6  346  not-dst(0)",
 | 
|---|
| 73 |             "2038-01-17 19:14:07  0   16  not-dst(0)",
 | 
|---|
| 74 |             "2000-12-23 16:02:12  6  357  not-dst(0)",
 | 
|---|
| 75 |             "2003-06-13 17:02:12  5  163  dst(1)",
 | 
|---|
| 76 |         }
 | 
|---|
| 77 |     },
 | 
|---|
| 78 |     {
 | 
|---|
| 79 |         "TZ=CET-1CDT",
 | 
|---|
| 80 |         "timezone=-3600  daylight=1  tzname='CET','CDT'",
 | 
|---|
| 81 |         {
 | 
|---|
| 82 |             "1970-01-01 01:00:00  4    0  not-dst(0)",
 | 
|---|
| 83 |             "1970-06-01 02:00:00  1  151  dst(1)",
 | 
|---|
| 84 |             "1960-02-29 13:00:00  1   59  not-dst(0)",
 | 
|---|
| 85 |             "1902-12-13 21:45:53  6  346  not-dst(0)",
 | 
|---|
| 86 |             "2038-01-18 04:14:07  1   17  not-dst(0)",
 | 
|---|
| 87 |             "2000-12-24 01:02:12  0  358  not-dst(0)",
 | 
|---|
| 88 |             "2003-06-14 02:02:12  6  164  dst(1)",
 | 
|---|
| 89 |         }
 | 
|---|
| 90 |     },
 | 
|---|
| 91 |     {
 | 
|---|
| 92 | #ifndef UNIX_TZ
 | 
|---|
| 93 |         "TZ=CET-1CEDT,3,-1,0,7200,10,-1,0,10800,3600",
 | 
|---|
| 94 | #else
 | 
|---|
| 95 |         /*"TZ=CET-1CEDT,M3.-1.0/2,M10.-1.0/3", */
 | 
|---|
| 96 |         "TZ=CET-1CEDT,M3.4.0/2,M10.4.0/3",
 | 
|---|
| 97 | #endif
 | 
|---|
| 98 |         "timezone=-3600  daylight=1  tzname='CET','CEDT'",
 | 
|---|
| 99 |         {
 | 
|---|
| 100 |             "1970-01-01 01:00:00  4    0  not-dst(0)",
 | 
|---|
| 101 |             "1970-06-01 02:00:00  1  151  dst(1)",
 | 
|---|
| 102 |             "1960-02-29 13:00:00  1   59  not-dst(0)",
 | 
|---|
| 103 |             "1902-12-13 21:45:53  6  346  not-dst(0)",
 | 
|---|
| 104 |             "2038-01-18 04:14:07  1   17  not-dst(0)",
 | 
|---|
| 105 |             "2000-12-24 01:02:12  0  358  not-dst(0)",
 | 
|---|
| 106 |             "2003-06-14 02:02:12  6  164  dst(1)",
 | 
|---|
| 107 |         }
 | 
|---|
| 108 |     },
 | 
|---|
| 109 |     {
 | 
|---|
| 110 | #ifndef UNIX_TZ
 | 
|---|
| 111 |         "TZ=AEST-10AEDT,10,-1,0,7200,3,-1,0,7200,3600",
 | 
|---|
| 112 | #else
 | 
|---|
| 113 |         /*"TZ=AEST-10AEDT,M10.-1.0/2,M3.-1.0/2", */
 | 
|---|
| 114 |         "TZ=AEST-10AEDT,M10.4.0/2,M3.4.0/2",
 | 
|---|
| 115 | #endif
 | 
|---|
| 116 |         "timezone=-36000  daylight=1  tzname='AEST','AEDT'",
 | 
|---|
| 117 |         {
 | 
|---|
| 118 |             "1970-01-01 11:00:00  4    0  dst(1)",
 | 
|---|
| 119 |             "1970-06-01 10:00:00  1  151  not-dst(0)",
 | 
|---|
| 120 |             "1960-02-29 23:00:00  1   59  dst(1)",
 | 
|---|
| 121 |             "1902-12-14 07:45:53  0  347  dst(1)",
 | 
|---|
| 122 |             "2038-01-18 14:14:07  1   17  dst(1)",
 | 
|---|
| 123 |             "2000-12-24 11:02:12  0  358  dst(1)",
 | 
|---|
| 124 |             "2003-06-14 10:02:12  6  164  not-dst(0)",
 | 
|---|
| 125 |         }
 | 
|---|
| 126 |     }
 | 
|---|
| 127 | };
 | 
|---|
| 128 | 
 | 
|---|
| 129 | int doTests(void)
 | 
|---|
| 130 | {
 | 
|---|
| 131 |     int i;
 | 
|---|
| 132 |     int rc;
 | 
|---|
| 133 |     char sz[512];
 | 
|---|
| 134 | 
 | 
|---|
| 135 |     for (rc = i = 0; i < sizeof(aTests) / sizeof(aTests[0]); i++)
 | 
|---|
| 136 |     {
 | 
|---|
| 137 |         int j;
 | 
|---|
| 138 |         putenv(aTests[i].pszTZ);
 | 
|---|
| 139 |         tzset();
 | 
|---|
| 140 |         sprintf(sz, "timezone=%-5d  daylight=%d  tzname='%s','%s'",
 | 
|---|
| 141 | #ifndef FREEBSD
 | 
|---|
| 142 | #ifdef __IBMC__
 | 
|---|
| 143 |                 _timezone,
 | 
|---|
| 144 | #else
 | 
|---|
| 145 |                 timezone,
 | 
|---|
| 146 | #endif
 | 
|---|
| 147 |                 daylight,
 | 
|---|
| 148 | #else
 | 
|---|
| 149 |                 -1, -1,
 | 
|---|
| 150 | #endif
 | 
|---|
| 151 |                 tzname[0],
 | 
|---|
| 152 |                 tzname[1]);
 | 
|---|
| 153 | #ifndef FREEBSD
 | 
|---|
| 154 |         if (!strncmp(sz, aTests[i].pszTZRes, strlen(aTests[i].pszTZRes)))
 | 
|---|
| 155 | #endif
 | 
|---|
| 156 |             printf("%s\n  %s - ok\n", aTests[i].pszTZ, sz);
 | 
|---|
| 157 | #ifndef FREEBSD
 | 
|---|
| 158 |         else
 | 
|---|
| 159 |         {
 | 
|---|
| 160 |             printf("%s\n  %s - mismatch!!! %s\n", aTests[i].pszTZ, sz, aTests[i].pszTZRes);
 | 
|---|
| 161 |             rc++;
 | 
|---|
| 162 |         }
 | 
|---|
| 163 | #endif
 | 
|---|
| 164 | 
 | 
|---|
| 165 |         for (j = 0; j < sizeof(aTimes) / sizeof(aTimes[0]); j++)
 | 
|---|
| 166 |         {
 | 
|---|
| 167 |             struct tm  *pTm = localtime(&aTimes[j].time);
 | 
|---|
| 168 |             sprintf(sz, "%04d-%02d-%02d %02d:%02d:%02d  %d  %3d  %s(%d)",
 | 
|---|
| 169 |                    pTm->tm_year + 1900, pTm->tm_mon + 1, pTm->tm_mday,
 | 
|---|
| 170 |                    pTm->tm_hour, pTm->tm_min, pTm->tm_sec, pTm->tm_wday, pTm->tm_yday,
 | 
|---|
| 171 |                    pTm->tm_isdst ? "dst" : "not-dst", pTm->tm_isdst);
 | 
|---|
| 172 |             if (!strcmp(sz, aTests[i].apszRes[j]))
 | 
|---|
| 173 |                 printf("%12d: %s - ok\n", aTimes[j].time, sz);
 | 
|---|
| 174 |             else
 | 
|---|
| 175 |             {
 | 
|---|
| 176 |                 printf("%12d: %s - mismatch!! %s\n", aTimes[j].time, sz, aTests[i].apszRes[j]);
 | 
|---|
| 177 |                 rc++;
 | 
|---|
| 178 |             }
 | 
|---|
| 179 |         }
 | 
|---|
| 180 |     }
 | 
|---|
| 181 |     return rc;
 | 
|---|
| 182 | }
 | 
|---|
| 183 | 
 | 
|---|
| 184 | void printtz(void)
 | 
|---|
| 185 | {
 | 
|---|
| 186 |     const char *pszTZ = getenv("TZ");
 | 
|---|
| 187 |     int         i;
 | 
|---|
| 188 | 
 | 
|---|
| 189 |     tzset();
 | 
|---|
| 190 |     printf("TZ=%s\n    timezone=%-5d\t daylight=%d\ttzname='%s','%s'\n",
 | 
|---|
| 191 |            pszTZ,
 | 
|---|
| 192 | #ifndef FREEBSD
 | 
|---|
| 193 |     #ifdef __IBMC__
 | 
|---|
| 194 |            _timezone,
 | 
|---|
| 195 |     #else
 | 
|---|
| 196 |            timezone,
 | 
|---|
| 197 |     #endif
 | 
|---|
| 198 |            daylight,
 | 
|---|
| 199 | #else
 | 
|---|
| 200 |            -1, -1,
 | 
|---|
| 201 | #endif
 | 
|---|
| 202 |            tzname[0],
 | 
|---|
| 203 |            tzname[1]);
 | 
|---|
| 204 |     for (i = 0; i < sizeof(aTimes) / sizeof(aTimes[0]); i++)
 | 
|---|
| 205 |     {
 | 
|---|
| 206 |         struct tm  *pTm = localtime(&aTimes[i].time);
 | 
|---|
| 207 |         printf("%12d: %04d-%02d-%02d %02d:%02d:%02d  %d  %3d  %s(%d)\n",
 | 
|---|
| 208 |                (int)aTimes[i].time, pTm->tm_year + 1900, pTm->tm_mon + 1, pTm->tm_mday,
 | 
|---|
| 209 |                pTm->tm_hour, pTm->tm_min, pTm->tm_sec, pTm->tm_wday, pTm->tm_yday,
 | 
|---|
| 210 |                pTm->tm_isdst ? "dst" : "not-dst", pTm->tm_isdst);
 | 
|---|
| 211 |     }
 | 
|---|
| 212 | }
 | 
|---|
| 213 | 
 | 
|---|
| 214 | int main()
 | 
|---|
| 215 | {
 | 
|---|
| 216 |     int rcRet;
 | 
|---|
| 217 | 
 | 
|---|
| 218 |     printtz();
 | 
|---|
| 219 |     putenv("TZ=");
 | 
|---|
| 220 |     printtz();
 | 
|---|
| 221 | 
 | 
|---|
| 222 |     /* execute testcases. */
 | 
|---|
| 223 |     rcRet = doTests();
 | 
|---|
| 224 | 
 | 
|---|
| 225 |     /* results */
 | 
|---|
| 226 |     if (!rcRet)
 | 
|---|
| 227 |         printf("Successfully executed return struct testcase (#625).\n");
 | 
|---|
| 228 |     else
 | 
|---|
| 229 |         printf("625main: %d failures.\n", rcRet);
 | 
|---|
| 230 |     return rcRet;
 | 
|---|
| 231 | }
 | 
|---|
| 232 | 
 | 
|---|