// 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.
//
// VMOptions=
// VMOptions=--short_socket_read
// VMOptions=--short_socket_write
// VMOptions=--short_socket_read --short_socket_write
// OtherResources=certificates/server_chain.pem
// OtherResources=certificates/server_key.pem
// OtherResources=certificates/trusted_certs.pem

// @dart = 2.9

import "dart:async";
import "dart:io";
import "dart:isolate";
import "package:expect/expect.dart";
import "package:path/path.dart";

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');

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

Future<HttpServer> startServer() {
  return HttpServer
      .bindSecure("localhost", 0, serverContext, backlog: 5)
      .then((server) {
    server.listen((HttpRequest request) {
      request.listen((_) {}, onDone: () {
        request.response.contentLength = 100;
        for (int i = 0; i < 10; i++) {
          request.response.add([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]);
        }
        request.response.close();
      });
    });
    return server;
  });
}

main() async {
  List<int> message = "GET / HTTP/1.0\r\nHost: localhost\r\n\r\n".codeUnits;
  int written = 0;
  List<int> body = <int>[];
  var server = await startServer();
  var socket = await RawSecureSocket.connect("localhost", server.port,
      context: clientContext);
  StreamSubscription subscription;
  bool paused = false;
  bool readEventsTested = false;
  bool readEventsPaused = false;

  void runPauseTest() {
    subscription.pause();
    paused = true;
    new Timer(const Duration(milliseconds: 500), () {
      paused = false;
      subscription.resume();
    });
  }

  void runReadEventTest() {
    if (readEventsTested) return;
    readEventsTested = true;
    socket.readEventsEnabled = false;
    readEventsPaused = true;
    new Timer(const Duration(milliseconds: 500), () {
      readEventsPaused = false;
      socket.readEventsEnabled = true;
    });
  }

  void handleRawEvent(RawSocketEvent event) {
    Expect.isFalse(paused);
    switch (event) {
      case RawSocketEvent.read:
        Expect.isFalse(readEventsPaused);
        runReadEventTest();
        body.addAll(socket.read());
        break;
      case RawSocketEvent.write:
        written += socket.write(message, written, message.length - written);
        if (written < message.length) {
          socket.writeEventsEnabled = true;
        } else {
          socket.shutdown(SocketDirection.send);
          runPauseTest();
        }
        break;
      case RawSocketEvent.readClosed:
        Expect.isTrue(body.length > 100);
        Expect.equals(72, body.first);
        Expect.equals(9, body.last);
        server.close();
        break;
      default:
        throw "Unexpected event $event";
    }
  }

  subscription = socket.listen(handleRawEvent, onError: (e, trace) {
    String msg = "onError handler of RawSecureSocket stream hit: $e";
    if (trace != null) msg += "\nStackTrace: $trace";
    Expect.fail(msg);
  });
}
