gpgscm: Fix creation of temporary directories.
[gnupg.git] / common / t-gettime.c
index 5d554ee..13cb1a2 100644 (file)
  * GNU General Public License for more details.
  *
  * You should have received a copy of the GNU General Public License
  * GNU General Public License for more details.
  *
  * You should have received a copy of the GNU General Public License
- * along with this program; if not, see <http://www.gnu.org/licenses/>.
+ * along with this program; if not, see <https://www.gnu.org/licenses/>.
  */
 
 #include <config.h>
 #include <stdio.h>
 #include <stdlib.h>
  */
 
 #include <config.h>
 #include <stdio.h>
 #include <stdlib.h>
+#ifdef HAVE_STDINT_H
+# include <stdint.h>
+#endif
 
 #include "util.h"
 
 
 #include "util.h"
 
+/* In case we do not have stdint.h and no other version of that
+ * conversion macro provide shortcut it.  */
+#ifndef UINTMAX_C
+#define UINTMAX_C (c)  (c)
+#endif
+
 #define pass()  do { ; } while(0)
 #define fail(a)  do { fprintf (stderr, "%s:%d: test %d failed\n",\
                                __FILE__,__LINE__, (a));          \
 #define pass()  do { ; } while(0)
 #define fail(a)  do { fprintf (stderr, "%s:%d: test %d failed\n",\
                                __FILE__,__LINE__, (a));          \
@@ -54,6 +63,12 @@ test_isotime2epoch (void)
     { "20070629T160000 ",  1183132800 },
     { "20070629T160000\n", 1183132800 },
     { "20070629T160000.",  INVALID },
     { "20070629T160000 ",  1183132800 },
     { "20070629T160000\n", 1183132800 },
     { "20070629T160000.",  INVALID },
+#if SIZEOF_TIME_T > 4
+    { "21060207T062815", (time_t)UINTMAX_C(0x0ffffffff) },
+    { "21060207T062816", (time_t)UINTMAX_C(0x100000000) },
+    { "21060207T062817", (time_t)UINTMAX_C(0x100000001) },
+    { "21060711T120001", (time_t)UINTMAX_C(4308292801)  },
+#endif /*SIZEOF_TIME_T > 4*/
     { NULL, 0 }
   };
   int idx;
     { NULL, 0 }
   };
   int idx;
@@ -174,6 +189,80 @@ test_string2isotime (void)
 }
 
 
 }
 
 
+static void
+test_isodate_human_to_tm (void)
+{
+  struct {
+    const char *string;
+    int okay;
+    int year, mon, mday;
+  } array [] = {
+    { "1970-01-01",      1, 1970,  1,  1 },
+    { "1970-02-01",      1, 1970,  2,  1 },
+    { "1970-12-31",      1, 1970, 12, 31 },
+    { "1971-01-01",      1, 1971,  1,  1 },
+    { "1998-08-15",      1, 1998,  8, 15 },
+    { "2015-04-10",      1, 2015,  4, 10 },
+    { "2015-04-10 11:30",1, 2015,  4, 10 },
+    { "1969-12-31",      0,    0,  0,  0 },
+    { "1900-01-01",      0,    0,  0,  0 },
+    { "",                0,    0,  0,  0 },
+    { "1970-12-32",      0,    0,  0,  0 },
+    { "1970-13-01",      0,    0,  0,  0 },
+    { "1970-01-00",      0,    0,  0,  0 },
+    { "1970-00-01",      0,    0,  0,  0 },
+    { "1970-00-01",      0,    0,  0,  0 },
+    { "1970",            0,    0,  0,  0 },
+    { "1970-01",         0,    0,  0,  0 },
+    { "1970-01-1",       0,    0,  0,  0 },
+    { "1970-1--01",      0,    0,  0,  0 },
+    { "1970-01-01,",     1, 1970,  1,  1 },
+    { "1970-01-01 ",     1, 1970,  1,  1 },
+    { "1970-01-01\t",    1, 1970,  1,  1 },
+    { "1970-01-01;",     0,    0,  0,  0 },
+    { "1970-01-01:",     0,    0,  0,  0 },
+    { "1970_01-01",      0,    0,  0,  0 },
+    { "1970-01_01",      0,    0,  0,  0 },
+    { NULL, 0 }
+  };
+  int idx;
+  int okay;
+  struct tm tmbuf;
+
+  for (idx=0; array[idx].string; idx++)
+    {
+      okay = !isodate_human_to_tm (array[idx].string, &tmbuf);
+      if (okay != array[idx].okay)
+        {
+          fail (idx);
+          if (verbose)
+            fprintf (stderr, "string '%s' expected: %d, got: %d\n",
+                     array[idx].string, (int)array[idx].okay, okay);
+        }
+      else if (!okay)
+        ;
+      else if (tmbuf.tm_year + 1900 != array[idx].year
+               || tmbuf.tm_mon +1   != array[idx].mon
+               || tmbuf.tm_mday     != array[idx].mday)
+        {
+          fail (idx);
+          if (verbose)
+            fprintf (stderr, "string '%s' returned %04d-%02d-%02d\n",
+                     array[idx].string,
+                     tmbuf.tm_year + 1900, tmbuf.tm_mon + 1, tmbuf.tm_mday);
+        }
+      else if (tmbuf.tm_sec || tmbuf.tm_min || tmbuf.tm_hour
+               || tmbuf.tm_isdst != -1)
+        {
+          fail (idx);
+          if (verbose)
+            fprintf (stderr, "string '%s' returned bad time part\n",
+                     array[idx].string);
+        }
+    }
+}
+
+
 int
 main (int argc, char **argv)
 {
 int
 main (int argc, char **argv)
 {
@@ -182,6 +271,7 @@ main (int argc, char **argv)
 
   test_isotime2epoch ();
   test_string2isotime ();
 
   test_isotime2epoch ();
   test_string2isotime ();
+  test_isodate_human_to_tm ();
 
   return !!errcount;
 }
 
   return !!errcount;
 }