| // Copyright (c) 2013, 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. | 
 |  | 
 | // OtherResources=certificates/server_chain.pem | 
 | // OtherResources=certificates/server_key.pem | 
 | // OtherResources=certificates/trusted_certs.pem | 
 |  | 
 | // This test verifies that the bad certificate callback works in HttpClient. | 
 |  | 
 | import "dart:async"; | 
 | import "dart:io"; | 
 |  | 
 | import "package:expect/expect.dart"; | 
 |  | 
 | final HOST_NAME = 'localhost'; | 
 |  | 
 | String localFile(path) => Platform.script.resolve(path).toFilePath(); | 
 |  | 
 | SecurityContext serverContext = new SecurityContext() | 
 |   ..useCertificateChain(localFile('certificates/server_chain.pem')) | 
 |   ..usePrivateKey(localFile('certificates/server_key.pem'), | 
 |       password: 'dartdart'); | 
 |  | 
 | class CustomException {} | 
 |  | 
 | main() async { | 
 |   var HOST = (await InternetAddress.lookup(HOST_NAME)).first; | 
 |   var server = await HttpServer.bindSecure(HOST, 0, serverContext, backlog: 5); | 
 |   server.listen((request) { | 
 |     request.listen((_) {}, onDone: () { | 
 |       request.response.close(); | 
 |     }); | 
 |   }); | 
 |  | 
 |   SecurityContext goodContext = new SecurityContext() | 
 |     ..setTrustedCertificates(localFile('certificates/trusted_certs.pem')); | 
 |   SecurityContext badContext = new SecurityContext(); | 
 |   SecurityContext defaultContext = SecurityContext.defaultContext; | 
 |  | 
 |   await runClient(server.port, goodContext, true, 'pass'); | 
 |   await runClient(server.port, goodContext, false, 'pass'); | 
 |   await runClient(server.port, goodContext, 'fisk', 'pass'); | 
 |   await runClient(server.port, goodContext, 'exception', 'pass'); | 
 |   await runClient(server.port, badContext, true, 'pass'); | 
 |   await runClient(server.port, badContext, false, 'fail'); | 
 |   await runClient(server.port, badContext, 'fisk', 'fail'); | 
 |   await runClient(server.port, badContext, 'exception', 'throw'); | 
 |   await runClient(server.port, defaultContext, true, 'pass'); | 
 |   await runClient(server.port, defaultContext, false, 'fail'); | 
 |   await runClient(server.port, defaultContext, 'fisk', 'fail'); | 
 |   await runClient(server.port, defaultContext, 'exception', 'throw'); | 
 |   server.close(); | 
 | } | 
 |  | 
 | Future runClient( | 
 |     int port, SecurityContext context, callbackReturns, result) async { | 
 |   HttpClient client = new HttpClient(context: context); | 
 |   client.badCertificateCallback = (X509Certificate certificate, host, port) { | 
 |     Expect.isTrue(certificate.subject.contains('rootauthority')); | 
 |     Expect.isTrue(certificate.issuer.contains('rootauthority')); | 
 |     // Throw exception if one is requested. | 
 |     if (callbackReturns == 'exception') throw new CustomException(); | 
 |     return callbackReturns; | 
 |   }; | 
 |  | 
 |   try { | 
 |     var request = await client.getUrl(Uri.parse('https://$HOST_NAME:$port/')); | 
 |     Expect.equals('pass', result); | 
 |     await request.close(); | 
 |   } catch (error) { | 
 |     Expect.notEquals(result, 'pass'); | 
 |     if (result == 'fail') { | 
 |       Expect.isTrue(error is HandshakeException || | 
 |           (callbackReturns is! bool && error is TypeError)); | 
 |     } else if (result == 'throw') { | 
 |       Expect.isTrue(error is CustomException); | 
 |     } else { | 
 |       Expect.fail('Unknown expectation $result'); | 
 |     } | 
 |   } | 
 | } |