@tdd_issue @tdd_issue_7161 Feature: LSP language discovery DoS protection Prevent resource exhaustion attacks via directory traversal limits. Issue #7161: Resource exhaustion DoS in LSP language discovery. # ------------------------------------------------------------------ # Depth limit protection (prevents deep nesting attacks) # ------------------------------------------------------------------ @tdd_issue_7161 Scenario: detect_directory_languages respects max_depth limit Given ldos a LanguageDiscovery instance And ldos a mock directory tree with depth 10 When ldos I detect directory languages with max_depth 5 Then ldos the result is a list @tdd_issue_7161 Scenario: detect_directory_languages allows traversal within max_depth Given ldos a LanguageDiscovery instance And ldos a mock directory tree with depth 3 When ldos I detect directory languages with max_depth 5 Then ldos the result is a list # ------------------------------------------------------------------ # File count limit protection (prevents wide directory attacks) # ------------------------------------------------------------------ @tdd_issue_7161 Scenario: detect_directory_languages respects max_files limit Given ldos a LanguageDiscovery instance And ldos a mock directory with 1000 files When ldos I detect directory languages with max_files 100 Then ldos the result is a list @tdd_issue_7161 Scenario: detect_directory_languages allows processing within max_files Given ldos a LanguageDiscovery instance And ldos a mock directory with 50 files When ldos I detect directory languages with max_files 100 Then ldos the result is a list # ------------------------------------------------------------------ # Symlink loop protection (prevents circular traversal) # ------------------------------------------------------------------ @tdd_issue_7161 Scenario: detect_directory_languages does not follow symlinks Given ldos a LanguageDiscovery instance And ldos a mock directory with symlinks When ldos I detect directory languages Then ldos the result is a list # ------------------------------------------------------------------ # Parameter validation # ------------------------------------------------------------------ @tdd_issue_7161 Scenario: detect_directory_languages rejects invalid max_depth Given ldos a LanguageDiscovery instance When ldos I detect directory languages with max_depth 0 Then ldos a ValueError is raised @tdd_issue_7161 Scenario: detect_directory_languages rejects invalid max_files Given ldos a LanguageDiscovery instance When ldos I detect directory languages with max_files 0 Then ldos a ValueError is raised @tdd_issue_7161 Scenario: detect_directory_languages rejects invalid timeout Given ldos a LanguageDiscovery instance When ldos I detect directory languages with timeout 0.0 Then ldos a ValueError is raised # ------------------------------------------------------------------ # Default parameter values # ------------------------------------------------------------------ @tdd_issue_7161 Scenario: detect_directory_languages uses default limits Given ldos a LanguageDiscovery instance And ldos a mock directory with 100 files When ldos I detect directory languages without explicit limits Then ldos the result is a list # ------------------------------------------------------------------ # Timeout enforcement (prevents indefinite traversal) # ------------------------------------------------------------------ @tdd_issue_7161 Scenario: detect_directory_languages enforces timeout in outer walk loop Given ldos a LanguageDiscovery instance And ldos a mock directory and a clock that exceeds timeout immediately When ldos I detect directory languages without explicit limits Then ldos the result is a list @tdd_issue_7161 Scenario: detect_directory_languages enforces timeout during file iteration Given ldos a LanguageDiscovery instance And ldos a mock directory and a clock that exceeds timeout after first file When ldos I detect directory languages without explicit limits Then ldos the result is a list