// 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.

// @dart = 2.9

// VMOptions=--long-ssl-cert-evaluation

// This test verifies that dart isolate is not getting blocked during
// certificate evaluation.

import 'dart:async';
import 'dart:io';

import "package:expect/expect.dart";
import "package:async_helper/async_helper.dart";

void log(String s) {
  print(s);
}

Timer stallDetector() {
  final sw = Stopwatch()..start();
  return Timer.periodic(Duration(milliseconds: 5), (_) {
    int elapsedMs = sw.elapsedMilliseconds;
    // Would the evaluation be synchronous, the dart isolate is going to
    // be blocked for over a second.
    Expect.isTrue(elapsedMs < 1000);
    if (sw.elapsedMilliseconds > 10) {
      log('EVENT LOOP WAS STALLED FOR ${sw.elapsedMilliseconds} ms');
    }
    sw.reset();
  });
}

void main() async {
  asyncStart();
  final url = 'https://google.com';
  final timer = stallDetector();
  var sw = Stopwatch()..start();
  var httpClient = HttpClient();
  try {
    var request = await httpClient.getUrl(Uri.parse(url));
    var response = await request.close();
    int elapsedMs = sw.elapsedMilliseconds;
    log('REQUEST COMPLETE IN $elapsedMs ms');
    // Request have to take at least a second due to
    // vm "--long-ssl-cert-evaluation" option.
    Expect.isTrue(elapsedMs > 1000);

    asyncEnd();
  } finally {
    httpClient.close(force: true);
    timer.cancel();
  }
}
