| Index: tests/standalone/io/secure_socket_renegotiate_test.dart
|
| diff --git a/tests/standalone/io/secure_socket_renegotiate_test.dart b/tests/standalone/io/secure_socket_renegotiate_test.dart
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..49c1644ef33054819a6ee1a63d1624aed520ac4f
|
| --- /dev/null
|
| +++ b/tests/standalone/io/secure_socket_renegotiate_test.dart
|
| @@ -0,0 +1,85 @@
|
| +// 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.
|
| +
|
| +// This test verifies that client certificates work, if the client and server
|
| +// are in separate processes, and that connection renegotiation works, and
|
| +// can request a client certificate to be sent.
|
| +
|
| +import "package:expect/expect.dart";
|
| +import "package:pathos/path.dart" as path;
|
| +import "dart:async";
|
| +import "dart:io";
|
| +
|
| +const HOST_NAME = "localhost";
|
| +const CERTIFICATE = "localhost_cert";
|
| +
|
| +
|
| +String certificateDatabase() =>
|
| + path.join(path.dirname(new Options().script), 'pkcert', '');
|
| +
|
| +
|
| +Future<SecureServerSocket> runServer() {
|
| + SecureSocket.initialize(database: certificateDatabase(),
|
| + password: 'dartdart');
|
| +
|
| + return SecureServerSocket.bind(HOST_NAME, 0, CERTIFICATE)
|
| + .then((SecureServerSocket server) {
|
| + server.listen((SecureSocket socket) {
|
| + Expect.isNull(socket.peerCertificate);
|
| +
|
| + StreamIterator<String> input =
|
| + new StreamIterator(socket.transform(new StringDecoder())
|
| + .transform(new LineTransformer()));
|
| + input.moveNext().then((success) {
|
| + Expect.isTrue(success);
|
| + Expect.equals('first', input.current);
|
| + socket.writeln('first reply');
|
| + return input.moveNext();
|
| + }).then((success) {
|
| + Expect.isTrue(success);
|
| + Expect.equals('renegotiated', input.current);
|
| + Expect.isNull(socket.peerCertificate);
|
| + socket.renegotiate(requestClientCertificate: true,
|
| + requireClientCertificate: true,
|
| + useSessionCache: false);
|
| + socket.writeln('server renegotiated');
|
| + return input.moveNext();
|
| + }).then((success) {
|
| + Expect.isTrue(success);
|
| + Expect.equals('second', input.current);
|
| + X509Certificate certificate = socket.peerCertificate;
|
| + Expect.isNotNull(certificate);
|
| + Expect.equals("CN=localhost", certificate.subject);
|
| + Expect.equals("CN=myauthority", certificate.issuer);
|
| + server.close();
|
| + socket.close();
|
| + });
|
| + });
|
| + return server;
|
| + });
|
| +}
|
| +
|
| +
|
| +void main() {
|
| + runServer()
|
| + .then((SecureServerSocket server) {
|
| + final options = new Options();
|
| + var clientScript =
|
| + options.script.replaceFirst("_test.dart", "_client.dart");
|
| + Expect.isTrue(clientScript.endsWith("_client.dart"));
|
| + Process.run(options.executable,
|
| + [clientScript,
|
| + server.port.toString(),
|
| + certificateDatabase()])
|
| + .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}');
|
| + }
|
| + });
|
| + });
|
| +}
|
|
|