Fix backup recovery when primary progress save is missing
This commit is contained in:
@@ -146,6 +146,19 @@ try {
|
||||
Adb @('logcat','-d','-s','Unity','AndroidRuntime') | Set-Content -LiteralPath (Join-Path $EvidenceDir 'android-runtime.log') -Encoding utf8
|
||||
$runtime=Get-Content -LiteralPath (Join-Path $EvidenceDir 'android-runtime.log') -Raw
|
||||
Check 'actual-write-errors-logged' ($runtime -match '\[ProgressSave\].*(denied|directory|UnauthorizedAccess|Access)') 'Actual filesystem error in developer log'
|
||||
# Missing primary must restore the whole backup, including both unfinished boards and latest Free.
|
||||
Adb @('shell','am','force-stop',$package) | Out-Null
|
||||
$missingExpected=Save 'missing-primary-valid-backup-before'
|
||||
Check 'missing-primary-fixture-full-state' ($missingExpected.puzzleStates.Count -eq 2 -and $null -ne $missingExpected.latestFreePlay -and @($missingExpected.puzzleStates | Where-Object stageId -eq 2)[0].countedBallIds.Count -eq 1) 'Actual two unfinished boards, positive partial count and latest Free retained'
|
||||
Adb @('push',(Join-Path $EvidenceDir 'missing-primary-valid-backup-before.json'),($remote+'.bak')) | Out-Null
|
||||
Adb @('shell','rm',$remote) | Out-Null
|
||||
Step 'missing-primary-valid-backup-home-notice' @('shell','am','start','-W','-n',$activity) 6500
|
||||
$missingLoadLog=Adb @('logcat','-d','-s','Unity','AndroidRuntime')
|
||||
$missingLoadLog | Set-Content -LiteralPath (Join-Path $EvidenceDir 'missing-primary-valid-load.log') -Encoding utf8
|
||||
Check 'missing-primary-valid-recovery-logged' ($missingLoadLog -match '\[ProgressLoad\] Recovered valid backup:') 'Backup-only recovery reaches existing recovery notice branch'
|
||||
Step 'missing-primary-valid-backup-free' @('shell','input','tap','1200','810')
|
||||
Check 'missing-primary-valid-backup-whole-restore' (Same $missingExpected (Save 'missing-primary-valid-backup-after')) 'Every saved field restores from backup alone'
|
||||
Step 'missing-primary-valid-backup-home' @('shell','input','tap','312','108')
|
||||
SelectStage 'two-final-count' 2; $secondCount=Save 'two-before-final-count'; $secondBoard=@($secondCount.puzzleStates | Where-Object stageId -eq 2)[0]
|
||||
$uncounted=@($secondBoard.balls | Where-Object {$secondBoard.countedBallIds -notcontains $_.id})[0]
|
||||
$countAudio=RecordAudio 'audio-stage-two-final-count' 8
|
||||
@@ -177,6 +190,18 @@ try {
|
||||
Check 'both-damage-forensic-preserved' ((Adb @('shell','cat',($remote+'.damaged-*'))) -match 'damaged-both-primary' -and (Adb @('shell','cat',($remote+'.bak'))) -eq 'damaged-both-backup') 'Primary forensic and damaged backup retained'
|
||||
Step 'both-damage-second-normal-save' @('shell','input','tap','1200','562'); $secondInitial=Save 'both-damaged-second-initial'
|
||||
Check 'both-damage-two-normal-saves-forensic-preserved' ((Adb @('shell','cat',($remote+'.damaged-*'))) -match 'damaged-both-primary' -and (Adb @('shell','cat',($remote+'.bak.damaged-*'))) -match 'damaged-both-backup' -and $secondInitial.puzzleStates.Count -eq 1) 'Both distinct damaged byte strings survive two successful normal writes'
|
||||
Adb @('shell','am','force-stop',$package) | Out-Null
|
||||
[IO.File]::WriteAllText($badBackup,'damaged-backup-only'); Adb @('push',$badBackup,($remote+'.bak')) | Out-Null
|
||||
Adb @('shell','rm',$remote) | Out-Null; Adb @('logcat','-c') | Out-Null
|
||||
Step 'missing-primary-invalid-backup-home-notice' @('shell','am','start','-W','-n',$activity) 6500
|
||||
Check 'missing-primary-invalid-original-preserved-on-load' ((Adb @('shell','cat',($remote+'.bak'))) -eq 'damaged-backup-only' -and (Adb @('shell','ls',($remote+'*'))) -notmatch '(?m)/progress\.json$') 'Invalid backup bytes remain and no primary is created by failed load'
|
||||
$invalidLoadLog=Adb @('logcat','-d','-s','Unity','AndroidRuntime')
|
||||
$invalidLoadLog | Set-Content -LiteralPath (Join-Path $EvidenceDir 'missing-primary-invalid-load.log') -Encoding utf8
|
||||
Check 'missing-primary-invalid-read-failure-logged' ($invalidLoadLog -match '\[ProgressLoad\] Invalid primary and backup:') 'Backup-only damage is recorded as read failure'
|
||||
Step 'missing-primary-invalid-new-selection' @('shell','input','tap','1200','616'); $missingInitial=Save 'missing-primary-invalid-first-save'
|
||||
Check 'missing-primary-invalid-normal-initial' ($missingInitial.completedStageIds.Count -eq 0 -and $missingInitial.puzzleStates.Count -eq 0 -and $missingInitial.seenTutorialIds.Count -eq 0 -and $null -eq $missingInitial.latestFreePlay) 'Invalid backup alone enters normal fresh progress'
|
||||
Step 'missing-primary-invalid-second-save' @('shell','input','tap','1200','562'); $missingSecond=Save 'missing-primary-invalid-second-save'
|
||||
Check 'missing-primary-invalid-two-saves-forensic-preserved' ((Adb @('shell','cat',($remote+'.bak.damaged-*'))) -match 'damaged-backup-only' -and $missingSecond.puzzleStates.Count -eq 1) 'Distinct backup-only damage survives two successful saves'
|
||||
$result.sourceCommitEnd=(& git rev-parse HEAD); $result.sourceDirtyEnd=[bool](& git status --porcelain)
|
||||
Check 'clean-source-end' (!$result.sourceDirtyEnd -and $result.sourceCommitEnd -eq $result.sourceCommit) $result.sourceCommitEnd
|
||||
$result.status='passed'
|
||||
|
||||
Reference in New Issue
Block a user