// Copyright (c) 2014, 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.

library test.integration.analysis.error;

import 'dart:async';

import 'package:unittest/unittest.dart';

import '../reflective_tests.dart';
import 'integration_tests.dart';

/**
 * Verify that the server's input and output streams are asynchronous by
 * attempting to flood its input buffer with commands without listening to
 * its output buffer for responses.  The server should continue to train its
 * input buffer even though its output buffer is full.
 *
 * Once enough commands have been sent, we begin reading from the server's
 * output buffer, and verify that it responds to the last command.
 */
@ReflectiveTestCase()
class AsynchronyIntegrationTest {
  /**
   * Connection to the analysis server.
   */
  final Server server = new Server();

  /**
   * Number of messages to queue up before listening for responses.
   */
  static const MESSAGE_COUNT = 10000;

  Future setUp() {
    return server.start();
  }

  test_asynchrony() {
    // Send MESSAGE_COUNT messages to the server without listening for
    // responses.
    Future lastMessageResult;
    for (int i = 0; i < MESSAGE_COUNT; i++) {
      lastMessageResult = server.send('server.getVersion', null);
    }

    // Flush the server's standard input stream to verify that it has really
    // received them all.  If the server is blocked waiting for us to read
    // its responses, the flush will never complete.
    return server.flushCommands().then((_) {

      // Begin processing responses from the server.
      server.listenToOutput((String event, params) {
        // No notifications are expected.
        fail('Unexpected notification: $event');
      });

      // Terminate the test when the response to the last message is received.
      lastMessageResult.then((_) {
        server.send("server.shutdown", null).then((_) {
          return server.exitCode;
        });
      });
    });
  }
}

main() {
  runReflectiveTests(AsynchronyIntegrationTest);
}
