// 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.

// @dart = 2.9

/// @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();
  }
}
