[LTP] [PATCH v1] getcwd01: Implement .test_variants
Wei Gao
wegao@suse.com
Wed Dec 6 11:53:18 CET 2023
Signed-off-by: Wei Gao <wegao@suse.com>
---
testcases/kernel/syscalls/getcwd/getcwd01.c | 81 ++++++++++++++-------
1 file changed, 55 insertions(+), 26 deletions(-)
diff --git a/testcases/kernel/syscalls/getcwd/getcwd01.c b/testcases/kernel/syscalls/getcwd/getcwd01.c
index 218bf4ef2..e62254deb 100644
--- a/testcases/kernel/syscalls/getcwd/getcwd01.c
+++ b/testcases/kernel/syscalls/getcwd/getcwd01.c
@@ -1,23 +1,12 @@
// SPDX-License-Identifier: GPL-2.0-or-later
/*
* Copyright (c) International Business Machines Corp., 2001
+ * Copyright (c) 2023 Wei Gao <wegao@suse.com>
*/
/*
* DESCRIPTION
- * Testcase to test that getcwd(2) sets errno correctly.
- * 1) getcwd(2) fails if buf points to a bad address.
- * 2) getcwd(2) fails if the size is invalid.
- * 3) getcwd(2) fails if the size is set to 0.
- * 4) getcwd(2) fails if the size is set to 1.
- * 5) getcwd(2) fails if buf points to NULL and the size is set to 1.
- *
- * Expected Result:
- * 1) getcwd(2) should return NULL and set errno to EFAULT.
- * 2) getcwd(2) should return NULL and set errno to EFAULT.
- * 3) getcwd(2) should return NULL and set errno to ERANGE.
- * 4) getcwd(2) should return NULL and set errno to ERANGE.
- * 5) getcwd(2) should return NULL and set errno to ERANGE.
+ * Testcase to test that getcwd() sets errno correctly.
*/
#include <errno.h>
@@ -27,28 +16,68 @@
#include "lapi/syscalls.h"
static char buffer[5];
-
-static struct t_case {
+struct getcwd_variants {
+ void (*getcwd)(char *buf, size_t size, int exp_err);
char *buf;
size_t size;
int exp_err;
-} tcases[] = {
- {(void *)-1, PATH_MAX, EFAULT},
- {NULL, (size_t)-1, EFAULT},
- {buffer, 0, ERANGE},
- {buffer, 1, ERANGE},
- {NULL, 1, ERANGE}
};
+static void verify_getcwd_raw_syscall(char *buf, size_t size, int exp_err);
+static void verify_getcwd(char *buf, size_t size, int exp_err);
+
+static struct getcwd_variants variants[] = {
+#ifdef __GLIBC__
+ { .getcwd = verify_getcwd, .buf = NULL, .size = (size_t)-1, .exp_err = ENOMEM},
+ { .getcwd = verify_getcwd, .buf = NULL, .size = 1, .exp_err = ERANGE},
+#endif
+ { .getcwd = verify_getcwd, .buf = (void *)-1, .size = PATH_MAX, .exp_err = EFAULT},
+ { .getcwd = verify_getcwd, .buf = buffer, .size = 0, .exp_err = EINVAL},
+ { .getcwd = verify_getcwd, .buf = buffer, .size = 1, .exp_err = ERANGE},
+ { .getcwd = verify_getcwd_raw_syscall, .buf = buffer, .size = 0, .exp_err = ERANGE},
+ { .getcwd = verify_getcwd_raw_syscall, .buf = (void *)-1, .size = PATH_MAX, .exp_err = EFAULT},
+ { .getcwd = verify_getcwd_raw_syscall, .buf = NULL, .size = (size_t)-1, .exp_err = EFAULT},
+ { .getcwd = verify_getcwd_raw_syscall, .buf = buffer, .size = 0, .exp_err = ERANGE},
+ { .getcwd = verify_getcwd_raw_syscall, .buf = buffer, .size = 1, .exp_err = ERANGE},
+ { .getcwd = verify_getcwd_raw_syscall, .buf = NULL, .size = 1, .exp_err = ERANGE},
+};
+
+static void verify_getcwd(char *buf, size_t size, int exp_err)
+{
+ char *res;
+
+ errno = 0;
+ res = getcwd(buf, size);
+ TST_ERR = errno;
+ if (res) {
+ tst_res(TFAIL, "getcwd() succeeded unexpectedly");
+ return;
+ }
+
+ if (TST_ERR != exp_err) {
+ tst_res(TFAIL | TTERRNO, "getcwd() failed unexpectedly, expected %s",
+ tst_strerrno(exp_err));
+ return;
+ }
+
+ tst_res(TPASS | TTERRNO, "getcwd() failed as expected");
+
+}
+
+static void verify_getcwd_raw_syscall(char *buf, size_t size, int exp_err)
+{
+
+ TST_EXP_FAIL2(tst_syscall(__NR_getcwd, buf, size), exp_err);
+}
-static void verify_getcwd(unsigned int n)
+static void verify(void)
{
- struct t_case *tc = &tcases[n];
+ struct getcwd_variants *tv = &variants[tst_variant];
- TST_EXP_FAIL2(tst_syscall(__NR_getcwd, tc->buf, tc->size), tc->exp_err);
+ tv->getcwd(tv->buf, tv->size, tv->exp_err);
}
static struct tst_test test = {
- .tcnt = ARRAY_SIZE(tcases),
- .test = verify_getcwd
+ .test_variants = ARRAY_SIZE(variants),
+ .test_all = verify,
};
--
2.35.3
More information about the ltp
mailing list