Files
cleveragents-core/features/overlay_sandbox_coverage_r3.feature
freemo 31472b5413
CI / benchmark-publish (pull_request) Has been skipped
CI / build (pull_request) Successful in 21s
CI / helm (pull_request) Successful in 22s
CI / lint (pull_request) Successful in 3m20s
CI / quality (pull_request) Successful in 3m43s
CI / typecheck (pull_request) Successful in 3m58s
CI / security (pull_request) Successful in 4m8s
CI / integration_tests (pull_request) Successful in 9m33s
CI / unit_tests (pull_request) Successful in 10m12s
CI / docker (pull_request) Successful in 1m28s
CI / coverage (pull_request) Successful in 12m18s
CI / e2e_tests (pull_request) Successful in 19m51s
CI / status-check (pull_request) Successful in 1s
CI / build (push) Successful in 15s
CI / helm (push) Successful in 22s
CI / lint (push) Successful in 3m18s
CI / quality (push) Successful in 3m41s
CI / typecheck (push) Successful in 3m57s
CI / benchmark-regression (push) Has been skipped
CI / security (push) Successful in 4m10s
CI / unit_tests (push) Failing after 6m58s
CI / docker (push) Has been skipped
CI / integration_tests (push) Successful in 9m15s
CI / coverage (push) Successful in 12m26s
CI / e2e_tests (push) Successful in 23m11s
CI / status-check (push) Failing after 1s
CI / benchmark-publish (push) Successful in 28m31s
CI / benchmark-regression (pull_request) Successful in 54m53s
test(coverage): add Behave scenarios for 39 under-covered modules
Add Behave feature/step pairs that exercise uncovered branches across handlers, LSP, CLI, and service layers to reach the coverage gate.

ISSUES CLOSED: #1232
2026-03-31 21:47:12 +00:00

233 lines
12 KiB
Gherkin

