// Copyright (c) 2015, 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.
// VMOptions=--error_on_bad_type --error_on_bad_override

import 'dart:developer';
import 'dart:io';
import 'dart:isolate' show ReceivePort;
import 'package:observatory/models.dart' as M;
import 'package:observatory/service_io.dart';
import 'package:unittest/unittest.dart';
import 'service_test_common.dart';
import 'test_helper.dart';

var receivePort;

void testMain() {
  receivePort = new ReceivePort();
  debugger();
}

var tests = [

hasStoppedAtBreakpoint,

(Isolate isolate) async {
  print('Resuming...');
  await isolate.resume();

  // Wait for the isolate to become idle.  We detect this by querying
  // the stack until it becomes empty.
  var frameCount;
  do {
    var stack = await isolate.getStack();
    frameCount = stack['frames'].length;
    print('Frames: $frameCount');
    sleep(const Duration(milliseconds:10));
  } while (frameCount > 0);
  print('Isolate is idle.');
  await isolate.reload();
  expect(isolate.pauseEvent is M.ResumeEvent, isTrue);

  // Make sure that the isolate receives an interrupt even when it is
  // idle. (https://github.com/dart-lang/sdk/issues/24349)
  var interruptFuture = hasPausedFor(isolate, ServiceEvent.kPauseInterrupted);
  print('Pausing...');
  await isolate.pause();
  await interruptFuture;
},

];

main(args) => runIsolateTests(args, tests,
                              testeeConcurrent: testMain,
                              trace_service: true,
                              verbose_vm: true);
