Re: [PATCH] selftests: Add kselftest framework to the testfile

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 10/24/24 10:55, Shivam Chaudhary wrote:
This patch updates the existing test that checks
for `open(O_TMPFILE)` and `linkat()` behaviors in
mount namespaces to use the kselftest framework.

This includes the following changes:

- Replaced direct error handling with
  `ksft_test_result_*` macros for better reporting
   of test outcomes.

Replace


- Added `ksft_print_header()` and `ksft_set_plan()`
  to structure test outputs more effectively.

- Introduced the helper function `is_unshare()` to
   handle unshare-related checks.


Introduce

- Improved the test flow by adding more detailed pass/fail
   reporting for unshare, mounting, file opening, and linking
   operations.

Improve


- Skips the test if it's not run as root, providing an
   appropriate Warning.

Check submitting patches document for details how to write
short log and change log that hep reviewers.

Also - you haven't cc'ed the right mailing lists. Send v2
cc'ing kselftest mailing list and correcting the short
log and change log problems.



Test logs:

Before change:

- Withou root
  error: unshare, errno 1

- With root
  No, output

After change:

- Without root
  TAP version 13
  1..1
  ok 1 # SKIP This test needs root to ru

- With root
  TAP version 13
  1..1
  ok 1 unshare(): we have a new mount namespace.
  1..2
  ok 2 mount(): Root filesystem private mount: Success
  1..3
  ok 3 mount(): Mounting tmpfs on /tmp: Success
  1..4
  ok 4 openat(): Open first temporary file: Success
  1..5
  ok 5 linkat(): Linking the temporary file: Success
  1..6
  ok 6 openat(): Opening the second temporary file: Success
  # Totals: pass:6 fail:0 xfail:0 xpass:0 skip:0 error:0

Signed-off-by: Shivam Chaudhary <cvam0000@xxxxxxxxx>
---
  .../selftests/tmpfs/bug-link-o-tmpfile.c      | 72 +++++++++++++++----
  1 file changed, 58 insertions(+), 14 deletions(-)

diff --git a/tools/testing/selftests/tmpfs/bug-link-o-tmpfile.c b/tools/testing/selftests/tmpfs/bug-link-o-tmpfile.c
index b5c3ddb90942..26dea19c1614 100644
--- a/tools/testing/selftests/tmpfs/bug-link-o-tmpfile.c
+++ b/tools/testing/selftests/tmpfs/bug-link-o-tmpfile.c
@@ -23,45 +23,89 @@
  #include <sys/mount.h>
  #include <unistd.h>
-int main(void)
-{
-	int fd;
+#include "../kselftest.h"
- if (unshare(CLONE_NEWNS) == -1) {
+static int is_unshare(int flag)
+{
+	if (unshare(flag) == -1) {
  		if (errno == ENOSYS || errno == EPERM) {
-			fprintf(stderr, "error: unshare, errno %d\n", errno);
-			return 4;
+			ksft_test_result_fail("error: unshare, errno %d\n", errno);
+			return -1; // Return -1 for failure
  		}
  		fprintf(stderr, "error: unshare, errno %d\n", errno);
+		return -1;
+	}
+
+	return 0; // Return 0 for success
+}
+
+int main(void)
+{
+	int fd;
+
+	// Setting up kselftest framework
+	ksft_print_header();
+	ksft_set_plan(1);
+
+	// Check if test is run as root
+	if (geteuid()) {
+		ksft_test_result_skip("This test needs root to run!\n");
  		return 1;
  	}
-	if (mount(NULL, "/", NULL, MS_PRIVATE|MS_REC, NULL) == -1) {
-		fprintf(stderr, "error: mount '/', errno %d\n", errno);
+
+	if (is_unshare(CLONE_NEWNS) == 0) {
+		ksft_test_result_pass("unshare(): we have a new mount namespace.\n");
+	} else {
+		ksft_test_result_fail("unshare(): failed\n");
  		return 1;
  	}
+ ksft_set_plan(2);
+
+	if (mount(NULL, "/", NULL, MS_PRIVATE | MS_REC, NULL) == -1) {
+		ksft_test_result_fail("mount(): Root filesystem private mount: Fail %d\n", errno);
+		return 1;
+	} else {
+		ksft_test_result_pass("mount(): Root filesystem private mount: Success\n");
+	}
+
+	ksft_set_plan(3);
  	/* Our heroes: 1 root inode, 1 O_TMPFILE inode, 1 permanent inode. */
  	if (mount(NULL, "/tmp", "tmpfs", 0, "nr_inodes=3") == -1) {
-		fprintf(stderr, "error: mount tmpfs, errno %d\n", errno);
+		ksft_test_result_fail("mount(): Mounting tmpfs on /tmp: Fail %d\n", errno);
  		return 1;
+	} else {
+		ksft_test_result_pass("mount(): Mounting tmpfs on /tmp: Success\n");
  	}
- fd = openat(AT_FDCWD, "/tmp", O_WRONLY|O_TMPFILE, 0600);
+	ksft_set_plan(4);
+	fd = openat(AT_FDCWD, "/tmp", O_WRONLY | O_TMPFILE, 0600);
  	if (fd == -1) {
-		fprintf(stderr, "error: open 1, errno %d\n", errno);
+		ksft_test_result_fail("openat(): Open first temporary file: Fail %d\n", errno);
  		return 1;
+	} else {
+		ksft_test_result_pass("openat(): Open first temporary file: Success\n");
  	}
+
+	ksft_set_plan(5);
  	if (linkat(fd, "", AT_FDCWD, "/tmp/1", AT_EMPTY_PATH) == -1) {
-		fprintf(stderr, "error: linkat, errno %d\n", errno);
+		ksft_test_result_fail("linkat(): Linking the temporary file: Fail %d\n", errno);
+		close(fd); // Ensure fd is closed on failure
  		return 1;
+	} else {
+		ksft_test_result_pass("linkat(): Linking the temporary file: Success\n");
  	}
  	close(fd);
- fd = openat(AT_FDCWD, "/tmp", O_WRONLY|O_TMPFILE, 0600);
+	ksft_set_plan(6);
+	fd = openat(AT_FDCWD, "/tmp", O_WRONLY | O_TMPFILE, 0600);
  	if (fd == -1) {
-		fprintf(stderr, "error: open 2, errno %d\n", errno);
+		ksft_test_result_fail("openat(): Opening the second temporary file: Fail %d\n", errno);
  		return 1;
+	} else {
+		ksft_test_result_pass("openat(): Opening the second temporary file: Success\n");
  	}
+ ksft_exit_pass();
  	return 0;
  }





[Index of Archives]     [Linux Wireless]     [Linux Kernel]     [ATH6KL]     [Linux Bluetooth]     [Linux Netdev]     [Kernel Newbies]     [Share Photos]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Samba]     [Device Mapper]

  Powered by Linux