Index: tests/standalone/io/https_bad_certificate_test.dart |
diff --git a/tests/standalone/io/https_bad_certificate_test.dart b/tests/standalone/io/https_bad_certificate_test.dart |
index d07961a80a0912e70331f3666d5eed9c02a26d68..fdd83e316d972217060dd8a5c9ac7c2dc93c8701 100644 |
--- a/tests/standalone/io/https_bad_certificate_test.dart |
+++ b/tests/standalone/io/https_bad_certificate_test.dart |
@@ -4,52 +4,78 @@ |
// This test verifies that the bad certificate callback works in HttpClient. |
-import "package:expect/expect.dart"; |
-import "package:path/path.dart"; |
import "dart:async"; |
import "dart:io"; |
-const HOST_NAME = "localhost"; |
-const CERTIFICATE = "localhost_cert"; |
+import "package:expect/expect.dart"; |
+ |
+final HOST_NAME = 'localhost'; |
+ |
+String localFile(path) => Platform.script.resolve(path).toFilePath(); |
-Future<SecureServerSocket> runServer() { |
- SecureSocket.initialize( |
- database: Platform.script.resolve('pkcert').toFilePath(), |
+SecurityContext serverContext = new SecurityContext() |
+ ..useCertificateChain(localFile('certificates/server_chain.pem')) |
+ ..usePrivateKey(localFile('certificates/server_key.pem'), |
password: 'dartdart'); |
- return HttpServer.bindSecure( |
- HOST_NAME, 0, backlog: 5, certificateName: 'localhost_cert') |
- .then((server) { |
- server.listen((HttpRequest request) { |
- request.listen((_) { }, onDone: () { request.response.close(); }); |
- }, onError: (e) { if (e is! HandshakeException) throw e; }); |
- return server; |
- }); |
-} |
+class CustomException {} |
main() async { |
- var clientScript = Platform.script |
- .resolve('https_bad_certificate_client.dart') |
- .toFilePath(); |
- Future clientProcess(int port, String acceptCertificate) { |
- return Process.run(Platform.executable, |
- [clientScript, port.toString(), acceptCertificate]) |
- .then((ProcessResult result) { |
- if (result.exitCode != 0 || !result.stdout.contains('SUCCESS')) { |
- print("Client failed, acceptCertificate: $acceptCertificate"); |
- print(" stdout:"); |
- print(result.stdout); |
- print(" stderr:"); |
- print(result.stderr); |
- Expect.fail('Client subprocess exit code: ${result.exitCode}'); |
- } |
+ 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(file: localFile('certificates/trusted_certs.pem')); |
+ SecurityContext badContext = new SecurityContext(); |
+ SecurityContext defaultContext = SecurityContext.defaultContext; |
- var server = await runServer(); |
- await clientProcess(server.port, 'true'); |
- await clientProcess(server.port, 'false'); |
- await clientProcess(server.port, 'fisk'); |
- await clientProcess(server.port, 'exception'); |
+ 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.equals('/CN=rootauthority', certificate.subject); |
+ Expect.equals('/CN=rootauthority', certificate.issuer); |
+ // 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); |
+ } else if (result == 'throw') { |
+ Expect.isTrue(error is CustomException); |
+ } else { |
+ Expect.fail('Unknown expectation $result'); |
+ } |
+ } |
+} |