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