[02/52] linux: Add futimes test
Commit Message
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
* 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
* 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
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.
> > 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
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.
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.
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.
* 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
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.
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*.
* 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
@@ -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
new file mode 100644
@@ -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>