tst: Provide test for ctime

Message ID 20210121085416.32249-1-lukma@denx.de
State Superseded
Headers
Series tst: Provide test for ctime |

Commit Message

Lukasz Majewski Jan. 21, 2021, 8:54 a.m. UTC
  This change adds new test to assess ctime's functionality.

To be more specific - following use cases are checked:
- Pass time_t value as 0 to check if epoch time is converted
- Pass time_t as max value for 32 bit systems
- Pass time_t as the first value after Y2038 threshold
---
 time/Makefile    |  2 +-
 time/tst-ctime.c | 51 ++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 52 insertions(+), 1 deletion(-)
 create mode 100644 time/tst-ctime.c
  

Comments

Florian Weimer Jan. 21, 2021, 9:13 a.m. UTC | #1
* Lukasz Majewski:

> This change adds new test to assess ctime's functionality.

I think the test needs to set the time zone.

Thanks,
Florian
  
Lukasz Majewski Jan. 21, 2021, 10:11 a.m. UTC | #2
Hi Florian,

> * Lukasz Majewski:
> 
> > This change adds new test to assess ctime's functionality.  
> 
> I think the test needs to set the time zone.
> 

It works as a standalone test in my local test bench. Is it by chance
(that the tz was set correctly earlier)?

There are also no issues when I run code in this patch in the glibc
test suite:
https://github.com/lmajewski/y2038_glibc/commits/y2038_edge


> Thanks,
> Florian




Best regards,

Lukasz Majewski

--

DENX Software Engineering GmbH,      Managing Director: Wolfgang Denk
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-59 Fax: (+49)-8142-66989-80 Email: lukma@denx.de
  
Florian Weimer Jan. 21, 2021, 10:24 a.m. UTC | #3
* Lukasz Majewski:

> Hi Florian,
>
>> * Lukasz Majewski:
>> 
>> > This change adds new test to assess ctime's functionality.  
>> 
>> I think the test needs to set the time zone.
>> 
>
> It works as a standalone test in my local test bench. Is it by chance
> (that the tz was set correctly earlier)?

The test wrappers do not set TZ, so you end up with whatever TZ points
to, or the system is configured with via /etc/localtime.  ctime is
specified to use local time, not UTC.

Thanks,
Florian
  
Lukasz Majewski Jan. 23, 2021, 9:49 p.m. UTC | #4
Hi Florian,

> * Lukasz Majewski:
> 
> > Hi Florian,
> >  
> >> * Lukasz Majewski:
> >>   
> >> > This change adds new test to assess ctime's functionality.    
> >> 
> >> I think the test needs to set the time zone.
> >>   
> >
> > It works as a standalone test in my local test bench. Is it by
> > chance (that the tz was set correctly earlier)?  
> 
> The test wrappers do not set TZ, so you end up with whatever TZ points
> to, or the system is configured with via /etc/localtime.  ctime is
> specified to use local time, not UTC.

I think that I got your point. Do you propose to use the same code as
in ./time/tst-y2039.c test?

In my use case I do use cross-test-ssh.sh script to execute this test.
It would require to set TZ on the remote test machine (Vexpress
CortexA9) - i.e. just modify the script to pass extra env (TZ) only for
this particular test.

Would it be OK, to leave things as they are now? Or do you perceive any
thread with such approach?

> 
> Thanks,
> Florian




Best regards,

Lukasz Majewski

--

DENX Software Engineering GmbH,      Managing Director: Wolfgang Denk
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-59 Fax: (+49)-8142-66989-80 Email: lukma@denx.de
  
Florian Weimer Jan. 23, 2021, 10:17 p.m. UTC | #5
* Lukasz Majewski:

>> The test wrappers do not set TZ, so you end up with whatever TZ points
>> to, or the system is configured with via /etc/localtime.  ctime is
>> specified to use local time, not UTC.
>
> I think that I got your point. Do you propose to use the same code as
> in ./time/tst-y2039.c test?

Yes, please use setenv or putenv.

Thanks,
Florian
  

Patch

diff --git a/time/Makefile b/time/Makefile
index 43e5821adc..486fb02ecb 100644
--- a/time/Makefile
+++ b/time/Makefile
@@ -51,7 +51,7 @@  tests	:= test_time clocktest tst-posixtz tst-strptime tst_wcsftime \
 	   tst-clock tst-clock2 tst-clock_nanosleep tst-cpuclock1 \
 	   tst-adjtime tst-clock-y2038 tst-clock2-y2038 \
 	   tst-cpuclock1-y2038 tst-clock_nanosleep-y2038 tst-clock_settime \
-	   tst-clock_adjtime
+	   tst-clock_adjtime tst-ctime
 
 include ../Rules
 
diff --git a/time/tst-ctime.c b/time/tst-ctime.c
new file mode 100644
index 0000000000..7ad913bb0d
--- /dev/null
+++ b/time/tst-ctime.c
@@ -0,0 +1,51 @@ 
+/* Test for ctime
+   Copyright (C) 2021 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#include <time.h>
+#include <support/check.h>
+
+static int
+do_test (void)
+{
+  char *str;
+  time_t t;
+
+  /* Check if the epoch time can be converted.  */
+  t = 0;
+  str = ctime (&t);
+  TEST_COMPARE_STRING (str, "Thu Jan  1 00:00:00 1970\n");
+
+  /* Check if the max time value for 32 bit time_t can be converted.  */
+  t = 0x7fffffff;
+  str = ctime (&t);
+  TEST_COMPARE_STRING (str, "Tue Jan 19 03:14:07 2038\n");
+
+  /* Check if the time is converted after 32 bit time_t overflow.  */
+  if (sizeof (time_t) > 4)
+    {
+      t++;
+      str = ctime (&t);
+      TEST_COMPARE_STRING (str, "Tue Jan 19 03:14:08 2038\n");
+    }
+  else
+    FAIL_UNSUPPORTED ("32-bit time_t");
+
+  return 0;
+}
+
+#include <support/test-driver.c>