// Copyright (c) 2012, 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 test program for testing that isolates can communicate to isolates
// other than the main isolate.

library CrossIsolateMessageTest;
import 'dart:isolate';
import '../../pkg/unittest/lib/unittest.dart';

void crossIsolate1() {
  port.receive((msg, replyTo) {
    SendPort otherIsolate = msg;
    ReceivePort receivePort = new ReceivePort();
    receivePort.receive((msg, replyTo) {
      otherIsolate.send(msg + 58, null);  // 100.
      receivePort.close();
    });
    replyTo.send(['ready', receivePort.toSendPort()]);
    port.close();
  });
}

// crossIsolate2 is nearly the same as crossIsolate1, but contains a
// different constant.
void crossIsolate2() {
  port.receive((msg, replyTo) {
    SendPort mainIsolate = msg;
    ReceivePort receivePort = new ReceivePort();
    receivePort.receive((msg, replyTo) {
      mainIsolate.send(msg + 399, null); // 499.
      receivePort.close();
    });
    replyTo.send(['ready', receivePort.toSendPort()]);
    port.close();
  });
}

main() {
  test("share port, and send message cross isolates ", () {
    SendPort port1 = spawnFunction(crossIsolate1);
    SendPort port2 = spawnFunction(crossIsolate2);
    // Create a new receive port and send it to isolate2.
    ReceivePort myPort = new ReceivePort();
    port2.call(myPort.toSendPort()).then(expectAsync1((msg) {
      expect(msg[0], "ready");
      // Send port of isolate2 to isolate1.
      port1.call(msg[1]).then(expectAsync1((msg) {
        expect(msg[0], "ready");
        myPort.receive(expectAsync2((msg, replyTo) {
          expect(msg, 499);
          myPort.close();
        }));
        msg[1].send(42, null);
      }));
    }));
  });
}
