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

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

const int serversCount = 10;

void main(List<String> args) {
  if (args.isEmpty) {
    for (int i = 0; i < serversCount; ++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 raw_socket_cross_process_test.dart');
  }
}

Future makeServer() {
  return RawServerSocket.bind(InternetAddress.loopbackIPv4, 0).then((server) {
    server.listen((connection) {
      connection.writeEventsEnabled = false;
      connection.listen((event) {
        switch (event) {
          case RawSocketEvent.read:
            Expect.fail("No read event expected");
            break;
          case RawSocketEvent.readClosed:
            connection.shutdown(SocketDirection.send);
            break;
          case RawSocketEvent.write:
            Expect.fail("No write event expected");
            break;
        }
      });
    });
    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) {
  RawSocket.connect(InternetAddress.loopbackIPv4, port).then((connection) {
    connection.listen((_) {}, onDone: () => print('SUCCESS'));
    connection.shutdown(SocketDirection.send);
  });
}
