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

/// @assertion
/// Future<RandomAccessFile> lock([
///     FileLock mode = FileLock.exclusive,
///     int start = 0,
///     int end = -1
/// ])
/// Locks the file or part of the file.
///
/// By default an exclusive lock will be obtained, but that can be overridden by
/// the mode argument.
///
/// @description Checks that method lock may lock in a SHARED mode when mode
/// argument is overridden.
/// @author ngl@unipro.ru

import "dart:async";
import "dart:io";
import "../../../Utils/expect.dart";
import "../file_utils.dart";
import "lock_check_1_lib.dart";

runMain() {
  File file = getTempFileSync();
  file.writeAsBytesSync(new List.filled(6, 0));
  var rf = file.openSync(mode: FileMode.write);
  asyncStart();
  var rfLock = rf.lock(FileLock.shared, 2, 5);
  rfLock.then((RandomAccessFile f) {
    String eScript = Platform.script.toString();
    var tests = [
      () => checkUnlocked(eScript, f.path, 0, 1, FileLock.shared),
      () => checkUnlocked(eScript, f.path, 1, 2, FileLock.shared),
      () => checkLocked(eScript, f.path, 2, 3),
      () => checkLocked(eScript, f.path, 3, 4),
      () => checkLocked(eScript, f.path, 4, 5),
      () => checkUnlocked(eScript, f.path, 2, 3, FileLock.shared),
      () => checkUnlocked(eScript, f.path, 3, 4, FileLock.shared),
      () => checkUnlocked(eScript, f.path, 4, 5, FileLock.shared),
      () => checkUnlocked(eScript, f.path, 5, 6, FileLock.shared)
    ];
    Future.forEach(tests, (Function f) => f()).whenComplete(() {
      asyncEnd();
      if (Platform.isWindows) {
        rf.unlockSync(2, 5);
      } else {
        rf.unlockSync();
      }
      rf.closeSync();
      file.deleteSync();
    });
  });
}

main(List<String> args) {
  if(args.length > 0)
    runProcess(args);
  else {
    runMain();
  }
}
