// Copyright (c) 2015, 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:convert';
import 'dart:io' as io;
import 'package:observatory/service_io.dart';
import 'package:unittest/unittest.dart';
import 'test_helper.dart';

Future setupUDP() async {
  // Service might attach to us after we completed the setup but
  // before we actually received a datagram - if it will start inspecting
  // IO metrics at that point then it will see that no reads happened
  // and the test will fail. That is why we don't consider setup complete
  // until after we received the datagram.
  final doneCompleter = Completer<void>();

  var server = await io.RawDatagramSocket.bind('127.0.0.1', 0);
  server.listen((io.RawSocketEvent event) {
    if (event == io.RawSocketEvent.read) {
      io.Datagram dg = server.receive();
      dg.data.forEach((x) => true);
      if (!doneCompleter.isCompleted) {
        doneCompleter.complete(null);
      }
    }
  });
  var client = await io.RawDatagramSocket.bind('127.0.0.1', 0);
  client.send(utf8.encoder.convert('foobar'),
      new io.InternetAddress('127.0.0.1'), server.port);

  // Wait for datagram to arrive.
  await doneCompleter.future;
}

var udpTests = <IsolateTest>[
  // Initial.
  (Isolate isolate) async {
    var result =
        await isolate.invokeRpcNoUpgrade('ext.dart.io.getOpenSockets', {});
    expect(result['type'], equals('_opensockets'));
    // We expect 2 sockets to be open (in this order):
    //   The server socket accepting connections, on port X
    //   The client socket on port Y
    expect(result['data'].length, equals(2));
    // The first socket will have a name like listening:127.0.0.1:X
    // The second will have a name like 127.0.0.1:Y
    // The third will have a name like 127.0.0.1:X
    expect(result['data'][0]['name'].startsWith('127.0.0.1'), isTrue);
    expect(result['data'][1]['name'].startsWith('127.0.0.1:'), isTrue);

    var server = await isolate.invokeRpcNoUpgrade(
        'ext.dart.io.getSocketByID', {'id': result['data'][0]['id']});
    expect(server['id'], equals(result['data'][0]['id']));
    expect(server['remotePort'], equals('NA'));
    expect(server['remoteHost'], equals('NA'));
    expect(server['listening'], isFalse);
    expect(server['socketType'], equals('UDP'));
    expect(server['port'], greaterThanOrEqualTo(1024));
    final now = DateTime.now().millisecondsSinceEpoch;
    expect(
        server['lastRead'], closeTo(now, Duration(seconds: 5).inMilliseconds));
    expect(server['totalRead'], equals(6));
    expect(server['lastWrite'], equals(0));
    expect(server['totalWritten'], equals(0));
    expect(server['writeCount'], equals(0));
    expect(server['readCount'], greaterThanOrEqualTo(1));

    var client = await isolate.invokeRpcNoUpgrade(
        'ext.dart.io.getSocketByID', {'id': result['data'][1]['id']});
    expect(client['id'], equals(result['data'][1]['id']));
    expect(client['remotePort'], equals('NA'));
    expect(client['remoteHost'], equals('NA'));
    expect(client['listening'], isFalse);
    expect(client['socketType'], equals('UDP'));
    expect(client['port'], greaterThanOrEqualTo(1024));
    expect(client['lastRead'], equals(0));
    expect(client['totalRead'], equals(0));
    // Stopwatch resolution on windows makes us sometimes report 0;
    if (io.Platform.isWindows) {
      expect(client['lastWrite'], greaterThanOrEqualTo(0));
    } else {
      expect(client['lastWrite'], greaterThan(0));
    }
    expect(client['totalWritten'], equals(6));
    expect(client['writeCount'], greaterThanOrEqualTo(1));
    expect(client['readCount'], equals(0));
  },
];

main(args) async => runIsolateTests(args, udpTests, testeeBefore: setupUDP);
