Files
cleveragents-core/features/lsp_discovery_dos_protection.feature
HAL9000 f8f5f2f3f4
CI / lint (pull_request) Successful in 59s
CI / typecheck (pull_request) Successful in 1m8s
CI / push-validation (pull_request) Successful in 38s
CI / build (pull_request) Successful in 52s
CI / helm (pull_request) Successful in 56s
CI / security (pull_request) Successful in 1m18s
CI / quality (pull_request) Successful in 1m14s
CI / unit_tests (pull_request) Successful in 5m40s
CI / docker (pull_request) Successful in 1m36s
CI / integration_tests (pull_request) Successful in 8m59s
CI / coverage (pull_request) Successful in 9m27s
CI / status-check (pull_request) Successful in 4s
test(lsp): cover timeout branches in detect_directory_languages
Add two BDD scenarios that mock os.walk and the time module so the
outer-loop and inner-file-loop timeout-exceeded branches in
detect_directory_languages() are deterministically exercised. Closes
the diff-coverage gap on src/cleveragents/lsp/discovery.py lines
250-257 (outer-loop timeout warning + break) and 284-291 (inner-loop
timeout warning + break) which the previous DoS protection scenarios
did not reach.

Refs: #7161
2026-06-14 20:39:38 -04:00

104 lines
4.2 KiB
Gherkin

@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