diff options
Diffstat (limited to 'io')
-rw-r--r-- | io/Makefile | 5 | ||||
-rw-r--r-- | io/tst-futimens.c | 45 | ||||
-rw-r--r-- | io/tst-utime.c | 45 | ||||
-rw-r--r-- | io/tst-utimensat-skeleton.c | 91 | ||||
-rw-r--r-- | io/tst-utimes.c | 47 |
5 files changed, 232 insertions, 1 deletions
diff --git a/io/Makefile b/io/Makefile index 914d7689b2..cf631ff36b 100644 --- a/io/Makefile +++ b/io/Makefile @@ -68,7 +68,10 @@ tests := test-utime test-stat test-stat2 test-lfs tst-getcwd \ tst-fts tst-fts-lfs tst-open-tmpfile \ tst-copy_file_range tst-getcwd-abspath tst-lockf \ tst-ftw-lnk tst-file_change_detection tst-lchmod \ - tst-ftw-bz26353 tst-stat tst-stat-lfs + tst-ftw-bz26353 tst-stat tst-stat-lfs \ + tst-utime \ + tst-utimes \ + tst-futimens \ # Likewise for statx, but we do not need static linking here. tests-internal += tst-statx diff --git a/io/tst-futimens.c b/io/tst-futimens.c new file mode 100644 index 0000000000..ac7a980017 --- /dev/null +++ b/io/tst-futimens.c @@ -0,0 +1,45 @@ +/* Test for futimens + 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 <support/check.h> +#include <support/xunistd.h> +#include <sys/stat.h> + +static int +test_futimens_helper (const char *file, int fd, const struct timespec *ts) +{ + int result = futimens (fd, ts); + TEST_VERIFY_EXIT (result == 0); + + struct stat64 st; + xfstat (fd, &st); + + /* Check if seconds for atime match */ + TEST_COMPARE (st.st_atime, ts[0].tv_sec); + + /* Check if seconds for mtime match */ + TEST_COMPARE (st.st_mtime, ts[1].tv_sec); + + return 0; +} + +#define TEST_CALL(fname, fd, v1, v2) \ + test_futimens_helper (fname, fd, (struct timespec[]) { { v1, 0 }, \ + { v2, 0 } }) + +#include "tst-utimensat-skeleton.c" diff --git a/io/tst-utime.c b/io/tst-utime.c new file mode 100644 index 0000000000..c1c7e75a29 --- /dev/null +++ b/io/tst-utime.c @@ -0,0 +1,45 @@ +/* Test for utime. + 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 <utime.h> +#include <support/check.h> +#include <support/xunistd.h> +#include <sys/stat.h> + +static int +test_utime_helper (const char *file, int fd, const struct utimbuf *ut) +{ + int result = utime (file, ut); + TEST_VERIFY_EXIT (result == 0); + + struct stat64 st; + xfstat (fd, &st); + + /* Check if seconds for actime match */ + TEST_COMPARE (st.st_atime, ut->actime); + + /* Check if seconds for modtime match */ + TEST_COMPARE (st.st_mtime, ut->modtime); + + return 0; +} + +#define TEST_CALL(fname, fd, v1, v2) \ + test_utime_helper (fname, fd, &(struct utimbuf) { (v1), (v2) }) + +#include "tst-utimensat-skeleton.c" diff --git a/io/tst-utimensat-skeleton.c b/io/tst-utimensat-skeleton.c new file mode 100644 index 0000000000..3589146db5 --- /dev/null +++ b/io/tst-utimensat-skeleton.c @@ -0,0 +1,91 @@ +/* Common tests for utimensat routines. + 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 <array_length.h> +#include <inttypes.h> +#include <support/support.h> +#include <support/temp_file.h> +#include <stdio.h> + +static int temp_fd = -1; +static char *testfile; + +const static struct { + int64_t v1; + int64_t v2; +} tests[] = { + /* Y2038 threshold minus 2 and 1 seconds. */ + { 0x7FFFFFFELL, 0x7FFFFFFFLL }, + /* Y2038 threshold plus 1 and 2 seconds. */ + { 0x80000001LL, 0x80000002LL }, + /* Around Y2038 threshold. */ + { 0x7FFFFFFELL, 0x80000002LL }, + /* Y2106 threshold minus 2 and 1 seconds. */ + { 0x100000000LL, 0xFFFFFFFELL }, + /* Y2106 threshold plus 1 and 2 seconds. */ + { 0x100000001LL, 0x100000002LL }, + /* Around Y2106 threshold. */ + { 0xFFFFFFFELL, 0xFFFFFFFELL }, +}; + +#define PREPARE do_prepare +static void +do_prepare (int argc, char *argv[]) +{ + temp_fd = create_temp_file ("utime", &testfile); + TEST_VERIFY_EXIT (temp_fd > 0); +} + +static int +do_test (void) +{ + if (!support_path_support_time64 (testfile)) + FAIL_UNSUPPORTED ("File %s does not support 64-bit timestamps", + testfile); + + bool y2106 = support_path_support_time64_value (testfile, + 0x100000001LL, + 0x100000002LL); + + for (int i = 0; i < array_length (tests); i++) + { + /* Check if we run on port with 32 bit time_t size. */ + time_t t; + if (__builtin_add_overflow (tests[i].v1, 0, &t) + || __builtin_add_overflow (tests[i].v2, 0, &t)) + { + printf ("warning: skipping tests[%d] { %" PRIx64 ", %" PRIx64 " }: " + "time_t overflows\n", i, tests[i].v1, tests[i].v2); + continue; + } + + if (tests[i].v1 >= 0x100000000LL && !y2106) + { + printf ("warning: skipping tests[%d] { %" PRIx64 ", %" PRIx64 " }: " + "unsupported timestamp value\n", + i, tests[i].v1, tests[i].v2); + continue; + } + + TEST_CALL (testfile, temp_fd, tests[i].v1, tests[i].v2); + } + + return 0; +} + +#include <support/test-driver.c> diff --git a/io/tst-utimes.c b/io/tst-utimes.c new file mode 100644 index 0000000000..ba710508b7 --- /dev/null +++ b/io/tst-utimes.c @@ -0,0 +1,47 @@ +/* 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 <support/check.h> +#include <support/xunistd.h> +#include <sys/stat.h> +#include <sys/time.h> +#include <time.h> + +static int +test_utimes_helper (const char *file, int fd, const struct timeval *tv) +{ + int result = utimes (file, tv); + TEST_VERIFY_EXIT (result == 0); + + struct stat64 st; + xfstat (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; +} + +#define TEST_CALL(fname, fd, v1, v2) \ + test_utimes_helper (fname, fd, (struct timeval[]) { { v1, 0 }, \ + { v2, 0 } }) + +#include "tst-utimensat-skeleton.c" |