blob: ef1f60d11cdda9f2bcab8811536b0627ac0d810f [file] [log] [blame]
// Copyright (c) 2023, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
import 'dart:async';
import 'dart:developer';
import 'dart:io';
import 'package:expect/expect.dart';
import 'package:heap_snapshot/analysis.dart';
import 'package:path/path.dart' as path;
import 'package:vm_service/vm_service.dart';
import 'use_flag_test_helper.dart';
void main() async {
if (buildDir.contains('Product')) return;
final dir = Directory('.');
StreamSubscription? current;
Future<void> iterate() async {
final temp = dir.watch().listen((event) {});
await current?.cancel();
current = dir.watch().listen((event) {});
await temp.cancel();
}
Future<void> finish() async {
await current?.cancel();
}
await withTempDir('ama-test', (String tempDir) async {
await iterate();
final before = countInstances(tempDir, '_BroadcastSubscription');
print('Before = $before');
for (int i = 0; i < 100; i++) {
await iterate();
}
final after = countInstances(tempDir, '_BroadcastSubscription');
print('After = $after');
await finish();
Expect.equals(0, (after - before));
});
}
int countInstances(String tempDir, String className) {
final snapshotFile = path.join(tempDir, 'foo.heapsnapshot');
NativeRuntime.writeHeapSnapshotToFile(snapshotFile);
final bytes = File(snapshotFile).readAsBytesSync();
File(snapshotFile).deleteSync();
final graph = HeapSnapshotGraph.fromChunks([
bytes.buffer.asByteData(bytes.offsetInBytes, bytes.length),
]);
final analysis = Analysis(graph);
return analysis.filterByClassPatterns(analysis.reachableObjects, [
className,
]).length;
}