// 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 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);
  });
}
