Skip to content

Commit

Permalink
#2291. Update Link.create() according to the documentation. Part 2 (#…
Browse files Browse the repository at this point in the history
  • Loading branch information
sgrekhov authored Oct 10, 2023
1 parent dc7dd6a commit 167b1d6
Show file tree
Hide file tree
Showing 10 changed files with 825 additions and 0 deletions.
77 changes: 77 additions & 0 deletions LibTest/io/Link/create_A04_t07.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
// Copyright (c) 2023, 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<Link> create(
/// String target, {
/// bool recursive: false
/// })
/// Creates a symbolic link in the file system.
///
/// The created link will point to the path at `target`, whether that path
/// exists or not.
///
/// Returns a `Future<Link>` that completes with the link when it has been
/// created. If the link path already exists, the future will complete with an
/// error.
///
/// If `recursive` is `false`, the default, the link is created only if all
/// directories in its path exist. If `recursive` is `true`, all non-existing
/// parent paths are created first. The directories in the path of target are
/// not affected, unless they are also in [path].
///
/// On the Windows platform, this call will create a true symbolic link instead
/// of a junction. The link represents a file or directory and does not change
/// its type after creation. If `target` exists then the type of the link will
/// match the type `target`, otherwise a file symlink is created.
///
/// In order to create a symbolic link on Windows, Dart must be run in
/// Administrator mode or the system must have Developer Mode enabled, otherwise
/// a [FileSystemException] will be raised with `ERROR_PRIVILEGE_NOT_HELD` set
/// as the errno when this call is made.
///
/// On other platforms, the POSIX `symlink()` call is used to make a symbolic
/// link containing the string `target`. If `target` is a relative path, it will
/// be interpreted relative to the directory containing the link.
///
/// @description Checks that if a link with the target directory was created and
/// then this directory was deleted and created again, then the link stays valid
/// @author [email protected]
import "dart:io";
import "../../../Utils/expect.dart";
import "../file_utils.dart";

main() async {
await inSandbox(_main);
}

_main(Directory sandbox) async {
Directory target1 = getTempDirectorySync(parent: sandbox);
Link link = Link(getTempFilePath(parent: sandbox));
asyncStart();
await link.create(target1.path).then((Link created) {
Expect.equals(FileSystemEntityType.directory,
FileSystemEntity.typeSync(created.path));
target1.deleteSync();
if (Platform.isWindows) {
Expect.equals(
FileSystemEntityType.link, FileSystemEntity.typeSync(created.path));
} else {
Expect.equals(FileSystemEntityType.notFound,
FileSystemEntity.typeSync(created.path));
}
Directory target2 = Directory(target1.path);
target2.createSync();
Expect.equals(FileSystemEntityType.directory,
FileSystemEntity.typeSync(created.path));
target2.deleteSync();

Link target3 = Link(target1.path);
Directory linkTarget = getTempDirectorySync();
target3.createSync(linkTarget.path);
Expect.equals(FileSystemEntityType.directory,
FileSystemEntity.typeSync(created.path));
asyncEnd();
});
}
88 changes: 88 additions & 0 deletions LibTest/io/Link/create_A04_t08.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
// Copyright (c) 2023, 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<Link> create(
/// String target, {
/// bool recursive: false
/// })
/// Creates a symbolic link in the file system.
///
/// The created link will point to the path at `target`, whether that path
/// exists or not.
///
/// Returns a `Future<Link>` that completes with the link when it has been
/// created. If the link path already exists, the future will complete with an
/// error.
///
/// If `recursive` is `false`, the default, the link is created only if all
/// directories in its path exist. If `recursive` is `true`, all non-existing
/// parent paths are created first. The directories in the path of target are
/// not affected, unless they are also in [path].
///
/// On the Windows platform, this call will create a true symbolic link instead
/// of a junction. The link represents a file or directory and does not change
/// its type after creation. If `target` exists then the type of the link will
/// match the type `target`, otherwise a file symlink is created.
///
/// In order to create a symbolic link on Windows, Dart must be run in
/// Administrator mode or the system must have Developer Mode enabled, otherwise
/// a [FileSystemException] will be raised with `ERROR_PRIVILEGE_NOT_HELD` set
/// as the errno when this call is made.
///
/// On other platforms, the POSIX `symlink()` call is used to make a symbolic
/// link containing the string `target`. If `target` is a relative path, it will
/// be interpreted relative to the directory containing the link.
///
/// @description Checks that if a link with the target directory was created and
/// then this directory was deleted and a file with the same name created, then
/// on Windows the link became invalid on other platforms it changes its type
/// @author [email protected]
import "dart:io";
import "../../../Utils/expect.dart";
import "../file_utils.dart";

