// 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.
//

// @dart = 2.9

import 'dart:async';
import 'dart:io';
import "package:expect/expect.dart";

const int NUM_SERVERS = 10;

void main(List<String> args) {
  if (args.isEmpty) {
    for (int i = 0; i < NUM_SERVERS; ++i) {
      makeServer().then((server) {
        runClientProcess(server.port).then((_) => server.close());
      });
    }
  } else if (args[0] == '--client') {
    int port = int.parse(args[1]);
    runClient(port);
  } else {
    Expect.fail('Unknown arguments to http_cross_process_test.dart');
  }
}

Future makeServer() {
  return HttpServer.bind(InternetAddress.loopbackIPv4, 0).then((server) {
    server.listen((request) {
      request.cast<List<int>>().pipe(request.response);
    });
    return server;
  });
}

Future runClientProcess(int port) {
  return Process.run(
          Platform.executable,
          []
            ..addAll(Platform.executableArguments)
            ..add(Platform.script.toFilePath())
            ..add('--client')
            ..add(port.toString()))
      .then((ProcessResult result) {
    if (result.exitCode != 0 || !result.stdout.contains('SUCCESS')) {
      print("Client failed, exit code ${result.exitCode}");
      print("  stdout:");
      print(result.stdout);
      print("  stderr:");
      print(result.stderr);
      Expect.fail('Client subprocess exit code: ${result.exitCode}');
    }
  });
}

runClient(int port) {
  var client = new HttpClient();
  client
      .get('127.0.0.1', port, "/")
      .then((request) => request.close())
      .then((response) => response.drain())
      .then((_) => client.close())
      .then((_) => print('SUCCESS'));
}
