-
Notifications
You must be signed in to change notification settings - Fork 21
Expand file tree
/
Copy pathhidden_dirs_test.go
More file actions
174 lines (151 loc) 路 4.67 KB
/
Copy pathhidden_dirs_test.go
File metadata and controls
174 lines (151 loc) 路 4.67 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
package xlog
import (
"context"
"os"
"path/filepath"
"testing"
"time"
)
// TestHiddenDirectoriesNotScanned verifies that hidden directories like .git
// are properly skipped during page discovery, preventing performance issues.
func TestHiddenDirectoriesNotScanned(t *testing.T) {
tmpDir := t.TempDir()
oldWd, _ := os.Getwd()
if err := os.Chdir(tmpDir); err != nil {
t.Fatalf("Failed to change directory: %v", err)
}
defer func() {
if err := os.Chdir(oldWd); err != nil {
t.Errorf("Failed to restore directory: %v", err)
}
}()
// Create visible pages
visiblePages := []string{
"index.md",
"readme.md",
"docs/guide.md",
"notes/daily.md",
}
for _, path := range visiblePages {
if err := os.MkdirAll(filepath.Dir(path), 0750); err != nil {
t.Fatalf("Failed to create directory for %s: %v", path, err)
}
if err := os.WriteFile(path, []byte("# Test"), 0600); err != nil {
t.Fatalf("Failed to create %s: %v", path, err)
}
}
// Create many files in hidden directories to simulate a large .git
hiddenPages := []string{
".git/objects/file1.md",
".git/objects/file2.md",
".git/refs/file3.md",
".hidden/secret.md",
".cache/data.md",
}
for _, path := range hiddenPages {
if err := os.MkdirAll(filepath.Dir(path), 0750); err != nil {
t.Fatalf("Failed to create hidden directory for %s: %v", path, err)
}
if err := os.WriteFile(path, []byte("# Hidden"), 0600); err != nil {
t.Fatalf("Failed to create %s: %v", path, err)
}
}
// Initialize markdown filesystem
mfs := newMarkdownFS(".")
ctx := context.Background()
start := time.Now()
// Collect all discovered pages
var foundPages []string
mfs.Each(ctx, func(p Page) {
foundPages = append(foundPages, p.Name())
})
elapsed := time.Since(start)
// Verify only visible pages were found
if len(foundPages) != len(visiblePages) {
t.Errorf("Expected %d pages, got %d. Found: %v", len(visiblePages), len(foundPages), foundPages)
}
expectedNames := map[string]bool{
"index": true,
"readme": true,
"docs/guide": true,
"notes/daily": true,
}
for _, name := range foundPages {
if !expectedNames[name] {
t.Errorf("Found unexpected page: %q", name)
}
}
// Verify hidden directory pages were NOT found
hiddenNames := []string{
".git/objects/file1",
".git/objects/file2",
".git/refs/file3",
".hidden/secret",
".cache/data",
}
for _, hidden := range hiddenNames {
for _, found := range foundPages {
if found == hidden {
t.Errorf("Should not have found page in hidden directory: %q", hidden)
}
}
}
// Performance check: should be fast even with hidden directories
// This is a sanity check - with proper filtering, 4 pages should scan in < 100ms
if elapsed > 100*time.Millisecond {
t.Logf("WARNING: Page discovery took %v (expected < 100ms)", elapsed)
}
}
// TestHiddenDirectoriesPerformance benchmarks page discovery with and without hidden directories.
func TestHiddenDirectoriesPerformance(t *testing.T) {
// Create scenario with many files in .git
tmpDir := t.TempDir()
oldWd, _ := os.Getwd()
if err := os.Chdir(tmpDir); err != nil {
t.Fatalf("Failed to change directory: %v", err)
}
defer func() {
if err := os.Chdir(oldWd); err != nil {
t.Errorf("Failed to restore directory: %v", err)
}
}()
// Create 10 visible pages
for i := 0; i < 10; i++ {
filename := filepath.Join("docs", "page"+string(rune('0'+i))+".md")
if err := os.MkdirAll(filepath.Dir(filename), 0750); err != nil {
t.Fatalf("Failed to create directory: %v", err)
}
if err := os.WriteFile(filename, []byte("# Test"), 0600); err != nil {
t.Fatalf("Failed to create %s: %v", filename, err)
}
}
// Create 100 files in .git to simulate a real repository
for i := 0; i < 100; i++ {
filename := filepath.Join(".git", "objects", "file"+string(rune('0'+(i%10)))+".md")
if err := os.MkdirAll(filepath.Dir(filename), 0750); err != nil {
t.Fatalf("Failed to create .git directory: %v", err)
}
if err := os.WriteFile(filename, []byte("# Git Object"), 0600); err != nil {
t.Fatalf("Failed to create %s: %v", filename, err)
}
}
mfs := newMarkdownFS(".")
ctx := context.Background()
start := time.Now()
count := 0
mfs.Each(ctx, func(p Page) {
count++
})
elapsed := time.Since(start)
// Should find exactly 10 visible pages
if count != 10 {
t.Errorf("Expected 10 pages, got %d", count)
}
// Log performance for visibility
t.Logf("Scanned %d pages in %v (with 100 files in .git directory)", count, elapsed)
// With proper filtering, this should be very fast
// Even 50ms is generous for just 10 files
if elapsed > 50*time.Millisecond {
t.Errorf("Page discovery too slow: %v (expected < 50ms). Hidden directories may not be properly skipped.", elapsed)
}
}