main() async {
await inSandbox(_main);
}

_main(Directory sandbox) async {
Directory target1 = getTempDirectorySync(parent: sandbox);
Link link = Link(getTempFilePath(parent: sandbox));
asyncStart();
await link.create(target1.path).then((Link created) {
Expect.equals(FileSystemEntityType.directory,
FileSystemEntity.typeSync(created.path));
target1.deleteSync();
if (Platform.isWindows) {
Expect.equals(
FileSystemEntityType.link, FileSystemEntity.typeSync(created.path));
} else {
Expect.equals(FileSystemEntityType.notFound,
FileSystemEntity.typeSync(created.path));
}
File target2 = File(target1.path);
target2.createSync();
if (Platform.isWindows) {
Expect.equals(
FileSystemEntityType.link, FileSystemEntity.typeSync(created.path));
} else {
Expect.equals(FileSystemEntityType.file,
FileSystemEntity.typeSync(created.path));
}
target2.deleteSync();

Link target3 = Link(target1.path);
File linkTarget = getTempFileSync();
target3.createSync(linkTarget.path);
if (Platform.isWindows) {
Expect.equals(
FileSystemEntityType.link, FileSystemEntity.typeSync(created.path));
} else {
Expect.equals(FileSystemEntityType.file,
FileSystemEntity.typeSync(created.path));
}
asyncEnd();
});
}
77 changes: 77 additions & 0 deletions LibTest/io/Link/create_A04_t09.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
// Copyright (c) 2023, 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<Link> create(
/// String target, {
/// bool recursive: false
/// })
/// Creates a symbolic link in the file system.
///
/// The created link will point to the path at `target`, whether that path
/// exists or not.
///
/// Returns a `Future<Link>` that completes with the link when it has been
/// created. If the link path already exists, the future will complete with an
/// error.
///
/// If `recursive` is `false`, the default, the link is created only if all
/// directories in its path exist. If `recursive` is `true`, all non-existing
/// parent paths are created first. The directories in the path of target are
/// not affected, unless they are also in [path].
///
/// On the Windows platform, this call will create a true symbolic link instead
/// of a junction. The link represents a file or directory and does not change
/// its type after creation. If `target` exists then the type of the link will
/// match the type `target`, otherwise a file symlink is created.
///
/// In order to create a symbolic link on Windows, Dart must be run in
/// Administrator mode or the system must have Developer Mode enabled, otherwise
/// a [FileSystemException] will be raised with `ERROR_PRIVILEGE_NOT_HELD` set
/// as the errno when this call is made.
///
/// On other platforms, the POSIX `symlink()` call is used to make a symbolic
/// link containing the string `target`. If `target` is a relative path, it will
/// be interpreted relative to the directory containing the link.
///
/// @description Checks that if a link with the target file was created and
/// then this file was deleted and created again, then the link stays valid
/// @author [email protected]
import "dart:io";
import "../../../Utils/expect.dart";
import "../file_utils.dart";

main() async {
await inSandbox(_main);
}

