// 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/untrusted_server_chain.pem
// OtherResources=certificates/untrusted_server_key.pem
// OtherResources=certificates/trusted_certs.pem
// OtherResources=https_unauthorized_client.dart

// This test verifies that secure connections that fail due to
// unauthenticated certificates throw exceptions 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";

String localFile(path) => Platform.script.resolve(path).toFilePath();

SecurityContext untrustedServerContext = new SecurityContext()
  ..useCertificateChain(localFile('certificates/untrusted_server_chain.pem'))
  ..usePrivateKey(
    localFile('certificates/untrusted_server_key.pem'),
    password: 'dartdart',
  );

SecurityContext clientContext = new SecurityContext()
  ..setTrustedCertificates(localFile('certificates/trusted_certs.pem'));

Future<HttpServer> runServer() {
  return HttpServer.bindSecure(
    HOST_NAME,
    0,
    untrustedServerContext,
    backlog: 5,
  ).then((server) {
    server.listen(
      (HttpRequest request) {
        request.listen(
          (_) {},
          onDone: () {
            request.response.close();
          },
        );
      },
      onError: (e) {
        if (e is! HandshakeException) throw e;
      },
    );
    return server;
  });
}

void main() {
  var clientScript = localFile('https_unauthorized_client.dart');
  Future clientProcess(int port) {
    return Process.run(
      Platform.executable,
      []
        ..addAll(Platform.executableArguments)
        ..addAll([clientScript, port.toString()]),
    ).then((ProcessResult result) {
      if (result.exitCode != 0 || !result.stdout.contains('SUCCESS')) {
        print("Client failed");
        print("  stdout:");
        print(result.stdout);
        print("  stderr:");
        print(result.stderr);
        Expect.fail('Client subprocess exit code: ${result.exitCode}');
      }
    });
  }

  runServer().then((server) {
    clientProcess(server.port).then((_) {
      server.close();
    });
  });
}
