Index: tests/standalone/io/secure_bad_certificate_test.dart |
diff --git a/tests/standalone/io/secure_bad_certificate_test.dart b/tests/standalone/io/secure_bad_certificate_test.dart |
index 3388a8d48945edf7ec62dcf0fef96626ac1bea52..6a7e93a7f07b9b10aef5ffb89a77f4b42957c32b 100644 |
--- a/tests/standalone/io/secure_bad_certificate_test.dart |
+++ b/tests/standalone/io/secure_bad_certificate_test.dart |
@@ -4,59 +4,81 @@ |
// This test verifies that the bad certificate callback works. |
-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(); |
+SecurityContext serverContext = new SecurityContext() |
+ ..useCertificateChain(localFile('certificates/server_chain.pem')) |
+ ..usePrivateKey(localFile('certificates/server_key.pem'), |
+ password: 'dartdart'); |
-String certificateDatabase() => Platform.script.resolve('pkcert').toFilePath(); |
+class CustomException {} |
-Future<SecureServerSocket> runServer() { |
- SecureSocket.initialize(database: certificateDatabase(), |
- password: 'dartdart'); |
+main() async { |
+ var HOST = (await InternetAddress.lookup(HOST_NAME)).first; |
+ var server = await SecureServerSocket.bind(HOST_NAME, 0, serverContext); |
+ server.listen((SecureSocket socket) { |
+ socket.listen((_) {}, onDone: () { |
+ socket.close(); |
+ }); |
+ }, onError: (e) { if (e is! HandshakeException) throw e; }); |
- return SecureServerSocket.bind(HOST_NAME, 0, CERTIFICATE) |
- .then((SecureServerSocket server) { |
- server.listen((SecureSocket socket) { |
- socket.listen((_) { }, |
- onDone: () { |
- socket.close(); |
- }); |
- }, onError: (e) => Expect.isTrue(e is HandshakeException)); |
- return server; |
- }); |
+ SecurityContext goodContext = new SecurityContext() |
+ ..setTrustedCertificates(file: 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(); |
} |
-void main() { |
- var clientScript = Platform.script |
- .resolve('secure_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) { |
- print("Client failed, stdout:"); |
- print(result.stdout); |
- print(" stderr:"); |
- print(result.stderr); |
- Expect.fail('Client subprocess exit code: ${result.exitCode}'); |
- } |
- }); |
+Future runClient(int port, |
+ SecurityContext context, |
+ callbackReturns, |
+ result) async { |
+ badCertificateCallback(X509Certificate certificate) { |
+ 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; |
} |
- runServer().then((server) { |
- Future.wait([clientProcess(server.port, 'true'), |
- clientProcess(server.port, 'false'), |
- clientProcess(server.port, 'fisk'), |
- clientProcess(server.port, 'exception')]).then((_) { |
- server.close(); |
- }); |
- }); |
-} |
+ try { |
+ var socket = await SecureSocket.connect( |
+ HOST_NAME, |
+ port, |
+ context: context, |
+ onBadCertificate: badCertificateCallback); |
+ Expect.equals('pass', result); // Is rethrown below |
+ await socket.close(); |
+ } catch (error) { |
+ if (error is ExpectException) rethrow; |
+ Expect.notEquals(result, 'pass'); |
+ if (result == 'fail') { |
+ Expect.isTrue(error is HandshakeException || error is ArgumentError); |
+ } else if (result == 'throw') { |
+ Expect.isTrue(error is CustomException); |
+ } else { |
+ Expect.fail('Unknown expectation $result'); |
+ } |
+ } |
+} |