Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 13 additions & 6 deletions lib/library_update/bloc/library_update_bloc.dart
Original file line number Diff line number Diff line change
Expand Up @@ -246,12 +246,19 @@ class LibraryUpdateBloc extends Bloc<LibraryUpdateEvent, LibraryUpdateState> {
} catch (e, st) {
if (_isStale(opId)) return;
_logUpdateError('applyDeltaPlan', e, st);
// אי-התאמת hash הופכת את מסלול הדלתא ללא בטוח; הורדה מלאה עוקפת אותו.
if (e is PatchApplyException && e.isContentMismatch) {
final mismatchReason =
e.hashMismatchStage == PatchHashMismatchStage.toContentHash
? 'תוצאת עדכון הדלתא אינה תואמת לגרסה הצפויה'
: 'תוכן הספרייה המקומית שונה מהצפוי';
// כל כשל apply (אי-התאמת hash, גרסה/סכמה לא תואמת, patch פגום) הופך
// את מסלול הדלתא ללא בטוח; הורדה מלאה עוקפת אותו. בלי זה, כשל שאינו
// אי-התאמת תוכן — למשל patch בסכמה חדשה מהנתמכת — משאיר את המשתמש
// בלולאת שגיאה ללא מוצא עד עדכון אפליקציה.
if (e is PatchApplyException) {
final String mismatchReason;
if (!e.isContentMismatch) {
mismatchReason = 'החלת עדכון הדלתא נכשלה';
} else if (e.hashMismatchStage == PatchHashMismatchStage.toContentHash) {
mismatchReason = 'תוצאת עדכון הדלתא אינה תואמת לגרסה הצפויה';
} else {
mismatchReason = 'תוכן הספרייה המקומית שונה מהצפוי';
}
final fallback = plan.toFullDownloadFallback(
reason: mismatchReason,
);
Expand Down
36 changes: 36 additions & 0 deletions test/library_update/library_update_bloc_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -1091,6 +1091,42 @@ void main() {
],
);

blocTest<LibraryUpdateBloc, LibraryUpdateState>(
'כשל apply שאינו סטיית תוכן (למשל סכמה לא נתמכת) → fallback להורדה מלאה',
build: () => _bloc(
_FakeService(
deltaWithFallbackPlan,
applyError: const PatchApplyException(
'גרסת סכמת ה-patch (5) חדשה מהנתמך (4) — נדרש עדכון תוכנה',
),
),
),
act: (b) => b.add(const StartLibraryUpdate()),
expect: () => [
isA<LibraryUpdateState>().having(
(s) => s.status,
'status',
LibraryUpdateStatus.checking,
),
isA<LibraryUpdateState>()
.having(
(s) => s.status,
'status',
LibraryUpdateStatus.needsFullConfirmation,
)
.having(
(s) => s.plan?.kind,
'plan.kind',
LibraryUpdatePlanKind.fullDownload,
)
.having(
(s) => s.message,
'message',
contains('החלת עדכון הדלתא נכשלה'),
),
],
);

blocTest<LibraryUpdateBloc, LibraryUpdateState>(
'סטיית תוכן בלי DB מלא בתוכנית → error',
build: () => _bloc(
Expand Down
Loading