// Copyright 2014 The Chromium Authors. 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:isolate';
import 'dart:mojo_core';
import 'dart:typed_data';

import 'package:mojo/dart/testing/expect.dart';

void simpleTest() {
  var pipe = new MojoMessagePipe();
  Expect.isNotNull(pipe);

  var endpoint = pipe.endpoints[0];
  Expect.isTrue(endpoint.handle.isValid);

  var eventStream = new MojoEventStream(endpoint.handle);
  var completer = new Completer();
  int numEvents = 0;

  eventStream.listen((_) {
    numEvents++;
    eventStream.close();
  }, onDone: () {
    completer.complete(numEvents);
  });
  eventStream.enableWriteEvents();

  completer.future.then((int numEvents) {
    Expect.equals(1, numEvents);
  });
}


Future simpleAsyncAwaitTest() async {
  var pipe = new MojoMessagePipe();
  Expect.isNotNull(pipe);

  var endpoint = pipe.endpoints[0];
  Expect.isTrue(endpoint.handle.isValid);

  var eventStream =
      new MojoEventStream(endpoint.handle, MojoHandleSignals.READWRITE);

  int numEvents = 0;
  await for (List<int> event in eventStream) {
    numEvents++;
    eventStream.close();
  }
  Expect.equals(1, numEvents);
}


ByteData byteDataOfString(String s) {
  return new ByteData.view((new Uint8List.fromList(s.codeUnits)).buffer);
}


String stringOfByteData(ByteData bytes) {
  return new String.fromCharCodes(bytes.buffer.asUint8List().toList());
}


void expectStringFromEndpoint(String expected,
                              MojoMessagePipeEndpoint endpoint) {
  // Query how many bytes are available.
  var result = endpoint.query();
  Expect.isNotNull(result);
  int size = result.bytesRead;
  Expect.isTrue(size > 0);

  // Read the data.
  ByteData bytes = new ByteData(size);
  result = endpoint.read(bytes);
  Expect.isNotNull(result);
  Expect.equals(size, result.bytesRead);

  // Convert to a string and check.
  String msg = stringOfByteData(bytes);
  Expect.equals(expected, msg);
}


Future pingPongIsolate(MojoMessagePipeEndpoint endpoint) async {
  int pings = 0;
  int pongs = 0;
  var eventStream = new MojoEventStream(endpoint.handle);
  await for (List<int> event in eventStream) {
    var mojoSignals = new MojoHandleSignals(event[1]);
    if (mojoSignals.isReadWrite) {
      // We are either sending or receiving.
      throw new Exception("Unexpected event");
    } else if (mojoSignals.isReadable) {
      expectStringFromEndpoint("Ping", endpoint);
      pings++;
      eventStream.enableWriteEvents();
    } else if (mojoSignals.isWritable) {
      endpoint.write(byteDataOfString("Pong"));
      pongs++;
      eventStream.enableReadEvents();
    }
  }
  eventStream.close();
  Expect.equals(10, pings);
  Expect.equals(10, pongs);
}


Future pingPongTest() async {
  var pipe = new MojoMessagePipe();
  var isolate = await Isolate.spawn(pingPongIsolate, pipe.endpoints[0]);
  var endpoint = pipe.endpoints[1];
  var eventStream =
      new MojoEventStream(endpoint.handle,  MojoHandleSignals.READWRITE);

  int pings = 0;
  int pongs = 0;
  await for (List<int> event in eventStream) {
    var mojoSignals = new MojoHandleSignals(event[1]);
    if (mojoSignals.isReadWrite) {
      // We are either sending or receiving.
      throw new Exception("Unexpected event");
    } else if (mojoSignals.isReadable) {
      expectStringFromEndpoint("Pong", endpoint);
      pongs++;
      if (pongs == 10) {
        eventStream.close();
      }
      eventStream.enableWriteEvents();  // Now it is our turn to send.
    } else if (mojoSignals.isWritable) {
      if (pings < 10) {
        endpoint.write(byteDataOfString("Ping"));
        pings++;
      }
      eventStream.enableReadEvents();  // Don't send while waiting for reply.
    }
  }
  Expect.equals(10, pings);
  Expect.equals(10, pongs);
}


main() async {
  simpleTest();
  await simpleAsyncAwaitTest();
  await pingPongTest();
}
