| Index: tests/standalone/io/link_async_test.dart
|
| diff --git a/tests/standalone/io/link_async_test.dart b/tests/standalone/io/link_async_test.dart
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..0cc4a7a739dc051fd9765073342b4443b871af61
|
| --- /dev/null
|
| +++ b/tests/standalone/io/link_async_test.dart
|
| @@ -0,0 +1,223 @@
|
| +// Copyright (c) 2013, 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 "package:expect/expect.dart";
|
| +import "dart:async";
|
| +import "dart:io";
|
| +import "dart:isolate";
|
| +
|
| +// Test the dart:io Link class.
|
| +
|
| +class FutureExpect {
|
| + static Future isTrue(Future<bool> result) =>
|
| + result.then((value) => Expect.isTrue(value));
|
| + static Future isFalse(Future<bool> result) =>
|
| + result.then((value) => Expect.isFalse(value));
|
| + static Future equals(expected, Future result) =>
|
| + result.then((value) => Expect.equals(expected, value));
|
| + static Future listEquals(expected, Future result) =>
|
| + result.then((value) => Expect.listEquals(expected, value));
|
| + static Future throws(Future result) =>
|
| + result.then((value) {
|
| + throw new ExpectException(
|
| + "FutureExpect.throws received $value instead of an exception");
|
| + }, onError: (_) => null);
|
| +}
|
| +
|
| +
|
| +Future testCreate() {
|
| + return new Directory('').createTemp().then((temp) {
|
| + Path base = new Path(temp.path);
|
| + Directory baseDir = new Directory.fromPath(base);
|
| + String link = base.append('link').toNativePath();
|
| + String target = base.append('target').toNativePath();
|
| + return new Directory(target).create()
|
| + .then((_) => new Link(link).create(target))
|
| +
|
| + .then((_) => FutureExpect.equals(FileSystemEntityType.DIRECTORY,
|
| + FileSystemEntity.type(link)))
|
| + .then((_) => FutureExpect.equals(FileSystemEntityType.DIRECTORY,
|
| + FileSystemEntity.type(target)))
|
| + .then((_) => FutureExpect.equals(FileSystemEntityType.LINK,
|
| + FileSystemEntity.type(link, followLinks: false)))
|
| + .then((_) => FutureExpect.equals(FileSystemEntityType.DIRECTORY,
|
| + FileSystemEntity.type(target, followLinks: false)))
|
| + .then((_) => FutureExpect.isTrue(FileSystemEntity.isLink(link)))
|
| + .then((_) => FutureExpect.isFalse(FileSystemEntity.isLink(target)))
|
| + .then((_) => FutureExpect.isTrue(new Directory(link).exists()))
|
| + .then((_) => FutureExpect.isTrue(new Directory(target).exists()))
|
| + .then((_) => FutureExpect.isTrue(new Link(link).exists()))
|
| + .then((_) => FutureExpect.isFalse(new Link(target).exists()))
|
| + .then((_) => FutureExpect.equals(target, new Link(link).target()))
|
| + .then((_) => FutureExpect.throws(new Link(target).target()))
|
| + .then((_) {
|
| + String createdThroughLink =
|
| + base.append('link/createdThroughLink').toNativePath();
|
| + String createdDirectly =
|
| + base.append('target/createdDirectly').toNativePath();
|
| + String createdFile =
|
| + base.append('target/createdFile').toNativePath();
|
| + return new Directory(createdThroughLink).create()
|
| + .then((_) => new Directory(createdDirectly).create())
|
| + .then((_) => new File(createdFile).create())
|
| + .then((_) => FutureExpect.isTrue(
|
| + new Directory(createdThroughLink).exists()))
|
| + .then((_) => FutureExpect.isTrue(
|
| + new Directory(createdDirectly).exists()))
|
| + .then((_) => FutureExpect.isTrue(
|
| + new Directory.fromPath(base.append('link/createdDirectly')).exists()))
|
| + .then((_) => FutureExpect.isTrue(new Directory.fromPath(
|
| + base.append('target/createdThroughLink')).exists()))
|
| + .then((_) => FutureExpect.equals(FileSystemEntityType.DIRECTORY,
|
| + FileSystemEntity.type(createdThroughLink, followLinks: false)))
|
| + .then((_) => FutureExpect.equals(FileSystemEntityType.DIRECTORY,
|
| + FileSystemEntity.type(createdDirectly, followLinks: false)))
|
| +
|
| + // Test FileSystemEntity.identical on files, directories, and links,
|
| + // reached by different paths.
|
| + .then((_) => FutureExpect.isTrue(FileSystemEntity.identical(
|
| + createdDirectly,
|
| + createdDirectly)))
|
| + .then((_) => FutureExpect.isFalse(FileSystemEntity.identical(
|
| + createdDirectly,
|
| + createdThroughLink)))
|
| + .then((_) => FutureExpect.isTrue(FileSystemEntity.identical(
|
| + createdDirectly,
|
| + base.append('link/createdDirectly').toNativePath())))
|
| + .then((_) => FutureExpect.isTrue(FileSystemEntity.identical(
|
| + createdThroughLink,
|
| + base.append('target/createdThroughLink').toNativePath())))
|
| + .then((_) => FutureExpect.isFalse(FileSystemEntity.identical(
|
| + target,
|
| + link)))
|
| + .then((_) => FutureExpect.isTrue(FileSystemEntity.identical(
|
| + link,
|
| + link)))
|
| + .then((_) => FutureExpect.isTrue(FileSystemEntity.identical(
|
| + target,
|
| + target)))
|
| + .then((_) => new Link(link).target())
|
| + .then((linkTarget) => FutureExpect.isTrue(FileSystemEntity.identical(
|
| + target,
|
| + linkTarget)))
|
| + .then((_) => new File(".").fullPath())
|
| + .then((fullCurrentDir) => FutureExpect.isTrue(FileSystemEntity.identical(
|
| + ".",
|
| + fullCurrentDir)))
|
| + .then((_) => FutureExpect.isTrue(FileSystemEntity.identical(
|
| + createdFile,
|
| + createdFile)))
|
| + .then((_) => FutureExpect.isFalse(FileSystemEntity.identical(
|
| + createdFile,
|
| + createdDirectly)))
|
| + .then((_) => FutureExpect.isTrue(FileSystemEntity.identical(
|
| + createdFile,
|
| + base.append('link/createdFile').toNativePath())))
|
| + .then((_) => FutureExpect.throws(FileSystemEntity.identical(
|
| + createdFile,
|
| + base.append('link/foo').toNativePath())))
|
| +
|
| + .then((_) => testDirectoryListing(base, baseDir))
|
| + .then((_) => new Directory(target).delete(recursive: true))
|
| + .then((_) {
|
| + List<Future> futures = [];
|
| + for (bool recursive in [true, false]) {
|
| + for (bool followLinks in [true, false]) {
|
| + var result = baseDir.listSync(recursive: recursive,
|
| + followLinks: followLinks);
|
| + Expect.equals(1, result.length);
|
| + Expect.isTrue(result[0] is Link);
|
| + futures.add(FutureExpect.isTrue(
|
| + baseDir.list(recursive: recursive,
|
| + followLinks: followLinks)
|
| + .single.then((element) => element is Link)));
|
| + }
|
| + }
|
| + return Future.wait(futures);
|
| + })
|
| + .then((_) => baseDir.delete(recursive: true));
|
| + });
|
| + });
|
| +}
|
| +
|
| +
|
| +Future testCreateLoopingLink() {
|
| + return new Directory('').createTemp()
|
| + .then((dir) => new Path(dir.path))
|
| + .then((Path base) =>
|
| + new Directory.fromPath(base.append('a/b/c')).create(recursive: true)
|
| + .then((_) => new Link.fromPath(base.append('a/b/c/d'))
|
| + .create(base.append('a/b').toNativePath()))
|
| + .then((_) => new Link.fromPath(base.append('a/b/c/e'))
|
| + .create(base.append('a').toNativePath()))
|
| + .then((_) => new Directory.fromPath(base.append('a'))
|
| + .list(recursive: true, followLinks: false).last)
|
| + // This directory listing must terminate, even though it contains loops.
|
| + .then((_) => new Directory.fromPath(base.append('a'))
|
| + .list(recursive: true, followLinks: true).last)
|
| + // This directory listing must terminate, even though it contains loops.
|
| + .then((_) => new Directory.fromPath(base.append('a/b/c'))
|
| + .list(recursive: true, followLinks: true).last)
|
| + .then((_) => new Directory.fromPath(base).delete(recursive: true))
|
| + );
|
| +}
|
| +
|
| +
|
| +Future testDirectoryListing(Path base, Directory baseDir) {
|
| + Map makeExpected(bool recursive, bool followLinks) {
|
| + Map expected = new Map();
|
| + expected['target'] = 'Directory';
|
| + expected['link'] = followLinks ? 'Directory' : 'Link';
|
| + if (recursive) {
|
| + expected['target/createdDirectly'] = 'Directory';
|
| + expected['target/createdThroughLink'] = 'Directory';
|
| + expected['target/createdFile'] = 'File';
|
| + if (followLinks) {
|
| + expected['link/createdDirectly'] = 'Directory';
|
| + expected['link/createdThroughLink'] = 'Directory';
|
| + expected['link/createdFile'] = 'File';
|
| + }
|
| + }
|
| + return expected;
|
| + }
|
| +
|
| + void checkEntity(FileSystemEntity x, Map expected) {
|
| + String ending = new Path(x.path).relativeTo(base).toString();
|
| + Expect.isNotNull(expected[ending]);
|
| + Expect.isTrue(x.toString().startsWith(expected[ending]));
|
| + expected[ending] = 'Found';
|
| + }
|
| +
|
| + List futures = [];
|
| + for (bool recursive in [true, false]) {
|
| + for (bool followLinks in [true, false]) {
|
| + Map expected = makeExpected(recursive, followLinks);
|
| + for (var x in baseDir.listSync(recursive: recursive,
|
| + followLinks: followLinks)) {
|
| + checkEntity(x, expected);
|
| + }
|
| + for (var v in expected.values) {
|
| + Expect.equals('Found', v);
|
| + }
|
| + expected = makeExpected(recursive, followLinks);
|
| + futures.add(
|
| + baseDir.list(recursive: recursive, followLinks: followLinks)
|
| + .forEach((entity) => checkEntity(entity, expected))
|
| + .then((_) {
|
| + for (var v in expected.values) {
|
| + Expect.equals('Found', v);
|
| + }
|
| + })
|
| + );
|
| + }
|
| + }
|
| + return Future.wait(futures);
|
| +}
|
| +
|
| +main() {
|
| + ReceivePort keepAlive = new ReceivePort();
|
| + testCreate()
|
| + .then((_) => testCreateLoopingLink())
|
| + .then((_) => keepAlive.close());
|
| +}
|
|
|