| // Copyright (c) 2020, 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:isolate' hide Isolate; |
| import 'package:observatory_2/service_io.dart'; |
| import 'package:test/test.dart'; |
| |
| import 'service_test_common.dart'; |
| import 'test_helper.dart'; |
| |
| void warmup() { |
| Timer timer = Timer(const Duration(days: 30), () => null); |
| debugger(); |
| timer.cancel(); |
| debugger(); |
| timer = Timer(const Duration(days: 30), () => null); |
| debugger(); |
| timer.cancel(); |
| } |
| |
| Set<int> originalPortIds; |
| int timerPortId; |
| |
| final tests = <IsolateTest>[ |
| hasPausedAtStart, |
| (Isolate isolate) async { |
| final originalPorts = |
| (await isolate.invokeRpcNoUpgrade('getPorts', {}))['ports']; |
| originalPortIds = { |
| for (int i = 0; i < originalPorts.length; ++i) originalPorts[i]['portId'], |
| }; |
| }, |
| resumeIsolate, |
| hasStoppedAtBreakpoint, |
| (Isolate isolate) async { |
| // Determine the ID of the timer port. |
| final ports = (await isolate.invokeRpcNoUpgrade('getPorts', {}))['ports']; |
| timerPortId = ports |
| .firstWhere((p) => !originalPortIds.contains(p['portId']))['portId']; |
| }, |
| resumeIsolate, |
| hasStoppedAtBreakpoint, |
| (Isolate isolate) async { |
| // After cancelling the timer, there should be no active timers left. |
| // The timer port should be inactive and not reported. |
| final ports = (await isolate.invokeRpcNoUpgrade('getPorts', {}))['ports']; |
| for (final port in ports) { |
| if (port['portId'] == timerPortId) { |
| fail('Timer port should no longer be active'); |
| } |
| } |
| }, |
| resumeIsolate, |
| hasStoppedAtBreakpoint, |
| (Isolate isolate) async { |
| // After setting a new timer, the timer port should be active and have the same |
| // port ID as before as the original port is still being used. |
| final ports = (await isolate.invokeRpcNoUpgrade('getPorts', {}))['ports']; |
| bool foundTimerPort = false; |
| for (final port in ports) { |
| if (port['portId'] == timerPortId) { |
| foundTimerPort = true; |
| break; |
| } |
| } |
| expect(foundTimerPort, true); |
| }, |
| ]; |
| |
| main(args) async => runIsolateTests(args, tests, |
| pause_on_start: true, testeeConcurrent: warmup); |