/*
 * 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.
 */
/**
 * @description Used in lock and unlock tests.
 * @author ngl@unipro.ru
 */
library lock_check_3_lib;

import "dart:io";
import "../../../Utils/expect.dart";

// Check whether the file is locked or not.
checkLock(String script, String path, int start, int end, FileLock mode,
    {bool locked = false}) {
  // Client process returns either 'LOCK FAILED' or 'LOCK SUCCEEDED'.
  var expected = locked ? 'LOCK FAILED' : 'LOCK SUCCEEDED';
  var loc_mode;
  switch (mode) {
    case FileLock.shared:
      loc_mode = 'SHARED';
      expected = 'LOCK FAILED';
      break;
    case FileLock.exclusive:
      loc_mode = 'EXCLUSIVE';
      expected = 'LOCK FAILED';
      break;
    case FileLock.blockingShared:
      loc_mode = 'BLOCKING_SHARED';
      break;
    case FileLock.blockingExclusive:
      loc_mode = 'BLOCKING_EXCLUSIVE';
  }
  var arguments = new List<String>.empty(growable: true)
    ..addAll(Platform.executableArguments)
    ..add(script)
    ..add(path)
    ..add(loc_mode)
    ..add('$start')
    ..add('$end');
  return Process.run(Platform.executable, arguments)
      .then((ProcessResult result) {
    if (result.exitCode != 0 || !result.stdout.contains(expected)) {
      print("Client failed, exit code ${result.exitCode}");
      print("  stdout:");
      print(result.stdout);
      print("  stderr:");
      print(result.stderr);
      print("  arguments:");
      print(arguments);
      Expect.fail('Client subprocess exit code: ${result.exitCode}');
    }
  });
}

checkLocked(String script, String path,
        [int start = 0, int end = -1, FileLock mode = FileLock.exclusive]) =>
    checkLock(script, path, start, end, mode, locked: true);

checkUnlocked(String script, String path,
        [int start = 0, int end = -1, FileLock mode = FileLock.exclusive]) =>
    checkLock(script, path, start, end, mode, locked: false);

runProcess(List<String> args) {
  if (args.length == 0) {
    return 0;
  }
  File file = new File(args[0]);
  int start = 0;
  int end = 0;
  var mode = FileLock.exclusive;
  switch (args[1]) {
    case 'SHARED':
      mode = FileLock.shared;
      break;
    case 'BLOCKING_SHARED':
      mode = FileLock.blockingShared;
      break;
    case 'BLOCKING_EXCLUSIVE':
      mode = FileLock.blockingExclusive;
  }
  if (args[2] != 'null') {
    start = int.parse(args[2]);
  }
  if (args[3] != 'null') {
    end = int.parse(args[3]);
  }
  var raf = file.openSync(mode: FileMode.append);

  try {
    raf.lockSync(mode, start, end);
    print('LOCK SUCCEEDED');
  } catch (e) {
    print('LOCK FAILED');
  } finally {
    raf.closeSync();
  }
}
