0c071662a7
user tags TEST=cpu_sample_streaming_test.dart Change-Id: Ia983217ae2a5da8c3252fafbed8197b4f4a20e2b Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/224040 Reviewed-by: Siva Annamalai <asiva@google.com> Commit-Queue: Ben Konyi <bkonyi@google.com>
136 lines
4.3 KiB
Dart
136 lines
4.3 KiB
Dart
// Copyright (c) 2021, 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:io';
|
|
|
|
import 'package:dds/dds.dart';
|
|
import 'package:test/test.dart';
|
|
import 'package:vm_service/vm_service.dart';
|
|
import 'package:vm_service/vm_service_io.dart';
|
|
import 'common/test_helper.dart';
|
|
|
|
void main() {
|
|
late Process process;
|
|
DartDevelopmentService? dds;
|
|
|
|
setUp(() async {
|
|
process = await spawnDartProcess(
|
|
'get_cached_cpu_samples_script.dart',
|
|
disableServiceAuthCodes: true,
|
|
);
|
|
});
|
|
|
|
tearDown(() async {
|
|
await dds?.shutdown();
|
|
process.kill();
|
|
});
|
|
|
|
void declareTest(bool withDds) {
|
|
test(
|
|
'Stream CPU samples for provided UserTag names with${withDds ? "" : "out"} DDS',
|
|
() async {
|
|
Uri serviceUri = remoteVmServiceUri;
|
|
if (withDds) {
|
|
dds = await DartDevelopmentService.startDartDevelopmentService(
|
|
remoteVmServiceUri,
|
|
);
|
|
serviceUri = dds!.wsUri!;
|
|
expect(dds!.isRunning, true);
|
|
} else {
|
|
serviceUri = serviceUri.replace(scheme: 'ws', path: 'ws');
|
|
}
|
|
final service = await vmServiceConnectUri(serviceUri.toString());
|
|
final otherService = await vmServiceConnectUri(serviceUri.toString());
|
|
|
|
IsolateRef isolate;
|
|
while (true) {
|
|
final vm = await service.getVM();
|
|
if (vm.isolates!.isNotEmpty) {
|
|
isolate = vm.isolates!.first;
|
|
try {
|
|
isolate = await service.getIsolate(isolate.id!);
|
|
if ((isolate as Isolate).runnable!) {
|
|
break;
|
|
}
|
|
} on SentinelException {
|
|
// ignore
|
|
}
|
|
}
|
|
await Future.delayed(const Duration(seconds: 1));
|
|
}
|
|
expect(isolate, isNotNull);
|
|
|
|
final expectedUserTags = <String>{};
|
|
|
|
Future<void> listenForSamples() {
|
|
late StreamSubscription sub;
|
|
final completer = Completer<void>();
|
|
int i = 0;
|
|
sub = service.onProfilerEvent.listen(
|
|
(event) async {
|
|
if (event.kind == EventKind.kCpuSamples &&
|
|
event.isolate!.id! == isolate.id!) {
|
|
expect(expectedUserTags.isNotEmpty, true);
|
|
++i;
|
|
if (i > 3) {
|
|
if (!completer.isCompleted) {
|
|
await sub.cancel();
|
|
completer.complete();
|
|
}
|
|
return;
|
|
}
|
|
expect(event.cpuSamples, isNotNull);
|
|
final sampleCount = event.cpuSamples!.samples!
|
|
.where((e) => expectedUserTags.contains(e.userTag))
|
|
.length;
|
|
expect(sampleCount, event.cpuSamples!.samples!.length);
|
|
}
|
|
},
|
|
);
|
|
if (expectedUserTags.isEmpty) {
|
|
return Future.delayed(const Duration(seconds: 2)).then(
|
|
(_) async => await sub.cancel(),
|
|
);
|
|
}
|
|
return completer.future;
|
|
}
|
|
|
|
await service.streamListen(EventStreams.kProfiler);
|
|
Future<void> subscription = listenForSamples();
|
|
await service.resume(isolate.id!);
|
|
await subscription;
|
|
await service.pause(isolate.id!);
|
|
|
|
expectedUserTags.add('Testing');
|
|
await service.streamCpuSamplesWithUserTag(expectedUserTags.toList());
|
|
subscription = listenForSamples();
|
|
await service.resume(isolate.id!);
|
|
await subscription;
|
|
await service.pause(isolate.id!);
|
|
|
|
expectedUserTags.add('Baz');
|
|
await service.streamCpuSamplesWithUserTag(expectedUserTags.toList());
|
|
subscription = listenForSamples();
|
|
await service.resume(isolate.id!);
|
|
await subscription;
|
|
await service.pause(isolate.id!);
|
|
|
|
expectedUserTags.clear();
|
|
await service.streamCpuSamplesWithUserTag(expectedUserTags.toList());
|
|
subscription = listenForSamples();
|
|
await service.resume(isolate.id!);
|
|
await subscription;
|
|
|
|
await service.dispose();
|
|
await otherService.dispose();
|
|
},
|
|
timeout: Timeout.none,
|
|
);
|
|
}
|
|
|
|
declareTest(true);
|
|
declareTest(false);
|
|
}
|