[02/52] linux: Add futimes test

Message ID 20210305201518.798584-3-adhemerval.zanella@linaro.org
State Superseded
Headers
Series Add 64 bit time support on legacy ABIs |

Commit Message

Adhemerval Zanella Netto March 5, 2021, 8:14 p.m. UTC
  It uses stat to compare against the values set by futimes.

Checked on i686-linux-gnu.
---
 sysdeps/unix/sysv/linux/Makefile      |  4 +-
 sysdeps/unix/sysv/linux/tst-futimes.c | 85 +++++++++++++++++++++++++++
 2 files changed, 88 insertions(+), 1 deletion(-)
 create mode 100644 sysdeps/unix/sysv/linux/tst-futimes.c
  

Comments

Florian Weimer March 5, 2021, 8:30 p.m. UTC | #1
* Adhemerval Zanella via Libc-alpha:

> +#define PREPARE do_prepare
> +static void
> +do_prepare (int argc, char *argv[])
> +{
> +  temp_fd = create_temp_file ("utimes", &testfile);
> +  TEST_VERIFY_EXIT (temp_fd > 0);
> +}

I believe this should use /dev/shm.

Thanks,
Florian
  
Florian Weimer March 5, 2021, 8:33 p.m. UTC | #2
* Adhemerval Zanella via Libc-alpha:

> +#ifndef struct_stat
> +# define struct_stat struct stat64
> +#endif

This isn't necessary because xfstat is hard-wired to struct stat64.

Thanks,
Florian
  
Joseph Myers March 6, 2021, 12:02 a.m. UTC | #3
On Fri, 5 Mar 2021, Adhemerval Zanella via Libc-alpha wrote:

