blob: edff937d5b33454217109e4ae019893702cd7b5a [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.
// ignore_for_file: library_private_types_in_public_api
import 'package:test/test.dart';
import 'package:vm_service/vm_service.dart';
import 'common/test_helper.dart';
@pragma('vm:entry-point') // Prevent obfuscation
class _TestConst {
const _TestConst();
}
void _topLevelClosure() {}
@pragma('vm:entry-point') // Prevent obfuscation
late final _TestConst x;
@pragma('vm:entry-point') // Prevent obfuscation
late final Function fn;
void warmup() {
x = const _TestConst();
fn = _topLevelClosure;
}
@pragma('vm:entry-point') // Prevent obfuscation
_TestConst getX() => x;
@pragma('vm:entry-point') // Prevent obfuscation
Function getFn() => fn;
Future<InstanceRef> invoke(String selector) async {
return await rootService.invoke(
isolateId,
isolate.rootLib!.id!,
selector,
[],
) as InstanceRef;
}
late final VmService rootService;
late final Isolate isolate;
late final String isolateId;
final tests = <IsolateTest>[
(VmService service, IsolateRef isolateRef) async {
isolateId = isolateRef.id!;
rootService = service;
isolate = await service.getIsolate(isolateId);
},
// Expect a simple path through variable x instead of long path filled
// with VM objects
(VmService service, IsolateRef isolateRef) async {
final target = await invoke('getX');
final result = await service.getRetainingPath(isolateId, target.id!, 100);
final elements = result.elements!;
expect(elements.length, 2);
expect((elements[0].value as InstanceRef).classRef!.name, '_TestConst');
expect((elements[1].value as FieldRef).name, 'x');
},
// Expect a simple path through variable fn instead of long path filled
// with VM objects
(VmService service, IsolateRef isolateRef) async {
final target = await invoke('getFn');
final result = await service.getRetainingPath(isolateId, target.id!, 100);
final elements = result.elements!;
expect(elements.length, 2);
expect((elements[0].value as InstanceRef).classRef!.name, '_Closure');
expect((elements[1].value as FieldRef).name, 'fn');
}
];
void main([args = const <String>[]]) => runIsolateTests(
args,
tests,
'get_user_level_retaining_path_rpc_test.dart',
testeeBefore: warmup,
);