summaryrefslogtreecommitdiff
path: root/packages/core/src/utils/bfsFileSearch.test.ts
diff options
context:
space:
mode:
Diffstat (limited to 'packages/core/src/utils/bfsFileSearch.test.ts')
-rw-r--r--packages/core/src/utils/bfsFileSearch.test.ts75
1 files changed, 75 insertions, 0 deletions
diff --git a/packages/core/src/utils/bfsFileSearch.test.ts b/packages/core/src/utils/bfsFileSearch.test.ts
index 63198a8d..3d5a0010 100644
--- a/packages/core/src/utils/bfsFileSearch.test.ts
+++ b/packages/core/src/utils/bfsFileSearch.test.ts
@@ -189,4 +189,79 @@ describe('bfsFileSearch', () => {
expect(result.sort()).toEqual([target1, target2].sort());
});
});
+
+ it('should perform parallel directory scanning efficiently (performance test)', async () => {
+ // Create a more complex directory structure for performance testing
+ console.log('\nšŸš€ Testing Parallel BFS Performance...');
+
+ // Create 50 directories with multiple levels for faster test execution
+ for (let i = 0; i < 50; i++) {
+ await createEmptyDir(`dir${i}`);
+ await createEmptyDir(`dir${i}`, 'subdir1');
+ await createEmptyDir(`dir${i}`, 'subdir2');
+ await createEmptyDir(`dir${i}`, 'subdir1', 'deep');
+ if (i < 10) {
+ // Add target files in some directories
+ await createTestFile('content', `dir${i}`, 'GEMINI.md');
+ await createTestFile('content', `dir${i}`, 'subdir1', 'GEMINI.md');
+ }
+ }
+
+ // Run multiple iterations to ensure consistency
+ const iterations = 3;
+ const durations: number[] = [];
+ let foundFiles = 0;
+ let firstResultSorted: string[] | undefined;
+
+ for (let i = 0; i < iterations; i++) {
+ const searchStartTime = performance.now();
+ const result = await bfsFileSearch(testRootDir, {
+ fileName: 'GEMINI.md',
+ maxDirs: 200,
+ debug: false,
+ });
+ const duration = performance.now() - searchStartTime;
+ durations.push(duration);
+
+ // Verify consistency: all iterations should find the exact same files
+ if (firstResultSorted === undefined) {
+ foundFiles = result.length;
+ firstResultSorted = result.sort();
+ } else {
+ expect(result.sort()).toEqual(firstResultSorted);
+ }
+
+ console.log(`šŸ“Š Iteration ${i + 1}: ${duration.toFixed(2)}ms`);
+ }
+
+ const avgDuration = durations.reduce((a, b) => a + b, 0) / durations.length;
+ const maxDuration = Math.max(...durations);
+ const minDuration = Math.min(...durations);
+
+ console.log(`šŸ“Š Average Duration: ${avgDuration.toFixed(2)}ms`);
+ console.log(
+ `šŸ“Š Min/Max Duration: ${minDuration.toFixed(2)}ms / ${maxDuration.toFixed(2)}ms`,
+ );
+ console.log(`šŸ“ Found ${foundFiles} GEMINI.md files`);
+ console.log(
+ `šŸŽļø Processing ~${Math.round(200 / (avgDuration / 1000))} dirs/second`,
+ );
+
+ // Verify we found the expected files
+ expect(foundFiles).toBe(20); // 10 dirs * 2 files each
+
+ // Performance expectation: check consistency rather than absolute time
+ const variance = maxDuration - minDuration;
+ const consistencyRatio = variance / avgDuration;
+
+ // Ensure reasonable performance (generous limit for CI environments)
+ expect(avgDuration).toBeLessThan(2000); // Very generous limit
+
+ // Ensure consistency across runs (variance should not be too high)
+ expect(consistencyRatio).toBeLessThan(1.5); // Max variance should be less than 150% of average
+
+ console.log(
+ `āœ… Performance test passed: avg=${avgDuration.toFixed(2)}ms, consistency=${(consistencyRatio * 100).toFixed(1)}%`,
+ );
+ });
});