> diff --git a/sysdeps/unix/sysv/linux/tst-futimes.c b/sysdeps/unix/sysv/linux/tst-futimes.c
> new file mode 100644
> index 0000000000..026b0af023
> --- /dev/null
> +++ b/sysdeps/unix/sysv/linux/tst-futimes.c
> @@ -0,0 +1,85 @@
> +/* Basix test for utimes.

If it's testing futimes, the comment should say futimes not utimes.
  
Paul Zimmermann March 6, 2021, 3:52 a.m. UTC | #4
> > diff --git a/sysdeps/unix/sysv/linux/tst-futimes.c b/sysdeps/unix/sysv/linux/tst-futimes.c
> > new file mode 100644
> > index 0000000000..026b0af023
> > --- /dev/null
> > +++ b/sysdeps/unix/sysv/linux/tst-futimes.c
> > @@ -0,0 +1,85 @@
> > +/* Basix test for utimes.
> 
> If it's testing futimes, the comment should say futimes not utimes.

and in addition: Basix -> Basic.

Paul
  
Adhemerval Zanella Netto March 8, 2021, 1:01 p.m. UTC | #5
On 05/03/2021 17:30, Florian Weimer wrote:
> * Adhemerval Zanella via Libc-alpha:
> 
>> +#define PREPARE do_prepare
>> +static void
>> +do_prepare (int argc, char *argv[])
>> +{
>> +  temp_fd = create_temp_file ("utimes", &testfile);
>> +  TEST_VERIFY_EXIT (temp_fd > 0);
>> +}
> 
> I believe this should use /dev/shm.

I still don't this we should gloss over buggy filesystem.
  
Adhemerval Zanella Netto March 8, 2021, 1:02 p.m. UTC | #6
On 05/03/2021 17:33, Florian Weimer wrote:
> * Adhemerval Zanella via Libc-alpha:
> 
>> +#ifndef struct_stat
>> +# define struct_stat struct stat64
>> +#endif
> 
> This isn't necessary because xfstat is hard-wired to struct stat64.

This is necessary once the time64 support is done on a subsequent patch,
but I will move this snippet later in the set.
  
Adhemerval Zanella Netto March 8, 2021, 1:03 p.m. UTC | #7
On 05/03/2021 21:02, Joseph Myers wrote:
> On Fri, 5 Mar 2021, Adhemerval Zanella via Libc-alpha wrote:
> 
>> diff --git a/sysdeps/unix/sysv/linux/tst-futimes.c b/sysdeps/unix/sysv/linux/tst-futimes.c
>> new file mode 100644
>> index 0000000000..026b0af023
>> --- /dev/null
>> +++ b/sysdeps/unix/sysv/linux/tst-futimes.c
>> @@ -0,0 +1,85 @@
>> +/* Basix test for utimes.
> 
> If it's testing futimes, the comment should say futimes not utimes.
> 

I will fix on the other occurrences as well.
  
Florian Weimer March 8, 2021, 1:08 p.m. UTC | #8
* Adhemerval Zanella:

> On 05/03/2021 17:30, Florian Weimer wrote:
>> * Adhemerval Zanella via Libc-alpha:
>> 
>>> +#define PREPARE do_prepare
>>> +static void
>>> +do_prepare (int argc, char *argv[])
>>> +{
>>> +  temp_fd = create_temp_file ("utimes", &testfile);
>>> +  TEST_VERIFY_EXIT (temp_fd > 0);
>>> +}
>> 
>> I believe this should use /dev/shm.
>
> I still don't this we should gloss over buggy filesystem.

I view this as exactly the same thing as disabling post-Y2038 for 32-bit
time_t.

We should make it easy for contributors to test their patches.  Tests
where you need to remember why they fail on some systems make this
difficult.

Thanks,
Florian
  
Adhemerval Zanella Netto March 8, 2021, 1:23 p.m. UTC | #9
On 08/03/2021 10:02, Adhemerval Zanella wrote:
> 
> 
> On 05/03/2021 17:33, Florian Weimer wrote:
>> * Adhemerval Zanella via Libc-alpha:
>>
>>> +#ifndef struct_stat
>>> +# define struct_stat struct stat64
>>> +#endif
>>
>> This isn't necessary because xfstat is hard-wired to struct stat64.
> 
> This is necessary once the time64 support is done on a subsequent patch,
> but I will move this snippet later in the set.
> 

In fact it is not really required because it was a leftover when I had
not fix tiem64 support for LARFGEFILE64. I will remove it and adjust
the libsupport accordingly.
  
Adhemerval Zanella Netto March 8, 2021, 1:26 p.m. UTC | #10
On 08/03/2021 10:08, Florian Weimer wrote:
> * Adhemerval Zanella:
> 
>> On 05/03/2021 17:30, Florian Weimer wrote:
>>> * Adhemerval Zanella via Libc-alpha:
>>>
>>>> +#define PREPARE do_prepare
>>>> +static void
>>>> +do_prepare (int argc, char *argv[])
>>>> +{
>>>> +  temp_fd = create_temp_file ("utimes", &testfile);
>>>> +  TEST_VERIFY_EXIT (temp_fd > 0);
>>>> +}
>>>
>>> I believe this should use /dev/shm.
>>
>> I still don't this we should gloss over buggy filesystem.
> 
> I view this as exactly the same thing as disabling post-Y2038 for 32-bit
> time_t.
> 
> We should make it easy for contributors to test their patches.  Tests
> where you need to remember why they fail on some systems make this
> difficult.

On the other hand we are hiding a potentially y2038 issues and 
reporting a success that might fail when users do use the interface.

I do prefer users to actually test and report failures so we can
iron out the y2038 support *now*.
  
Florian Weimer March 8, 2021, 1:30 p.m. UTC | #11
* Adhemerval Zanella:

> On 08/03/2021 10:08, Florian Weimer wrote:
>> * Adhemerval Zanella:
>> 
>>> On 05/03/2021 17:30, Florian Weimer wrote:
>>>> * Adhemerval Zanella via Libc-alpha:
>>>>
>>>>> +#define PREPARE do_prepare
>>>>> +static void
>>>>> +do_prepare (int argc, char *argv[])
>>>>> +{
>>>>> +  temp_fd = create_temp_file ("utimes", &testfile);
>>>>> +  TEST_VERIFY_EXIT (temp_fd > 0);
>>>>> +}
>>>>
>>>> I believe this should use /dev/shm.
>>>
>>> I still don't this we should gloss over buggy filesystem.
>> 
>> I view this as exactly the same thing as disabling post-Y2038 for 32-bit
>> time_t.
>> 
>> We should make it easy for contributors to test their patches.  Tests
>> where you need to remember why they fail on some systems make this
>> difficult.
>
> On the other hand we are hiding a potentially y2038 issues and 
> reporting a success that might fail when users do use the interface.

I did not suggest to disable the test.  I suggested to change so that it
uses /dev/shm because tmpfs does not have this problem (and if it does,
it can be fixed there by a simple kernel update).

Tests for exercising file systems should be maintained in xfstests
(which is actually file system independent these days, if I understand
it correctly) or LTP.

Thanks,
Florian
  

Patch

diff --git a/sysdeps/unix/sysv/linux/Makefile b/sysdeps/unix/sysv/linux/Makefile
index 51e28b97ac..94b933310b 100644
--- a/sysdeps/unix/sysv/linux/Makefile
+++ b/sysdeps/unix/sysv/linux/Makefile
@@ -107,7 +107,9 @@  tests += tst-clone tst-clone2 tst-clone3 tst-fanotify tst-personality \
 	 test-errno-linux tst-memfd_create tst-mlock2 tst-pkey \
 	 tst-rlimit-infinity tst-ofdlocks tst-gettid tst-gettid-kill \
 	 tst-tgkill tst-sysvsem-linux tst-sysvmsg-linux tst-sysvshm-linux \
-	 tst-timerfd tst-ppoll tst-futimens tst-utime tst-utimes
+	 tst-timerfd tst-ppoll tst-futimens tst-utime tst-utimes \
+	 tst-futimes
+
 tests-internal += tst-ofdlocks-compat tst-sigcontext-get_pc
 
 CFLAGS-tst-sigcontext-get_pc.c = -fasynchronous-unwind-tables
diff --git a/sysdeps/unix/sysv/linux/tst-futimes.c b/sysdeps/unix/sysv/linux/tst-futimes.c
new file mode 100644
index 0000000000..026b0af023
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/tst-futimes.c
@@ -0,0 +1,85 @@ 
+/* Basix test for utimes.
+   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 <stdlib.h>
+#include <sys/stat.h>
+#include <sys/time.h>
+#include <support/check.h>
+#include <support/xunistd.h>
+#include <support/temp_file.h>
+
+#ifndef struct_stat
+# define struct_stat struct stat64
+#endif
+
+static int temp_fd = -1;
+static char *testfile;
+
+/* struct timeval array with Y2038 threshold minus 2 and 1 seconds.  */
+const static struct timeval t1[2] = { { 0x7FFFFFFE, 0 },  { 0x7FFFFFFF, 0 } };
+
+/* struct timeval array with Y2038 threshold plus 1 and 2 seconds.  */
+const static struct timeval t2[2] = { { 0x80000001ULL, 0 },
+				      { 0x80000002ULL, 0 } };
+
+/* struct timeval array around Y2038 threshold.  */
+const static struct timeval t3[2] = { { 0x7FFFFFFE, 0 },
+				      { 0x80000002ULL, 0 } };
+
+#define PREPARE do_prepare
+static void
+do_prepare (int argc, char *argv[])
+{
+  temp_fd = create_temp_file ("utimes", &testfile);
+  TEST_VERIFY_EXIT (temp_fd > 0);
+}
+
+static int
+test_utime_helper (const struct timeval *tv)
+{
+  /* Check if we run on port with 32 bit time_t size */
+  time_t t;
+  if (__builtin_add_overflow (tv->tv_sec, 0, &t))
+    return 0;
+
+  TEST_VERIFY_EXIT (futimes (temp_fd, tv) == 0);
+
+  struct_stat st;
+  xfstat (temp_fd, &st);
+
+  /* Check if seconds for atime match */
+  TEST_COMPARE (st.st_atime, tv[0].tv_sec);
+
+  /* Check if seconds for mtime match */
+  TEST_COMPARE (st.st_mtime, tv[1].tv_sec);
+
+  return 0;
+}
+
+static int
+do_test (void)
+{
+  test_utime_helper (&t1[0]);
+  test_utime_helper (&t2[0]);
+  test_utime_helper (&t3[0]);
+
+  return 0;
+}
+
+#include <support/test-driver.c>