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
Add Behave feature/step pairs that exercise uncovered branches across handlers, LSP, CLI, and service layers to reach the coverage gate. ISSUES CLOSED: #1232
233 lines
12 KiB
Gherkin
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
|