Add additional symlink tests for Stat

Adds additional symlink-related tests for FSTestOSWrapper's Stat().

Bug: 436025865
Change-Id: I7c645319873e0f1fe19ede8dd1c3e934d9febf66
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/276883
Reviewed-by: Ryan Harrison <rharrison@chromium.org>
Commit-Queue: Brian Sheedy <bsheedy@google.com>
diff --git a/tools/src/oswrapper/fstestoswrapper_stat_test.go b/tools/src/oswrapper/fstestoswrapper_stat_test.go
index df1b441..c8c4156 100644
--- a/tools/src/oswrapper/fstestoswrapper_stat_test.go
+++ b/tools/src/oswrapper/fstestoswrapper_stat_test.go
@@ -152,6 +152,53 @@
 				wantErrIs: syscall.ELOOP,
 			},
 		},
+		{
+			name: "Stat absolute symlink",
+			path: filepath.Join(root, "abs_link"),
+			setup: unittestSetup{
+				initialFiles: map[string]string{filepath.Join(root, "file.txt"): "content"},
+				initialSymlinks: map[string]string{
+					filepath.Join(root, "abs_link"): filepath.Join(root, "file.txt"),
+				},
+			},
+			verify: func(t *testing.T, info os.FileInfo) {
+				require.False(t, info.IsDir())
+				require.Equal(t, "abs_link", info.Name())
+				require.Equal(t, int64(7), info.Size())
+			},
+		},
+		{
+			name: "Stat symlink to parent",
+			path: filepath.Join(root, "subdir", "link"),
+			setup: unittestSetup{
+				initialFiles: map[string]string{filepath.Join(root, "file.txt"): "content"},
+				initialDirs:  []string{filepath.Join(root, "subdir")},
+				initialSymlinks: map[string]string{
+					filepath.Join(root, "subdir", "link"): "../file.txt",
+				},
+			},
+			verify: func(t *testing.T, info os.FileInfo) {
+				require.False(t, info.IsDir())
+				require.Equal(t, "link", info.Name())
+				require.Equal(t, int64(7), info.Size())
+			},
+		},
+		{
+			name: "Stat through symlink path component",
+			path: filepath.Join(root, "link_dir", "file.txt"),
+			setup: unittestSetup{
+				initialFiles: map[string]string{filepath.Join(root, "subdir", "file.txt"): "content"},
+				initialDirs:  []string{filepath.Join(root, "subdir")},
+				initialSymlinks: map[string]string{
+					filepath.Join(root, "link_dir"): "subdir",
+				},
+			},
+			verify: func(t *testing.T, info os.FileInfo) {
+				require.False(t, info.IsDir())
+				require.Equal(t, "file.txt", info.Name())
+				require.Equal(t, int64(7), info.Size())
+			},
+		},
 	}
 
 	for _, tc := range tests {
@@ -241,6 +288,39 @@
 			}},
 			path: "loop1",
 		},
+		{
+			name: "Stat symlink chain",
+			setup: matchesRealSetup{unittestSetup{
+				initialFiles: map[string]string{"file.txt": "content"},
+				initialSymlinks: map[string]string{
+					"link1": "link2",
+					"link2": "file.txt",
+				},
+			}},
+			path: "link1",
+		},
+		{
+			name: "Stat symlink to parent",
+			setup: matchesRealSetup{unittestSetup{
+				initialFiles: map[string]string{"file.txt": "content"},
+				initialDirs:  []string{"subdir"},
+				initialSymlinks: map[string]string{
+					"subdir/link": "../file.txt",
+				},
+			}},
+			path: "subdir/link",
+		},
+		{
+			name: "Stat through symlink path component",
+			setup: matchesRealSetup{unittestSetup{
+				initialFiles: map[string]string{"subdir/file.txt": "content"},
+				initialDirs:  []string{"subdir"},
+				initialSymlinks: map[string]string{
+					"link_dir": "subdir",
+				},
+			}},
+			path: "link_dir/file.txt",
+		},
 	}
 
 	for _, tc := range tests {