1313498Sngie/* $NetBSD: t_strptime.c,v 1.12 2015/10/31 02:25:11 christos Exp $ */ 2272343Sngie 3272343Sngie/*- 4272343Sngie * Copyright (c) 1998, 2008 The NetBSD Foundation, Inc. 5272343Sngie * All rights reserved. 6272343Sngie * 7272343Sngie * This code is derived from software contributed to The NetBSD Foundation 8272343Sngie * by David Laight. 9272343Sngie * 10272343Sngie * Redistribution and use in source and binary forms, with or without 11272343Sngie * modification, are permitted provided that the following conditions 12272343Sngie * are met: 13272343Sngie * 1. Redistributions of source code must retain the above copyright 14272343Sngie * notice, this list of conditions and the following disclaimer. 15272343Sngie * 2. Redistributions in binary form must reproduce the above copyright 16272343Sngie * notice, this list of conditions and the following disclaimer in the 17272343Sngie * documentation and/or other materials provided with the distribution. 18272343Sngie * 19272343Sngie * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 20272343Sngie * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 21272343Sngie * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 22272343Sngie * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 23272343Sngie * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 24272343Sngie * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 25272343Sngie * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 26272343Sngie * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 27272343Sngie * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 28272343Sngie * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 29272343Sngie * POSSIBILITY OF SUCH DAMAGE. 30272343Sngie */ 31272343Sngie 32272343Sngie#include <sys/cdefs.h> 33272343Sngie__COPYRIGHT("@(#) Copyright (c) 2008\ 34272343Sngie The NetBSD Foundation, inc. All rights reserved."); 35313498Sngie__RCSID("$NetBSD: t_strptime.c,v 1.12 2015/10/31 02:25:11 christos Exp $"); 36272343Sngie 37272343Sngie#include <time.h> 38313498Sngie#include <stdlib.h> 39313498Sngie#include <stdio.h> 40272343Sngie 41272343Sngie#include <atf-c.h> 42272343Sngie 43272343Sngiestatic void 44272343Sngieh_pass(const char *buf, const char *fmt, int len, 45272343Sngie int tm_sec, int tm_min, int tm_hour, int tm_mday, 46272343Sngie int tm_mon, int tm_year, int tm_wday, int tm_yday) 47272343Sngie{ 48272343Sngie struct tm tm = { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, NULL }; 49272343Sngie const char *ret, *exp; 50272343Sngie 51272343Sngie exp = buf + len; 52272343Sngie ret = strptime(buf, fmt, &tm); 53272343Sngie 54276478Sngie#ifdef __FreeBSD__ 55276478Sngie ATF_CHECK_MSG(ret == exp, 56276478Sngie "strptime(\"%s\", \"%s\", tm): incorrect return code: " 57276478Sngie "expected: %p, got: %p", buf, fmt, exp, ret); 58276478Sngie 59276478Sngie#define H_REQUIRE_FIELD(field) \ 60276478Sngie ATF_CHECK_MSG(tm.field == field, \ 61276478Sngie "strptime(\"%s\", \"%s\", tm): incorrect %s: " \ 62276478Sngie "expected: %d, but got: %d", buf, fmt, \ 63276478Sngie ___STRING(field), field, tm.field) 64276478Sngie#else 65272343Sngie ATF_REQUIRE_MSG(ret == exp, 66272343Sngie "strptime(\"%s\", \"%s\", tm): incorrect return code: " 67272343Sngie "expected: %p, got: %p", buf, fmt, exp, ret); 68272343Sngie 69272343Sngie#define H_REQUIRE_FIELD(field) \ 70272343Sngie ATF_REQUIRE_MSG(tm.field == field, \ 71272343Sngie "strptime(\"%s\", \"%s\", tm): incorrect %s: " \ 72272343Sngie "expected: %d, but got: %d", buf, fmt, \ 73272343Sngie ___STRING(field), field, tm.field) 74276478Sngie#endif 75272343Sngie 76272343Sngie H_REQUIRE_FIELD(tm_sec); 77272343Sngie H_REQUIRE_FIELD(tm_min); 78272343Sngie H_REQUIRE_FIELD(tm_hour); 79272343Sngie H_REQUIRE_FIELD(tm_mday); 80272343Sngie H_REQUIRE_FIELD(tm_mon); 81272343Sngie H_REQUIRE_FIELD(tm_year); 82272343Sngie H_REQUIRE_FIELD(tm_wday); 83272343Sngie H_REQUIRE_FIELD(tm_yday); 84272343Sngie 85272343Sngie#undef H_REQUIRE_FIELD 86272343Sngie} 87272343Sngie 88272343Sngiestatic void 89272343Sngieh_fail(const char *buf, const char *fmt) 90272343Sngie{ 91272343Sngie struct tm tm = { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, NULL }; 92272343Sngie 93276478Sngie#ifdef __FreeBSD__ 94276478Sngie ATF_CHECK_MSG(strptime(buf, fmt, &tm) == NULL, "strptime(\"%s\", " 95276478Sngie "\"%s\", &tm) should fail, but it didn't", buf, fmt); 96276478Sngie#else 97272343Sngie ATF_REQUIRE_MSG(strptime(buf, fmt, &tm) == NULL, "strptime(\"%s\", " 98272343Sngie "\"%s\", &tm) should fail, but it didn't", buf, fmt); 99276478Sngie#endif 100272343Sngie} 101272343Sngie 102313498Sngiestatic struct { 103313498Sngie const char *name; 104313498Sngie long offs; 105313498Sngie} zt[] = { 106313498Sngie { "Z", 0 }, 107313498Sngie { "UT", 0 }, 108313498Sngie { "UTC", 0 }, 109313498Sngie { "GMT", 0 }, 110313498Sngie { "EST", -18000 }, 111313498Sngie { "EDT", -14400 }, 112313498Sngie { "CST", -21600 }, 113313498Sngie { "CDT", -18000 }, 114313498Sngie { "MST", -25200 }, 115313498Sngie { "MDT", -21600 }, 116313498Sngie { "PST", -28800 }, 117313498Sngie { "PDT", -25200 }, 118313498Sngie 119313498Sngie { "VST", -1 }, 120313498Sngie { "VDT", -1 }, 121313498Sngie 122313498Sngie { "+03", 10800 }, 123313498Sngie { "-03", -10800 }, 124313498Sngie { "+0403", 14580 }, 125313498Sngie { "-0403", -14580 }, 126313498Sngie { "+04:03", 14580 }, 127313498Sngie { "-04:03", -14580 }, 128313498Sngie { "+14:00", 50400 }, 129313498Sngie { "-14:00", -50400 }, 130313498Sngie { "+23:59", 86340 }, 131313498Sngie { "-23:59", -86340 }, 132313498Sngie 133313498Sngie { "1", -1 }, 134313498Sngie { "03", -1 }, 135313498Sngie { "0304", -1 }, 136313498Sngie { "+1", -1 }, 137313498Sngie { "-203", -1 }, 138313498Sngie { "+12345", -1 }, 139313498Sngie { "+12:345", -1 }, 140313498Sngie { "+123:45", -1 }, 141313498Sngie { "+2400", -1 }, 142313498Sngie { "-2400", -1 }, 143313498Sngie { "+1060", -1 }, 144313498Sngie { "-1060", -1 }, 145313498Sngie 146313498Sngie { "A", -3600 }, 147313498Sngie { "B", -7200 }, 148313498Sngie { "C", -10800 }, 149313498Sngie { "D", -14400 }, 150313498Sngie { "E", -18000 }, 151313498Sngie { "F", -21600 }, 152313498Sngie { "G", -25200 }, 153313498Sngie { "H", -28800 }, 154313498Sngie { "I", -32400 }, 155313498Sngie { "L", -39600 }, 156313498Sngie { "M", -43200 }, 157313498Sngie { "N", 3600 }, 158313498Sngie { "O", 7200 }, 159313498Sngie { "P", 10800 }, 160313498Sngie { "Q", 14400 }, 161313498Sngie { "R", 18000 }, 162313498Sngie { "T", 25200 }, 163313498Sngie { "U", 28800 }, 164313498Sngie { "V", 32400 }, 165313498Sngie { "W", 36000 }, 166313498Sngie { "X", 39600 }, 167313498Sngie { "Y", 43200 }, 168313498Sngie 169313498Sngie { "J", -2 }, 170313498Sngie 171313498Sngie { "America/Los_Angeles", -28800 }, 172313498Sngie { "America/New_York", -18000 }, 173313498Sngie { "EST4EDT", -14400 }, 174313498Sngie 175313498Sngie { "Bogus", -1 }, 176313498Sngie}; 177313498Sngie 178313498Sngiestatic void 179313498Sngieztest1(const char *name, const char *fmt, long value) 180313498Sngie{ 181313498Sngie struct tm tm; 182313498Sngie char *rv; 183313498Sngie 184313498Sngie memset(&tm, 0, sizeof(tm)); 185313498Sngie if ((rv = strptime(name, fmt, &tm)) == NULL) 186313498Sngie tm.tm_gmtoff = -1; 187313498Sngie else if (rv == name && fmt[1] == 'Z') 188313498Sngie value = 0; 189313498Sngie 190313498Sngie switch (value) { 191313498Sngie case -2: 192313498Sngie value = -timezone; 193313498Sngie break; 194313498Sngie case -1: 195313498Sngie if (fmt[1] == 'Z') 196313498Sngie value = 0; 197313498Sngie break; 198313498Sngie default: 199313498Sngie break; 200313498Sngie } 201313498Sngie 202313498Sngie ATF_REQUIRE_MSG(tm.tm_gmtoff == value, 203313498Sngie "strptime(\"%s\", \"%s\", &tm): " 204313498Sngie "expected: tm.tm_gmtoff=%ld, got: tm.tm_gmtoff=%ld", 205313498Sngie name, fmt, value, tm.tm_gmtoff); 206313498Sngie printf("%s %s %ld\n", name, fmt, tm.tm_gmtoff); 207313498Sngie} 208313498Sngie 209313498Sngiestatic void 210313498Sngieztest(const char *fmt) 211313498Sngie{ 212313498Sngie setenv("TZ", "US/Eastern", 1); 213313498Sngie ztest1("GMT", fmt, 0); 214313498Sngie ztest1("UTC", fmt, 0); 215313498Sngie ztest1("US/Eastern", fmt, -18000); 216313498Sngie for (size_t i = 0; i < __arraycount(zt); i++) 217313498Sngie ztest1(zt[i].name, fmt, zt[i].offs); 218313498Sngie} 219313498Sngie 220272343SngieATF_TC(common); 221272343Sngie 222272343SngieATF_TC_HEAD(common, tc) 223272343Sngie{ 224272343Sngie 225272343Sngie atf_tc_set_md_var(tc, "descr", "Checks strptime(3): various checks"); 226272343Sngie} 227272343Sngie 228272343SngieATF_TC_BODY(common, tc) 229272343Sngie{ 230272343Sngie 231276478Sngie#ifdef __FreeBSD__ 232276478Sngie atf_tc_expect_fail("There are various issues with strptime on FreeBSD"); 233276478Sngie#endif 234276478Sngie 235272343Sngie h_pass("Tue Jan 20 23:27:46 1998", "%a %b %d %T %Y", 236313498Sngie 24, 46, 27, 23, 20, 0, 98, 2, 19); 237272343Sngie h_pass("Tue Jan 20 23:27:46 1998", "%a %b %d %H:%M:%S %Y", 238313498Sngie 24, 46, 27, 23, 20, 0, 98, 2, 19); 239272343Sngie h_pass("Tue Jan 20 23:27:46 1998", "%c", 240313498Sngie 24, 46, 27, 23, 20, 0, 98, 2, 19); 241272343Sngie h_pass("Fri Mar 4 20:05:34 2005", "%a %b %e %H:%M:%S %Y", 242313498Sngie 24, 34, 5, 20, 4, 2, 105, 5, 62); 243272343Sngie h_pass("5\t3 4 8pm:05:34 2005", "%w%n%m%t%d%n%k%p:%M:%S %Y", 244313498Sngie 21, 34, 5, 20, 4, 2, 105, 5, 62); 245272343Sngie h_pass("Fri Mar 4 20:05:34 2005", "%c", 246313498Sngie 24, 34, 5, 20, 4, 2, 105, 5, 62); 247272343Sngie} 248272343Sngie 249272343SngieATF_TC(day); 250272343Sngie 251272343SngieATF_TC_HEAD(day, tc) 252272343Sngie{ 253272343Sngie 254313498Sngie atf_tc_set_md_var(tc, "descr", 255313498Sngie "Checks strptime(3) day name conversions [aA]"); 256272343Sngie} 257272343Sngie 258272343SngieATF_TC_BODY(day, tc) 259272343Sngie{ 260272343Sngie 261272343Sngie h_pass("Sun", "%a", 3, -1, -1, -1, -1, -1, -1, 0, -1); 262272343Sngie h_pass("Sunday", "%a", 6, -1, -1, -1, -1, -1, -1, 0, -1); 263272343Sngie h_pass("Mon", "%a", 3, -1, -1, -1, -1, -1, -1, 1, -1); 264272343Sngie h_pass("Monday", "%a", 6, -1, -1, -1, -1, -1, -1, 1, -1); 265272343Sngie h_pass("Tue", "%a", 3, -1, -1, -1, -1, -1, -1, 2, -1); 266272343Sngie h_pass("Tuesday", "%a", 7, -1, -1, -1, -1, -1, -1, 2, -1); 267272343Sngie h_pass("Wed", "%a", 3, -1, -1, -1, -1, -1, -1, 3, -1); 268272343Sngie h_pass("Wednesday", "%a", 9, -1, -1, -1, -1, -1, -1, 3, -1); 269272343Sngie h_pass("Thu", "%a", 3, -1, -1, -1, -1, -1, -1, 4, -1); 270272343Sngie h_pass("Thursday", "%a", 8, -1, -1, -1, -1, -1, -1, 4, -1); 271272343Sngie h_pass("Fri", "%a", 3, -1, -1, -1, -1, -1, -1, 5, -1); 272272343Sngie h_pass("Friday", "%a", 6, -1, -1, -1, -1, -1, -1, 5, -1); 273272343Sngie h_pass("Sat", "%a", 3, -1, -1, -1, -1, -1, -1, 6, -1); 274272343Sngie h_pass("Saturday", "%a", 8, -1, -1, -1, -1, -1, -1, 6, -1); 275272343Sngie h_pass("Saturn", "%a", 3, -1, -1, -1, -1, -1, -1, 6, -1); 276272343Sngie h_fail("Moon", "%a"); 277272343Sngie h_pass("Sun", "%A", 3, -1, -1, -1, -1, -1, -1, 0, -1); 278272343Sngie h_pass("Sunday", "%A", 6, -1, -1, -1, -1, -1, -1, 0, -1); 279272343Sngie h_pass("Mon", "%A", 3, -1, -1, -1, -1, -1, -1, 1, -1); 280272343Sngie h_pass("Monday", "%A", 6, -1, -1, -1, -1, -1, -1, 1, -1); 281272343Sngie h_pass("Tue", "%A", 3, -1, -1, -1, -1, -1, -1, 2, -1); 282272343Sngie h_pass("Tuesday", "%A", 7, -1, -1, -1, -1, -1, -1, 2, -1); 283272343Sngie h_pass("Wed", "%A", 3, -1, -1, -1, -1, -1, -1, 3, -1); 284272343Sngie h_pass("Wednesday", "%A", 9, -1, -1, -1, -1, -1, -1, 3, -1); 285272343Sngie h_pass("Thu", "%A", 3, -1, -1, -1, -1, -1, -1, 4, -1); 286272343Sngie h_pass("Thursday", "%A", 8, -1, -1, -1, -1, -1, -1, 4, -1); 287272343Sngie h_pass("Fri", "%A", 3, -1, -1, -1, -1, -1, -1, 5, -1); 288272343Sngie h_pass("Friday", "%A", 6, -1, -1, -1, -1, -1, -1, 5, -1); 289272343Sngie h_pass("Sat", "%A", 3, -1, -1, -1, -1, -1, -1, 6, -1); 290272343Sngie h_pass("Saturday", "%A", 8, -1, -1, -1, -1, -1, -1, 6, -1); 291272343Sngie h_pass("Saturn", "%A", 3, -1, -1, -1, -1, -1, -1, 6, -1); 292272343Sngie h_fail("Moon", "%A"); 293272343Sngie 294272343Sngie h_pass("mon", "%a", 3, -1, -1, -1, -1, -1, -1, 1, -1); 295272343Sngie h_pass("tueSDay", "%A", 7, -1, -1, -1, -1, -1, -1, 2, -1); 296272343Sngie h_pass("sunday", "%A", 6, -1, -1, -1, -1, -1, -1, 0, -1); 297276478Sngie#ifdef __NetBSD__ 298272343Sngie h_fail("sunday", "%EA"); 299276478Sngie#else 300276478Sngie h_pass("Sunday", "%EA", 6, -1, -1, -1, -1, -1, -1, 0, -1); 301276478Sngie#endif 302272343Sngie h_pass("SaturDay", "%A", 8, -1, -1, -1, -1, -1, -1, 6, -1); 303276478Sngie#ifdef __NetBSD__ 304272343Sngie h_fail("SaturDay", "%OA"); 305276478Sngie#else 306276478Sngie h_pass("SaturDay", "%OA", 8, -1, -1, -1, -1, -1, -1, 6, -1); 307276478Sngie#endif 308272343Sngie} 309272343Sngie 310313498SngieATF_TC(hour); 311313498Sngie 312313498SngieATF_TC_HEAD(hour, tc) 313313498Sngie{ 314313498Sngie 315313498Sngie atf_tc_set_md_var(tc, "descr", 316313498Sngie "Checks strptime(3) hour conversions [IH]"); 317313498Sngie} 318313498Sngie 319313498SngieATF_TC_BODY(hour, tc) 320313498Sngie{ 321313498Sngie 322313498Sngie h_fail("00", "%I"); 323313498Sngie h_fail("13", "%I"); 324313498Sngie 325313498Sngie h_pass("00", "%H", 2, -1, -1, 0, -1, -1, -1, -1, -1); 326313498Sngie h_pass("12", "%H", 2, -1, -1, 12, -1, -1, -1, -1, -1); 327313498Sngie h_pass("23", "%H", 2, -1, -1, 23, -1, -1, -1, -1, -1); 328313498Sngie h_fail("24", "%H"); 329313498Sngie} 330313498Sngie 331313498Sngie 332272343SngieATF_TC(month); 333272343Sngie 334272343SngieATF_TC_HEAD(month, tc) 335272343Sngie{ 336272343Sngie 337313498Sngie atf_tc_set_md_var(tc, "descr", 338313498Sngie "Checks strptime(3) month name conversions [bB]"); 339272343Sngie} 340272343Sngie 341272343SngieATF_TC_BODY(month, tc) 342272343Sngie{ 343272343Sngie 344272343Sngie h_pass("Jan", "%b", 3, -1, -1, -1, -1, 0, -1, -1, -1); 345272343Sngie h_pass("January", "%b", 7, -1, -1, -1, -1, 0, -1, -1, -1); 346272343Sngie h_pass("Feb", "%b", 3, -1, -1, -1, -1, 1, -1, -1, -1); 347272343Sngie h_pass("February", "%b", 8, -1, -1, -1, -1, 1, -1, -1, -1); 348272343Sngie h_pass("Mar", "%b", 3, -1, -1, -1, -1, 2, -1, -1, -1); 349272343Sngie h_pass("March", "%b", 5, -1, -1, -1, -1, 2, -1, -1, -1); 350272343Sngie h_pass("Apr", "%b", 3, -1, -1, -1, -1, 3, -1, -1, -1); 351272343Sngie h_pass("April", "%b", 5, -1, -1, -1, -1, 3, -1, -1, -1); 352272343Sngie h_pass("May", "%b", 3, -1, -1, -1, -1, 4, -1, -1, -1); 353272343Sngie h_pass("Jun", "%b", 3, -1, -1, -1, -1, 5, -1, -1, -1); 354272343Sngie h_pass("June", "%b", 4, -1, -1, -1, -1, 5, -1, -1, -1); 355272343Sngie h_pass("Jul", "%b", 3, -1, -1, -1, -1, 6, -1, -1, -1); 356272343Sngie h_pass("July", "%b", 4, -1, -1, -1, -1, 6, -1, -1, -1); 357272343Sngie h_pass("Aug", "%b", 3, -1, -1, -1, -1, 7, -1, -1, -1); 358272343Sngie h_pass("August", "%b", 6, -1, -1, -1, -1, 7, -1, -1, -1); 359272343Sngie h_pass("Sep", "%b", 3, -1, -1, -1, -1, 8, -1, -1, -1); 360272343Sngie h_pass("September", "%b", 9, -1, -1, -1, -1, 8, -1, -1, -1); 361272343Sngie h_pass("Oct", "%b", 3, -1, -1, -1, -1, 9, -1, -1, -1); 362272343Sngie h_pass("October", "%b", 7, -1, -1, -1, -1, 9, -1, -1, -1); 363272343Sngie h_pass("Nov", "%b", 3, -1, -1, -1, -1, 10, -1, -1, -1); 364272343Sngie h_pass("November", "%b", 8, -1, -1, -1, -1, 10, -1, -1, -1); 365272343Sngie h_pass("Dec", "%b", 3, -1, -1, -1, -1, 11, -1, -1, -1); 366272343Sngie h_pass("December", "%b", 8, -1, -1, -1, -1, 11, -1, -1, -1); 367272343Sngie h_pass("Mayor", "%b", 3, -1, -1, -1, -1, 4, -1, -1, -1); 368272343Sngie h_pass("Mars", "%b", 3, -1, -1, -1, -1, 2, -1, -1, -1); 369272343Sngie h_fail("Rover", "%b"); 370272343Sngie h_pass("Jan", "%B", 3, -1, -1, -1, -1, 0, -1, -1, -1); 371272343Sngie h_pass("January", "%B", 7, -1, -1, -1, -1, 0, -1, -1, -1); 372272343Sngie h_pass("Feb", "%B", 3, -1, -1, -1, -1, 1, -1, -1, -1); 373272343Sngie h_pass("February", "%B", 8, -1, -1, -1, -1, 1, -1, -1, -1); 374272343Sngie h_pass("Mar", "%B", 3, -1, -1, -1, -1, 2, -1, -1, -1); 375272343Sngie h_pass("March", "%B", 5, -1, -1, -1, -1, 2, -1, -1, -1); 376272343Sngie h_pass("Apr", "%B", 3, -1, -1, -1, -1, 3, -1, -1, -1); 377272343Sngie h_pass("April", "%B", 5, -1, -1, -1, -1, 3, -1, -1, -1); 378272343Sngie h_pass("May", "%B", 3, -1, -1, -1, -1, 4, -1, -1, -1); 379272343Sngie h_pass("Jun", "%B", 3, -1, -1, -1, -1, 5, -1, -1, -1); 380272343Sngie h_pass("June", "%B", 4, -1, -1, -1, -1, 5, -1, -1, -1); 381272343Sngie h_pass("Jul", "%B", 3, -1, -1, -1, -1, 6, -1, -1, -1); 382272343Sngie h_pass("July", "%B", 4, -1, -1, -1, -1, 6, -1, -1, -1); 383272343Sngie h_pass("Aug", "%B", 3, -1, -1, -1, -1, 7, -1, -1, -1); 384272343Sngie h_pass("August", "%B", 6, -1, -1, -1, -1, 7, -1, -1, -1); 385272343Sngie h_pass("Sep", "%B", 3, -1, -1, -1, -1, 8, -1, -1, -1); 386272343Sngie h_pass("September", "%B", 9, -1, -1, -1, -1, 8, -1, -1, -1); 387272343Sngie h_pass("Oct", "%B", 3, -1, -1, -1, -1, 9, -1, -1, -1); 388272343Sngie h_pass("October", "%B", 7, -1, -1, -1, -1, 9, -1, -1, -1); 389272343Sngie h_pass("Nov", "%B", 3, -1, -1, -1, -1, 10, -1, -1, -1); 390272343Sngie h_pass("November", "%B", 8, -1, -1, -1, -1, 10, -1, -1, -1); 391272343Sngie h_pass("Dec", "%B", 3, -1, -1, -1, -1, 11, -1, -1, -1); 392272343Sngie h_pass("December", "%B", 8, -1, -1, -1, -1, 11, -1, -1, -1); 393272343Sngie h_pass("Mayor", "%B", 3, -1, -1, -1, -1, 4, -1, -1, -1); 394272343Sngie h_pass("Mars", "%B", 3, -1, -1, -1, -1, 2, -1, -1, -1); 395272343Sngie h_fail("Rover", "%B"); 396272343Sngie 397272343Sngie h_pass("september", "%b", 9, -1, -1, -1, -1, 8, -1, -1, -1); 398272343Sngie h_pass("septembe", "%B", 3, -1, -1, -1, -1, 8, -1, -1, -1); 399272343Sngie} 400272343Sngie 401313498SngieATF_TC(seconds); 402313498Sngie 403313498SngieATF_TC_HEAD(seconds, tc) 404313498Sngie{ 405313498Sngie 406313498Sngie atf_tc_set_md_var(tc, "descr", 407313498Sngie "Checks strptime(3) seconds conversions [S]"); 408313498Sngie} 409313498Sngie 410313498SngieATF_TC_BODY(seconds, tc) 411313498Sngie{ 412313498Sngie 413313498Sngie h_pass("0", "%S", 1, 0, -1, -1, -1, -1, -1, -1, -1); 414313498Sngie h_pass("59", "%S", 2, 59, -1, -1, -1, -1, -1, -1, -1); 415313498Sngie h_pass("60", "%S", 2, 60, -1, -1, -1, -1, -1, -1, -1); 416313498Sngie h_pass("61", "%S", 2, 61, -1, -1, -1, -1, -1, -1, -1); 417313498Sngie h_fail("62", "%S"); 418313498Sngie} 419313498Sngie 420313498SngieATF_TC(year); 421313498Sngie 422313498SngieATF_TC_HEAD(year, tc) 423313498Sngie{ 424313498Sngie 425313498Sngie atf_tc_set_md_var(tc, "descr", 426313498Sngie "Checks strptime(3) century/year conversions [CyY]"); 427313498Sngie} 428313498Sngie 429313498SngieATF_TC_BODY(year, tc) 430313498Sngie{ 431313498Sngie 432313498Sngie h_pass("x20y", "x%Cy", 4, -1, -1, -1, -1, -1, 100, -1, -1); 433313498Sngie h_pass("x84y", "x%yy", 4, -1, -1, -1, -1, -1, 84, -1, -1); 434313498Sngie h_pass("x2084y", "x%C%yy", 6, -1, -1, -1, -1, -1, 184, -1, -1); 435313498Sngie h_pass("x8420y", "x%y%Cy", 6, -1, -1, -1, -1, -1, 184, -1, -1); 436313498Sngie h_pass("%20845", "%%%C%y5", 6, -1, -1, -1, -1, -1, 184, -1, -1); 437313498Sngie h_fail("%", "%E%"); 438313498Sngie 439313498Sngie h_pass("1980", "%Y", 4, -1, -1, -1, -1, -1, 80, -1, -1); 440313498Sngie h_pass("1980", "%EY", 4, -1, -1, -1, -1, -1, 80, -1, -1); 441313498Sngie} 442313498Sngie 443313498SngieATF_TC(zone); 444313498Sngie 445313498SngieATF_TC_HEAD(zone, tc) 446313498Sngie{ 447313498Sngie 448313498Sngie atf_tc_set_md_var(tc, "descr", 449313498Sngie "Checks strptime(3) timezone conversion [z]"); 450313498Sngie} 451313498Sngie 452313498Sngie 453313498SngieATF_TC_BODY(zone, tc) 454313498Sngie{ 455313498Sngie ztest("%z"); 456313498Sngie} 457313498Sngie 458313498SngieATF_TC(Zone); 459313498Sngie 460313498SngieATF_TC_HEAD(Zone, tc) 461313498Sngie{ 462313498Sngie 463313498Sngie atf_tc_set_md_var(tc, "descr", 464313498Sngie "Checks strptime(3) timezone conversion [Z]"); 465313498Sngie} 466313498Sngie 467313498Sngie 468313498SngieATF_TC_BODY(Zone, tc) 469313498Sngie{ 470313498Sngie ztest("%z"); 471313498Sngie} 472313498Sngie 473272343SngieATF_TP_ADD_TCS(tp) 474272343Sngie{ 475272343Sngie 476272343Sngie ATF_TP_ADD_TC(tp, common); 477272343Sngie ATF_TP_ADD_TC(tp, day); 478313498Sngie ATF_TP_ADD_TC(tp, hour); 479272343Sngie ATF_TP_ADD_TC(tp, month); 480313498Sngie ATF_TP_ADD_TC(tp, seconds); 481313498Sngie ATF_TP_ADD_TC(tp, year); 482313498Sngie ATF_TP_ADD_TC(tp, zone); 483313498Sngie ATF_TP_ADD_TC(tp, Zone); 484272343Sngie 485272343Sngie return atf_no_error(); 486272343Sngie} 487