Skip to content

Commit 22f593e

Browse files
authored
GoldenFileComparators should dispose created Image objects. (#136716)
1 parent 3d1d453 commit 22f593e

File tree

5 files changed

+53
-6
lines changed

5 files changed

+53
-6
lines changed

packages/flutter/test/animation/live_binding_test.dart

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,5 @@ void main() {
137137
);
138138
},
139139
skip: isBrowser, // [intended] https://github.com/flutter/flutter/issues/56001
140-
// TODO(polina-c): remove after fixing https://github.com/flutter/flutter/issues/136513
141-
leakTrackingTestConfig: const LeakTrackingTestConfig(notDisposedAllowList: <String, int?>{'Image': 4}),
142140
);
143141
}

packages/flutter_goldens/lib/flutter_goldens.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -534,10 +534,12 @@ class FlutterLocalFileComparator extends FlutterGoldenFileComparator with LocalC
534534
);
535535

536536
if (result.passed) {
537+
result.dispose();
537538
return true;
538539
}
539540

540541
final String error = await generateFailureOutput(result, golden, basedir);
542+
result.dispose();
541543
throw FlutterError(error);
542544
}
543545
}

packages/flutter_test/lib/src/_goldens_io.dart

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -96,11 +96,14 @@ class LocalFileComparator extends GoldenFileComparator with LocalComparisonOutpu
9696
await getGoldenBytes(golden),
9797
);
9898

99-
if (!result.passed) {
100-
final String error = await generateFailureOutput(result, golden, basedir);
101-
throw FlutterError(error);
99+
if (result.passed) {
100+
result.dispose();
101+
return true;
102102
}
103-
return result.passed;
103+
104+
final String error = await generateFailureOutput(result, golden, basedir);
105+
result.dispose();
106+
throw FlutterError(error);
104107
}
105108

106109
@override

packages/flutter_test/lib/src/goldens.dart

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import 'dart:typed_data';
66
import 'dart:ui';
77

8+
import 'package:meta/meta.dart';
89
import 'package:path/path.dart' as path;
910

1011
import '_goldens_io.dart' if (dart.library.html) '_goldens_web.dart' as goldens;
@@ -342,4 +343,16 @@ class ComparisonResult {
342343

343344
/// The calculated percentage of pixel difference between two images.
344345
final double diffPercent;
346+
347+
/// Disposes the images held by this [ComparisonResult].
348+
@mustCallSuper
349+
void dispose() {
350+
if (diffs == null) {
351+
return;
352+
}
353+
354+
for (final MapEntry<String, Image> entry in diffs!.entries) {
355+
entry.value.dispose();
356+
}
357+
}
345358
}

packages/flutter_test/test/goldens_test.dart

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import 'dart:async';
66
import 'dart:io' as io;
77
import 'dart:typed_data';
8+
import 'dart:ui' as ui;
89

910
import 'package:file/memory.dart';
1011
import 'package:flutter/foundation.dart' show DiagnosticLevel, DiagnosticPropertiesBuilder, DiagnosticsNode, FlutterError;
@@ -322,4 +323,34 @@ void main() {
322323
});
323324
});
324325
});
326+
327+
group('ComparisonResult', () {
328+
group('dispose', () {
329+
test('disposes diffs images', () async {
330+
final ui.Image image1 = await createTestImage(width: 10, height: 10, cache: false);
331+
final ui.Image image2 = await createTestImage(width: 15, height: 5, cache: false);
332+
final ui.Image image3 = await createTestImage(width: 5, height: 10, cache: false);
333+
334+
final ComparisonResult result = ComparisonResult(
335+
passed: false,
336+
diffPercent: 1.0,
337+
diffs: <String, ui.Image>{
338+
'image1': image1,
339+
'image2': image2,
340+
'image3': image3,
341+
}
342+
);
343+
344+
expect(image1.debugDisposed, isFalse);
345+
expect(image2.debugDisposed, isFalse);
346+
expect(image3.debugDisposed, isFalse);
347+
348+
result.dispose();
349+
350+
expect(image1.debugDisposed, isTrue);
351+
expect(image2.debugDisposed, isTrue);
352+
expect(image3.debugDisposed, isTrue);
353+
});
354+
});
355+
});
325356
}

0 commit comments

Comments
 (0)