Skip to content

Commit 5376de9

Browse files
authored
Fix test failures on macOS by resolving symlinks in allowed directories (#38)
1 parent ddac298 commit 5376de9

File tree

1 file changed

+23
-4
lines changed

1 file changed

+23
-4
lines changed

filesystemserver/handler_test.go

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ func TestReadfile_Valid(t *testing.T) {
1919
err := os.WriteFile(filepath.Join(dir, "test"), []byte(content), 0644)
2020
require.NoError(t, err)
2121

22-
handler, err := NewFilesystemHandler([]string{dir})
22+
handler, err := NewFilesystemHandler(resolveAllowedDirs(t, dir))
2323
require.NoError(t, err)
2424
request := mcp.CallToolRequest{}
2525
request.Params.Name = "read_file"
@@ -35,7 +35,7 @@ func TestReadfile_Valid(t *testing.T) {
3535

3636
func TestReadfile_Invalid(t *testing.T) {
3737
dir := t.TempDir()
38-
handler, err := NewFilesystemHandler([]string{dir})
38+
handler, err := NewFilesystemHandler(resolveAllowedDirs(t, dir))
3939
require.NoError(t, err)
4040

4141
request := mcp.CallToolRequest{}
@@ -54,7 +54,7 @@ func TestReadfile_NoAccess(t *testing.T) {
5454
dir1 := t.TempDir()
5555
dir2 := t.TempDir()
5656

57-
handler, err := NewFilesystemHandler([]string{dir1})
57+
handler, err := NewFilesystemHandler(resolveAllowedDirs(t, dir1))
5858
require.NoError(t, err)
5959

6060
request := mcp.CallToolRequest{}
@@ -100,7 +100,7 @@ func TestSearchFiles_Pattern(t *testing.T) {
100100
err = os.WriteFile(foo_test_c, []byte("foo"), 0644)
101101
require.NoError(t, err)
102102

103-
handler, err := NewFilesystemHandler([]string{dir})
103+
handler, err := NewFilesystemHandler(resolveAllowedDirs(t, dir))
104104
require.NoError(t, err)
105105

106106
tests := []struct {
@@ -133,3 +133,22 @@ func TestSearchFiles_Pattern(t *testing.T) {
133133
})
134134
}
135135
}
136+
137+
// resolveAllowedDirs generates a list of allowed paths, including their resolved symlinks.
138+
// This ensures both the original paths and their symlink-resolved counterparts are included,
139+
// which is useful when paths may be symlinks (e.g., t.TempDir() on some Unix systems).
140+
func resolveAllowedDirs(t *testing.T, dirs ...string) []string {
141+
t.Helper()
142+
allowedDirs := make([]string, 0)
143+
for _, dir := range dirs {
144+
allowedDirs = append(allowedDirs, dir)
145+
146+
resolvedPath, err := filepath.EvalSymlinks(dir)
147+
require.NoError(t, err, "Failed to resolve symlinks for directory: %s", dir)
148+
149+
if resolvedPath != dir {
150+
allowedDirs = append(allowedDirs, resolvedPath)
151+
}
152+
}
153+
return allowedDirs
154+
}

0 commit comments

Comments
 (0)