|  | // 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); | 
|  | } |