// Copyright 2014 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. import 'package:flutter/widgets.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:leak_tracker_flutter_testing/leak_tracker_flutter_testing.dart'; import 'utils/memory_leak_tests.dart'; class _TestExecution { _TestExecution( {required this.settings, required this.settingName, required this.test}); final String settingName; final LeakTesting settings; final LeakTestCase test; String get name => '${test.name}, $settingName'; } final List<_TestExecution> _testExecutions = <_TestExecution>[]; void main() { LeakTesting.collectedLeaksReporter = _verifyLeaks; LeakTesting.enable(); LeakTesting.settings = LeakTesting.settings .withTrackedAll() .withTracked(allNotDisposed: true, experimentalAllNotGCed: true) .withIgnored( createdByTestHelpers: true, testHelperExceptions: [ RegExp(RegExp.escape(memoryLeakTestsFilePath())) ], ); for (final LeakTestCase test in memoryLeakTests) { for (final MapEntry settingsCase in leakTestingSettingsCases.entries) { final LeakTesting settings = settingsCase.value(LeakTesting.settings); if (settings.leakDiagnosticConfig.collectRetainingPathForNotGCed) { // Retaining path requires vm to be started, so skipping. continue; } final _TestExecution execution = _TestExecution( settingName: settingsCase.key, test: test, settings: settings); _testExecutions.add(execution); testWidgets(execution.name, experimentalLeakTesting: settings, (WidgetTester tester) async { await test.body((Widget widget, [Duration? duration]) => tester.pumpWidget(widget, duration: duration), tester.runAsync); }); } } } void _verifyLeaks(Leaks leaks) { for (final _TestExecution execution in _testExecutions) { final Leaks testLeaks = leaks.byPhase[execution.name] ?? Leaks.empty(); execution.test.verifyLeaks(testLeaks, execution.settings, testDescription: execution.name); } }