wazero icon indicating copy to clipboard operation
wazero copied to clipboard

TestStat: dirNlinkIncludesDot should not necessarily be true

Open QuLogic opened this issue 9 months ago • 1 comments

Describe the bug The number of hard links seems to be defined by the file system. So dirNlinkIncludesDot, which is always true on Linux, is not correct, and causes TestStat to fail sometimes. Instead of hard-coding numbers, it may be best to just start with the existing count on an empty directory, and then check differences when adding/removing files.

To Reproduce Run tests with a btrfs temporary directory, e.g.,

$ TMPDIR=/path/to/btrfs/directory go test ./internal/sysfs
--- FAIL: TestStat (0.00s)
    --- FAIL: TestStat/empty_dir (0.00s)
        require.go:331: expected 2, but was 1: linux
            .../wazero/internal/sysfs/stat_test.go:46
    --- FAIL: TestStat/not_empty_dir (0.00s)
        require.go:331: expected 3, but was 1: linux
            .../wazero/internal/sysfs/stat_test.go:72

and for example, on a btrfs filesystem an empty directory has 1 Link:

$ mkdir foo
$ stat foo
  File: foo
  Size: 0         	Blocks: 0          IO Block: 4096   directory
Device: 0,43	Inode: 183574674   Links: 1
Access: (0755/drwxr-xr-x)  Uid: ( )   Gid: ( )
Context: unconfined_u:object_r:container_file_t:s0
Access: 2025-07-21 05:23:03.222367693 -0400
Modify: 2025-07-21 05:23:03.222367693 -0400
Change: 2025-07-21 05:23:03.222367693 -0400
 Birth: 2025-07-21 05:23:03.222367693 -0400

whereas on /tmp, which is tmpfs, an empty directory has 2 Links:

$ mkdir /tmp/foo
$ stat /tmp/foo
  File: /tmp/foo
  Size: 40        	Blocks: 0          IO Block: 4096   directory
Device: 0,40	Inode: 89168       Links: 2
Access: (0755/drwxr-xr-x)  Uid: ( )   Gid: ( )
Context: unconfined_u:object_r:user_tmp_t:s0
Access: 2025-07-21 05:24:24.626843648 -0400
Modify: 2025-07-21 05:24:24.626843648 -0400
Change: 2025-07-21 05:24:24.626843648 -0400
 Birth: 2025-07-21 05:24:24.626843648 -0400

Expected behavior Tests should pass.

Environment (please complete the relevant information):

  • Go version: go version go1.24.4 linux/amd64
  • wazero Version: v1.9.0
  • Host architecture: amd64
  • Runtime mode: n/a

QuLogic avatar Jul 21 '25 09:07 QuLogic

Oh, and with respect to TestStat/not_empty_dir, subdirectories don't add to the link count either:

$ mkdir foo
$ stat foo
  File: foo
  Size: 0         	Blocks: 0          IO Block: 4096   directory
Device: 0,43	Inode: 183576368   Links: 1
Access: (0755/drwxr-xr-x)  Uid: ( )   Gid: ( )
Context: unconfined_u:object_r:container_file_t:s0
Access: 2025-07-21 05:35:19.882623442 -0400
Modify: 2025-07-21 05:35:19.882623442 -0400
Change: 2025-07-21 05:35:19.882623442 -0400
 Birth: 2025-07-21 05:35:19.882623442 -0400
$ mkdir foo/bar
$ stat foo
  File: foo
  Size: 6         	Blocks: 0          IO Block: 4096   directory
Device: 0,43	Inode: 183576368   Links: 1
Access: (0755/drwxr-xr-x)  Uid: ( )   Gid: ( )
Context: unconfined_u:object_r:container_file_t:s0
Access: 2025-07-21 05:35:19.882623442 -0400
Modify: 2025-07-21 05:35:23.791598201 -0400
Change: 2025-07-21 05:35:23.791598201 -0400
 Birth: 2025-07-21 05:35:19.882623442 -0400

So this is not possible either, at least for added directories:

Instead of hard-coding numbers, it may be best to just start with the existing count on an empty directory, and then check differences when adding/removing files.

QuLogic avatar Jul 21 '25 09:07 QuLogic