Feature: Overlay sandbox coverage round 3
Additional BDD scenarios exercising uncovered lines in overlay.py,
including _is_overlayfs_available, real overlay mode, _mount_overlay,
_unmount_overlay, commit/rollback error paths, and cleanup edge cases.
# ===================================================================
# Group 1: _is_overlayfs_available() lines 49, 51-53, 58-79
# ===================================================================
Scenario: oscov3 overlayfs unavailable when overlay not in proc filesystems
Given oscov3 the lru_cache for _is_overlayfs_available is cleared
And oscov3 /proc/filesystems is mocked to contain "nofilesystem ext4"
When oscov3 _is_overlayfs_available is called
Then oscov3 the result should be False
Scenario: oscov3 overlayfs unavailable when proc filesystems is not a file
Given oscov3 the lru_cache for _is_overlayfs_available is cleared
And oscov3 os.path.isfile is mocked to return False for /proc/filesystems
When oscov3 _is_overlayfs_available is called
Then oscov3 the result should be False
Scenario: oscov3 overlayfs unavailable when reading proc filesystems raises OSError
Given oscov3 the lru_cache for _is_overlayfs_available is cleared
And oscov3 open is mocked to raise OSError for /proc/filesystems
When oscov3 _is_overlayfs_available is called
Then oscov3 the result should be False
Scenario: oscov3 overlayfs probe succeeds when mount returns zero
Given oscov3 the lru_cache for _is_overlayfs_available is cleared
And oscov3 the system is mocked as root with overlay in proc filesystems
And oscov3 subprocess.run is mocked for successful mount probe
When oscov3 _is_overlayfs_available is called
Then oscov3 the result should be True
Scenario: oscov3 overlayfs probe fails when mount returns non-zero
Given oscov3 the lru_cache for _is_overlayfs_available is cleared
And oscov3 the system is mocked as root with overlay in proc filesystems
And oscov3 subprocess.run is mocked for failed mount probe
When oscov3 _is_overlayfs_available is called
Then oscov3 the result should be False
Scenario: oscov3 overlayfs probe returns False on OSError
Given oscov3 the lru_cache for _is_overlayfs_available is cleared
And oscov3 the system is mocked as root with overlay in proc filesystems
And oscov3 subprocess.run is mocked to raise OSError during probe
When oscov3 _is_overlayfs_available is called
Then oscov3 the result should be False
Scenario: oscov3 overlayfs probe returns False on TimeoutExpired
Given oscov3 the lru_cache for _is_overlayfs_available is cleared
And oscov3 the system is mocked as root with overlay in proc filesystems
And oscov3 subprocess.run is mocked to raise TimeoutExpired during probe
When oscov3 _is_overlayfs_available is called
Then oscov3 the result should be False
# ===================================================================
# Group 2: Real overlay in create — line 180
# ===================================================================
Scenario: oscov3 create with real overlay calls _mount_overlay
Given oscov3 a test directory is initialised
And oscov3 a sandbox is created with _use_real_overlay forced to True
And oscov3 _mount_overlay is mocked to succeed
When oscov3 the sandbox create is called for plan "plan-real-ov"
Then oscov3 the sandbox should be in "created" state
And oscov3 _mount_overlay should have been called
# ===================================================================
# Group 3: Commit edge cases — lines 283, 309-311, 343-348
# ===================================================================
Scenario: oscov3 commit with merged_dir None raises SandboxStateError
Given oscov3 a test directory is initialised
And oscov3 a sandbox is created and activated for plan "plan-commit-none"
And oscov3 merged_dir is forced to None
When oscov3 commit is attempted
Then oscov3 a SandboxStateError should have been raised with "merged directory not set"
Scenario: oscov3 commit backup_directory failure cleans up temp dir
Given oscov3 a test directory is initialised
And oscov3 a sandbox is created and activated for plan "plan-backup-fail"
And oscov3 a file "trigger.txt" is added to the sandbox
And oscov3 backup_directory is mocked to raise RuntimeError
When oscov3 commit is attempted
Then oscov3 a SandboxCommitError should have been raised
And oscov3 the sandbox should be in "errored" state
Scenario: oscov3 commit fails and safe_restore also fails logs warning
Given oscov3 a test directory is initialised
And oscov3 a sandbox is created and activated for plan "plan-double-fail"
And oscov3 a file "trigger.txt" is added to the sandbox
And oscov3 copy2 is mocked to fail after backup succeeds
And oscov3 safe_restore is mocked to raise RuntimeError
When oscov3 commit is attempted
Then oscov3 a SandboxCommitError should have been raised
And oscov3 the sandbox should be in "errored" state
# ===================================================================
# Group 4: Rollback edge cases — lines 402, 436-459, 471-479, 498-499
# ===================================================================
Scenario: oscov3 rollback with merged_dir None raises SandboxStateError
Given oscov3 a test directory is initialised
And oscov3 a sandbox is created and activated for plan "plan-rb-none"
And oscov3 merged_dir is forced to None
When oscov3 rollback is attempted
Then oscov3 a SandboxStateError should have been raised with "merged directory not set"
Scenario: oscov3 rollback from COMMITTED with real overlay happy path
Given oscov3 a test directory is initialised
And oscov3 a sandbox is created and activated for plan "plan-rb-real"
And oscov3 _use_real_overlay is forced to True
And oscov3 a file "data.txt" is added to the sandbox
And oscov3 the sandbox is committed successfully
And oscov3 subprocess.run is mocked for umount and mount during rollback
When oscov3 rollback is called
Then oscov3 the sandbox should be in "rolled_back" state
Scenario: oscov3 rollback from COMMITTED real overlay umount fails
Given oscov3 a test directory is initialised
And oscov3 a sandbox is created and activated for plan "plan-rb-umount-fail"
And oscov3 _use_real_overlay is forced to True
And oscov3 a file "data.txt" is added to the sandbox
And oscov3 the sandbox is committed successfully
And oscov3 subprocess.run is mocked to raise CalledProcessError for umount
When oscov3 rollback is attempted
Then oscov3 a SandboxRollbackError should have been raised
And oscov3 the sandbox should be in "errored" state
Scenario: oscov3 rollback from ACTIVE with real overlay
Given oscov3 a test directory is initialised
And oscov3 a sandbox is created and activated for plan "plan-rb-active-real"
And oscov3 _use_real_overlay is forced to True
And oscov3 subprocess.run is mocked for unmount and mount during active rollback
When oscov3 rollback is called
Then oscov3 the sandbox should be in "rolled_back" state
# ===================================================================
# Group 5: Cleanup — lines 532, 539-541
# ===================================================================
Scenario: oscov3 cleanup with real overlay calls _unmount_overlay
Given oscov3 a test directory is initialised
And oscov3 a sandbox is created for plan "plan-cleanup-real"
And oscov3 _use_real_overlay is forced to True
And oscov3 _unmount_overlay is mocked
When oscov3 cleanup is called
Then oscov3 the sandbox should be in "cleaned_up" state
And oscov3 _unmount_overlay should have been called
Scenario: oscov3 cleanup removes pre_commit_backup
Given oscov3 a test directory is initialised
And oscov3 a sandbox is created for plan "plan-cleanup-backup"
And oscov3 a pre_commit_backup directory exists
When oscov3 cleanup is called
Then oscov3 the sandbox should be in "cleaned_up" state
And oscov3 pre_commit_backup should be None
Scenario: oscov3 cleanup removes pre_commit_backup even if dir missing
Given oscov3 a test directory is initialised
And oscov3 a sandbox is created for plan "plan-cleanup-backup2"
And oscov3 pre_commit_backup is set to a non-existent path
When oscov3 cleanup is called
Then oscov3 the sandbox should be in "cleaned_up" state
And oscov3 pre_commit_backup should be None
# ===================================================================
# Group 6: _mount_overlay / _unmount_overlay — lines 562-618
# ===================================================================
Scenario: oscov3 _mount_overlay raises error when path contains comma
Given oscov3 a test directory is initialised
And oscov3 a sandbox is created for plan "plan-comma"
And oscov3 _original_path contains a comma
When oscov3 _mount_overlay is called directly
Then oscov3 a SandboxCreationError should have been raised with "comma"
Scenario: oscov3 _mount_overlay raises error when upper_dir contains comma
Given oscov3 a test directory is initialised
And oscov3 a sandbox is created for plan "plan-comma-upper"
And oscov3 _upper_dir contains a comma
When oscov3 _mount_overlay is called directly
Then oscov3 a SandboxCreationError should have been raised with "comma"
Scenario: oscov3 _mount_overlay succeeds with mocked subprocess
Given oscov3 a test directory is initialised
And oscov3 a sandbox is created for plan "plan-mount-ok"
And oscov3 subprocess.run is mocked for successful mount
When oscov3 _mount_overlay is called directly
Then oscov3 no error should have been raised
Scenario: oscov3 _mount_overlay fails with CalledProcessError
Given oscov3 a test directory is initialised
And oscov3 a sandbox is created for plan "plan-mount-fail"
And oscov3 subprocess.run is mocked to raise CalledProcessError for mount
When oscov3 _mount_overlay is called directly
Then oscov3 a SandboxCreationError should have been raised with "Failed to mount"
Scenario: oscov3 _mount_overlay fails with TimeoutExpired
Given oscov3 a test directory is initialised
And oscov3 a sandbox is created for plan "plan-mount-timeout"
And oscov3 subprocess.run is mocked to raise TimeoutExpired for mount
When oscov3 _mount_overlay is called directly
Then oscov3 a SandboxCreationError should have been raised with "Failed to mount"
Scenario: oscov3 _mount_overlay fails with OSError
Given oscov3 a test directory is initialised
And oscov3 a sandbox is created for plan "plan-mount-oserr"
And oscov3 subprocess.run is mocked to raise OSError for mount
When oscov3 _mount_overlay is called directly
Then oscov3 a SandboxCreationError should have been raised with "Failed to mount"
Scenario: oscov3 _unmount_overlay succeeds
Given oscov3 a test directory is initialised
And oscov3 a sandbox is created for plan "plan-umount-ok"
And oscov3 subprocess.run is mocked for successful umount
When oscov3 _unmount_overlay is called directly
Then oscov3 no error should have been raised
Scenario: oscov3 _unmount_overlay fails and logs warning
Given oscov3 a test directory is initialised
And oscov3 a sandbox is created for plan "plan-umount-fail"
And oscov3 subprocess.run is mocked to raise CalledProcessError for umount
When oscov3 _unmount_overlay is called directly
Then oscov3 no error should have been raised
Scenario: oscov3 _unmount_overlay with merged_dir None is a no-op
Given oscov3 a test directory is initialised
And oscov3 a sandbox is created for plan "plan-umount-none"
And oscov3 merged_dir is forced to None
When oscov3 _unmount_overlay is called directly
Then oscov3 no error should have been raised