OLD | NEW |
(Empty) | |
| 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. |
| 4 // |
| 5 // Dart test program for testing FileSystemEntity.resolveSymbolicLinks |
| 6 |
| 7 import "package:expect/expect.dart"; |
| 8 import "package:path/path.dart"; |
| 9 import "package:async_helper/async_helper.dart"; |
| 10 import 'dart:async'; |
| 11 import 'dart:io'; |
| 12 |
| 13 main() { |
| 14 String testsDir = dirname(dirname(dirname(Platform.script))); |
| 15 // All of these tests test that resolveSymbolicLinks gives a path |
| 16 // that points to the same place as the original, and that it removes |
| 17 // all links, .., and . segments, and that it produces an absolute path. |
| 18 asyncTest(() => testFile(join( |
| 19 testsDir, 'standalone', 'io', 'resolve_symbolic_links_test.dart'))); |
| 20 asyncTest(() => testFile(join(testsDir, 'standalone', 'io', '..', 'io', |
| 21 'resolve_symbolic_links_test.dart'))); |
| 22 |
| 23 asyncTest(() => testDir(join(testsDir, 'standalone', 'io'))); |
| 24 asyncTest(() => testDir(join(testsDir, 'lib', '..', 'standalone', 'io'))); |
| 25 // Test a relative path. |
| 26 asyncTest(() => testDir('.')); |
| 27 if (Platform.isWindows) { |
| 28 asyncTest(() =>testFile(join('\\\\?\\$testsDir', 'standalone', 'io', |
| 29 'resolve_symbolic_links_test.dart'))); |
| 30 asyncTest(() => testDir('\\\\?\\$testsDir')); |
| 31 } |
| 32 asyncTest(() => new Directory('').createTemp().then((tempDir) { |
| 33 String temp = tempDir.path; |
| 34 return makeEntities(temp).then((_) => Future.wait( |
| 35 [testFile(join(temp, 'dir1', 'file1')), |
| 36 testFile(join(temp, 'link1', 'file2')), |
| 37 testDir(join(temp, 'dir1', 'dir2', '..', '.', '..', 'dir1')), |
| 38 testDir(join(temp, 'dir1', 'dir2', '..', '.', '..', 'dir1')), |
| 39 testLink(join(temp, 'link1'))])) |
| 40 .then((_) { |
| 41 if (Platform.isWindows) { |
| 42 // Windows applies '..' to a link without resolving the link first. |
| 43 return Future.wait([ |
| 44 testFile(join( |
| 45 temp, 'dir1', '..', 'link1', '..', 'dir1', 'dir2', 'file2')), |
| 46 testDir(join(temp, 'dir1', '..', 'link1', '..', 'dir1')), |
| 47 testLink(join(temp, 'link1', '..', 'link1'))]); |
| 48 } else { |
| 49 // Non-Windows platforms resolve the link before adding the '..'. |
| 50 return Future.wait([ |
| 51 testFile(join( |
| 52 temp, 'dir1', '..', 'link1', '..', 'dir2', 'file2')), |
| 53 testDir(join(temp, 'dir1', '..', 'link1', '..', 'dir2')), |
| 54 testLink(join(temp, 'link1', '..', '..', 'link1'))]); |
| 55 } |
| 56 }) |
| 57 .then((_) { |
| 58 Directory.current = temp; |
| 59 return Future.wait([ |
| 60 testFile('dir1/dir2/file2'), // Test forward slashes on Windows too. |
| 61 testFile('link1/file2'), |
| 62 testFile(join('dir1', '..', 'dir1', '.', 'file1')), |
| 63 testDir('.'), |
| 64 testLink('link1')]); |
| 65 }) |
| 66 .then((_) { |
| 67 Directory.current = 'link1'; |
| 68 if (Platform.isWindows) { |
| 69 return Future.wait([ |
| 70 testFile('file2'), |
| 71 // Windows applies '..' to a link without resolving the link first. |
| 72 testFile('..\\dir1\\file1'), |
| 73 testLink('.'), |
| 74 testDir('..'), |
| 75 testLink('..\\link1')]); |
| 76 } else { |
| 77 return Future.wait([ |
| 78 testFile('file2'), |
| 79 // On non-Windows the link is changed to dir1/dir2 before .. happens. |
| 80 testFile('../dir2/file2'), |
| 81 testDir('.'), |
| 82 testDir('..'), |
| 83 testLink('../../link1')]); |
| 84 } |
| 85 }) |
| 86 .whenComplete(() { |
| 87 Directory.current = testsDir; |
| 88 tempDir.delete(recursive: true); |
| 89 }); |
| 90 })); |
| 91 } |
| 92 |
| 93 Future makeEntities(String temp) { |
| 94 return new Directory(join(temp, 'dir1', 'dir2')).create(recursive: true) |
| 95 .then((_) => new File(join(temp, 'dir1', 'dir2', 'file2')).create()) |
| 96 .then((_) => new File(join(temp, 'dir1', 'file1')).create()) |
| 97 .then((_) => new Link(join(temp, 'link1')) |
| 98 .create(join(temp, 'dir1', 'dir2'))); |
| 99 } |
| 100 |
| 101 Future testFile(String name) { |
| 102 // We test that f.resolveSymbolicLinks points to the same place |
| 103 // as f, because the actual resolved path is not easily predictable. |
| 104 // The location of the temp directory varies from system to system, |
| 105 // and its path includes symbolic links on some systems. |
| 106 //Expect.isTrue(FileSystemEntity.identicalSync(name, |
| 107 // new File(name).resolveSymbolicLinksSync())); |
| 108 return new File(name).resolveSymbolicLinks().then((String resolved) { |
| 109 //Expect.isTrue(FileSystemEntity.identicalSync(name, resolved)); |
| 110 Expect.isTrue(isAbsolute(resolved)); |
| 111 // Test that resolveSymbolicLinks removes all links, .., and . segments. |
| 112 Expect.isFalse(resolved.contains('..')); |
| 113 Expect.isFalse(resolved.contains('./')); |
| 114 Expect.isFalse(resolved.contains('link1')); |
| 115 }); |
| 116 } |
| 117 |
| 118 Future testDir(String name) { |
| 119 Expect.isTrue(FileSystemEntity.identicalSync(name, |
| 120 new Directory(name).resolveSymbolicLinksSync())); |
| 121 return new Directory(name).resolveSymbolicLinks().then((String resolved) { |
| 122 Expect.isTrue(FileSystemEntity.identicalSync(name, resolved)); |
| 123 Expect.isTrue(isAbsolute(resolved)); |
| 124 // Test that resolveSymbolicLinks removes all links, .., and . segments. |
| 125 Expect.isFalse(resolved.contains('..')); |
| 126 Expect.isFalse(resolved.contains('./')); |
| 127 Expect.isFalse(resolved.contains('link1')); |
| 128 }); |
| 129 } |
| 130 |
| 131 Future testLink(String name) { |
| 132 Expect.isFalse(FileSystemEntity.identicalSync(name, |
| 133 new Link(name).resolveSymbolicLinksSync())); |
| 134 Expect.isTrue(FileSystemEntity.identicalSync(new Link(name).targetSync(), |
| 135 new Link(name).resolveSymbolicLinksSync())); |
| 136 return new Link(name).resolveSymbolicLinks().then((String resolved) { |
| 137 Expect.isFalse(FileSystemEntity.identicalSync(name, resolved)); |
| 138 Expect.isTrue(isAbsolute(resolved)); |
| 139 // Test that resolveSymbolicLinks removes all links, .., and . segments. |
| 140 Expect.isFalse(resolved.contains('..')); |
| 141 Expect.isFalse(resolved.contains('./')); |
| 142 Expect.isFalse(resolved.contains('link1')); |
| 143 return new Link(name).target() |
| 144 .then((targetName) => FileSystemEntity.identical(targetName, resolved)) |
| 145 .then((identical) => Expect.isTrue(identical)); |
| 146 }); |
| 147 } |
OLD | NEW |