_main(Directory sandbox) async {
File target1 = getTempFileSync(parent: sandbox);
Link link = Link(getTempFilePath(parent: sandbox));
asyncStart();
await link.create(target1.path).then((Link created) {
Expect.equals(
FileSystemEntityType.file, FileSystemEntity.typeSync(created.path));
target1.deleteSync();
if (Platform.isWindows) {
Expect.equals(
FileSystemEntityType.link, FileSystemEntity.typeSync(created.path));
} else {
Expect.equals(FileSystemEntityType.notFound,
FileSystemEntity.typeSync(created.path));
}
File target2 = File(target1.path);
target2.createSync();
Expect.equals(FileSystemEntityType.file,
FileSystemEntity.typeSync(created.path));
target2.deleteSync();

Link target3 = Link(target1.path);
File linkTarget = getTempFileSync();
target3.createSync(linkTarget.path);
Expect.equals(FileSystemEntityType.file,
FileSystemEntity.typeSync(created.path));
asyncEnd();
});
}
88 changes: 88 additions & 0 deletions LibTest/io/Link/create_A04_t10.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
// Copyright (c) 2023, 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<Link> create(
/// String target, {
/// bool recursive: false
/// })
/// Creates a symbolic link in the file system.
///
/// The created link will point to the path at `target`, whether that path
/// exists or not.
///
/// Returns a `Future<Link>` that completes with the link when it has been
/// created. If the link path already exists, the future will complete with an
/// error.
///
/// If `recursive` is `false`, the default, the link is created only if all
/// directories in its path exist. If `recursive` is `true`, all non-existing
/// parent paths are created first. The directories in the path of target are
/// not affected, unless they are also in [path].
///
/// On the Windows platform, this call will create a true symbolic link instead
/// of a junction. The link represents a file or directory and does not change
/// its type after creation. If `target` exists then the type of the link will
/// match the type `target`, otherwise a file symlink is created.
///
/// In order to create a symbolic link on Windows, Dart must be run in
/// Administrator mode or the system must have Developer Mode enabled, otherwise
/// a [FileSystemException] will be raised with `ERROR_PRIVILEGE_NOT_HELD` set
/// as the errno when this call is made.
///
/// On other platforms, the POSIX `symlink()` call is used to make a symbolic
/// link containing the string `target`. If `target` is a relative path, it will
/// be interpreted relative to the directory containing the link.
///
/// @description Checks that if a link with the target file was created and then
/// this file was deleted and a directory with the same name created, then
/// on Windows the link became invalid on other platforms it changes its type
/// @author [email protected]
import "dart:io";
import "../../../Utils/expect.dart";
import "../file_utils.dart";

main() async {
await inSandbox(_main);
}

_main(Directory sandbox) async {
File target1 = getTempFileSync(parent: sandbox);
Link link = Link(getTempFilePath(parent: sandbox));
asyncStart();
await link.create(target1.path).then((Link created) {
Expect.equals(FileSystemEntityType.file,
FileSystemEntity.typeSync(created.path));
target1.deleteSync();
if (Platform.isWindows) {
Expect.equals(
FileSystemEntityType.link, FileSystemEntity.typeSync(created.path));
} else {
Expect.equals(FileSystemEntityType.notFound,
FileSystemEntity.typeSync(created.path));
}
Directory target2 = Directory(target1.path);
target2.createSync();
if (Platform.isWindows) {
Expect.equals(
FileSystemEntityType.link, FileSystemEntity.typeSync(created.path));
} else {
Expect.equals(FileSystemEntityType.directory,
FileSystemEntity.typeSync(created.path));
}
target2.deleteSync();

Link target3 = Link(target1.path);
Directory linkTarget = getTempDirectorySync();
target3.createSync(linkTarget.path);
if (Platform.isWindows) {
Expect.equals(
FileSystemEntityType.link, FileSystemEntity.typeSync(created.path));
} else {
Expect.equals(FileSystemEntityType.file,
FileSystemEntity.typeSync(created.path));
}
asyncEnd();
});
}
Loading

0 comments on commit 167b1d6

Please sign in to comment.