// Copyright (c) 2017, 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:io';

import 'package:bazel_worker/driver.dart';
import 'package:cli_util/cli_util.dart';
import 'package:path/path.dart' as p;
import 'package:test/test.dart';

void main() {
  var sdkPath = getSdkPath();
  var dart = p.join(sdkPath, 'bin', 'dart');
  runE2eTestForWorker('sync worker',
      () => Process.start(dart, [p.join('bin', 'sync_worker.dart')]));
  runE2eTestForWorker('async worker',
      () => Process.start(dart, [p.join('bin', 'async_worker.dart')]));
}

void runE2eTestForWorker(String groupName, SpawnWorker spawnWorker) {
  BazelWorkerDriver driver;
  group(groupName, () {
    setUp(() {
      driver = new BazelWorkerDriver(spawnWorker);
    });

    tearDown(() async {
      await driver.terminateWorkers();
    });

    test('single work request', () async {
      await _doRequests(driver, count: 1);
    });

    test('lots of requests', () async {
      await _doRequests(driver, count: 1000);
    });
  });
}

/// Runs [count] work requests through [driver], and asserts that they all
/// completed with the correct response.
Future _doRequests(BazelWorkerDriver driver, {int count}) async {
  count ??= 100;
  var requests = new List.generate(count, (requestNum) {
    var request = new WorkRequest();
    request.arguments
        .addAll(new List.generate(requestNum, (argNum) => '$argNum'));
    return request;
  });
  var responses = await Future.wait(requests.map(driver.doWork));
  for (int i = 0; i < responses.length; i++) {
    var request = requests[i];
    var response = responses[i];
    expect(response.exitCode, EXIT_CODE_OK);
    expect(response.output, request.arguments.join('\n'));
  }
}
