| OLD | NEW |
| 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 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. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 library io_test; | 5 library io_test; |
| 6 | 6 |
| 7 import 'dart:io'; | 7 import 'dart:io'; |
| 8 | 8 |
| 9 import 'package:pathos/path.dart' as path; | 9 import 'package:pathos/path.dart' as path; |
| 10 import 'package:unittest/unittest.dart'; | 10 import 'package:unittest/unittest.dart'; |
| 11 | 11 |
| 12 import '../../pub/io.dart'; | 12 import '../../pub/io.dart'; |
| 13 import '../../pub/utils.dart'; | 13 import '../../pub/utils.dart'; |
| 14 import 'test_pub.dart'; | 14 import 'test_pub.dart'; |
| 15 | 15 |
| 16 main() { | 16 main() { |
| 17 initConfig(); | 17 initConfig(); |
| 18 | 18 |
| 19 group('listDir', () { | 19 group('listDir', () { |
| 20 test('lists a simple directory non-recursively', () { | 20 test('lists a simple directory non-recursively', () { |
| 21 expect(withTempDir((temp) { | 21 expect(withTempDir((temp) { |
| 22 var future = defer(() { | 22 writeTextFile(path.join(temp, 'file1.txt'), ''); |
| 23 writeTextFile(path.join(temp, 'file1.txt'), ''); | 23 writeTextFile(path.join(temp, 'file2.txt'), ''); |
| 24 writeTextFile(path.join(temp, 'file2.txt'), ''); | 24 createDir(path.join(temp, 'subdir')); |
| 25 createDir(path.join(temp, 'subdir')); | 25 writeTextFile(path.join(temp, 'subdir', 'file3.txt'), ''); |
| 26 writeTextFile(path.join(temp, 'subdir', 'file3.txt'), ''); | 26 |
| 27 return listDir(temp); | 27 expect(listDir(temp), unorderedEquals([ |
| 28 }); | |
| 29 expect(future, completion(unorderedEquals([ | |
| 30 path.join(temp, 'file1.txt'), | 28 path.join(temp, 'file1.txt'), |
| 31 path.join(temp, 'file2.txt'), | 29 path.join(temp, 'file2.txt'), |
| 32 path.join(temp, 'subdir') | 30 path.join(temp, 'subdir') |
| 33 ]))); | 31 ])); |
| 34 return future; | |
| 35 }), completes); | 32 }), completes); |
| 36 }); | 33 }); |
| 37 | 34 |
| 38 test('lists a simple directory recursively', () { | 35 test('lists a simple directory recursively', () { |
| 39 expect(withTempDir((temp) { | 36 expect(withTempDir((temp) { |
| 40 var future = defer(() { | 37 writeTextFile(path.join(temp, 'file1.txt'), ''); |
| 41 writeTextFile(path.join(temp, 'file1.txt'), ''); | 38 writeTextFile(path.join(temp, 'file2.txt'), ''); |
| 42 writeTextFile(path.join(temp, 'file2.txt'), ''); | 39 createDir(path.join(temp, 'subdir')); |
| 43 createDir(path.join(temp, 'subdir')); | 40 writeTextFile(path.join(temp, 'subdir', 'file3.txt'), ''); |
| 44 writeTextFile(path.join(temp, 'subdir', 'file3.txt'), ''); | |
| 45 return listDir(temp, recursive: true); | |
| 46 }); | |
| 47 | 41 |
| 48 expect(future, completion(unorderedEquals([ | 42 expect(listDir(temp, recursive: true), unorderedEquals([ |
| 49 path.join(temp, 'file1.txt'), | 43 path.join(temp, 'file1.txt'), |
| 50 path.join(temp, 'file2.txt'), | 44 path.join(temp, 'file2.txt'), |
| 51 path.join(temp, 'subdir'), | 45 path.join(temp, 'subdir'), |
| 52 path.join(temp, 'subdir', 'file3.txt'), | 46 path.join(temp, 'subdir', 'file3.txt'), |
| 53 ]))); | 47 ])); |
| 54 return future; | |
| 55 }), completes); | 48 }), completes); |
| 56 }); | 49 }); |
| 57 | 50 |
| 58 test('ignores hidden files by default', () { | 51 test('ignores hidden files by default', () { |
| 59 expect(withTempDir((temp) { | 52 expect(withTempDir((temp) { |
| 60 var future = defer(() { | 53 writeTextFile(path.join(temp, 'file1.txt'), ''); |
| 61 writeTextFile(path.join(temp, 'file1.txt'), ''); | 54 writeTextFile(path.join(temp, 'file2.txt'), ''); |
| 62 writeTextFile(path.join(temp, 'file2.txt'), ''); | 55 writeTextFile(path.join(temp, '.file3.txt'), ''); |
| 63 writeTextFile(path.join(temp, '.file3.txt'), ''); | 56 createDir(path.join(temp, '.subdir')); |
| 64 createDir(path.join(temp, '.subdir')); | 57 writeTextFile(path.join(temp, '.subdir', 'file3.txt'), ''); |
| 65 writeTextFile(path.join(temp, '.subdir', 'file3.txt'), ''); | 58 |
| 66 return listDir(temp, recursive: true); | 59 expect(listDir(temp, recursive: true), unorderedEquals([ |
| 67 }); | |
| 68 expect(future, completion(unorderedEquals([ | |
| 69 path.join(temp, 'file1.txt'), | 60 path.join(temp, 'file1.txt'), |
| 70 path.join(temp, 'file2.txt') | 61 path.join(temp, 'file2.txt') |
| 71 ]))); | 62 ])); |
| 72 return future; | |
| 73 }), completes); | 63 }), completes); |
| 74 }); | 64 }); |
| 75 | 65 |
| 76 test('includes hidden files when told to', () { | 66 test('includes hidden files when told to', () { |
| 77 expect(withTempDir((temp) { | 67 expect(withTempDir((temp) { |
| 78 var future = defer(() { | 68 writeTextFile(path.join(temp, 'file1.txt'), ''); |
| 79 writeTextFile(path.join(temp, 'file1.txt'), ''); | 69 writeTextFile(path.join(temp, 'file2.txt'), ''); |
| 80 writeTextFile(path.join(temp, 'file2.txt'), ''); | 70 writeTextFile(path.join(temp, '.file3.txt'), ''); |
| 81 writeTextFile(path.join(temp, '.file3.txt'), ''); | 71 createDir(path.join(temp, '.subdir')); |
| 82 createDir(path.join(temp, '.subdir')); | 72 writeTextFile(path.join(temp, '.subdir', 'file3.txt'), ''); |
| 83 writeTextFile(path.join(temp, '.subdir', 'file3.txt'), ''); | 73 |
| 84 return listDir(temp, recursive: true, includeHiddenFiles: true); | 74 expect(listDir(temp, recursive: true, includeHiddenFiles: true), |
| 85 }); | 75 unorderedEquals([ |
| 86 expect(future, completion(unorderedEquals([ | |
| 87 path.join(temp, 'file1.txt'), | 76 path.join(temp, 'file1.txt'), |
| 88 path.join(temp, 'file2.txt'), | 77 path.join(temp, 'file2.txt'), |
| 89 path.join(temp, '.file3.txt'), | 78 path.join(temp, '.file3.txt'), |
| 90 path.join(temp, '.subdir'), | 79 path.join(temp, '.subdir'), |
| 91 path.join(temp, '.subdir', 'file3.txt') | 80 path.join(temp, '.subdir', 'file3.txt') |
| 92 ]))); | 81 ])); |
| 93 return future; | |
| 94 }), completes); | 82 }), completes); |
| 95 }); | 83 }); |
| 96 | 84 |
| 97 test('returns the unresolved paths for symlinks', () { | 85 test('returns the unresolved paths for symlinks', () { |
| 98 expect(withTempDir((temp) { | 86 expect(withTempDir((temp) { |
| 99 var dirToList = path.join(temp, 'dir-to-list'); | 87 var dirToList = path.join(temp, 'dir-to-list'); |
| 100 var future = defer(() { | 88 createDir(path.join(temp, 'dir1')); |
| 101 createDir(path.join(temp, 'dir1')); | 89 writeTextFile(path.join(temp, 'dir1', 'file1.txt'), ''); |
| 102 writeTextFile(path.join(temp, 'dir1', 'file1.txt'), ''); | 90 createDir(path.join(temp, 'dir2')); |
| 103 createDir(path.join(temp, 'dir2')); | 91 writeTextFile(path.join(temp, 'dir2', 'file2.txt'), ''); |
| 104 writeTextFile(path.join(temp, 'dir2', 'file2.txt'), ''); | 92 createDir(dirToList); |
| 105 createDir(dirToList); | 93 createSymlink( |
| 106 return createSymlink(path.join(temp, 'dir1'), | 94 path.join(temp, 'dir1'), |
| 107 path.join(dirToList, 'linked-dir1')); | 95 path.join(dirToList, 'linked-dir1')); |
| 108 }).then((_) { | 96 createDir(path.join(dirToList, 'subdir')); |
| 109 createDir(path.join(dirToList, 'subdir')); | 97 createSymlink( |
| 110 return createSymlink( | 98 path.join(temp, 'dir2'), |
| 111 path.join(temp, 'dir2'), | 99 path.join(dirToList, 'subdir', 'linked-dir2')); |
| 112 path.join(dirToList, 'subdir', 'linked-dir2')); | 100 |
| 113 }).then((_) => listDir(dirToList, recursive: true)); | 101 expect(listDir(dirToList, recursive: true), unorderedEquals([ |
| 114 expect(future, completion(unorderedEquals([ | |
| 115 path.join(dirToList, 'linked-dir1'), | 102 path.join(dirToList, 'linked-dir1'), |
| 116 path.join(dirToList, 'linked-dir1', 'file1.txt'), | 103 path.join(dirToList, 'linked-dir1', 'file1.txt'), |
| 117 path.join(dirToList, 'subdir'), | 104 path.join(dirToList, 'subdir'), |
| 118 path.join(dirToList, 'subdir', 'linked-dir2'), | 105 path.join(dirToList, 'subdir', 'linked-dir2'), |
| 119 path.join(dirToList, 'subdir', 'linked-dir2', 'file2.txt'), | 106 path.join(dirToList, 'subdir', 'linked-dir2', 'file2.txt'), |
| 120 ]))); | 107 ])); |
| 121 return future; | |
| 122 }), completes); | 108 }), completes); |
| 123 }); | 109 }); |
| 124 | 110 |
| 125 test('works with recursive symlinks', () { | 111 test('works with recursive symlinks', () { |
| 126 expect(withTempDir((temp) { | 112 expect(withTempDir((temp) { |
| 127 var future = defer(() { | 113 writeTextFile(path.join(temp, 'file1.txt'), ''); |
| 128 writeTextFile(path.join(temp, 'file1.txt'), ''); | 114 createSymlink(temp, path.join(temp, 'linkdir')); |
| 129 return createSymlink(temp, path.join(temp, 'linkdir')); | 115 |
| 130 }).then((_) => listDir(temp, recursive: true)); | 116 expect(listDir(temp, recursive: true), unorderedEquals([ |
| 131 expect(future, completion(unorderedEquals([ | |
| 132 path.join(temp, 'file1.txt'), | 117 path.join(temp, 'file1.txt'), |
| 133 path.join(temp, 'linkdir') | 118 path.join(temp, 'linkdir') |
| 134 ]))); | 119 ])); |
| 135 return future; | |
| 136 }), completes); | 120 }), completes); |
| 137 }); | 121 }); |
| 138 }); | 122 }); |
| 139 | 123 |
| 140 testExistencePredicate("entryExists", entryExists, | 124 testExistencePredicate("entryExists", entryExists, |
| 141 forFile: true, | 125 forFile: true, |
| 142 forFileSymlink: true, | 126 forFileSymlink: true, |
| 143 forMultiLevelFileSymlink: true, | 127 forMultiLevelFileSymlink: true, |
| 144 forDirectory: true, | 128 forDirectory: true, |
| 145 forDirectorySymlink: true, | 129 forDirectorySymlink: true, |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 202 createDir(path); | 186 createDir(path); |
| 203 expect(predicate(path), equals(forDirectory)); | 187 expect(predicate(path), equals(forDirectory)); |
| 204 }), completes); | 188 }), completes); |
| 205 }); | 189 }); |
| 206 | 190 |
| 207 test('returns $forDirectorySymlink for a symlink to a directory', () { | 191 test('returns $forDirectorySymlink for a symlink to a directory', () { |
| 208 expect(withTempDir((temp) { | 192 expect(withTempDir((temp) { |
| 209 var targetPath = path.join(temp, "dir"); | 193 var targetPath = path.join(temp, "dir"); |
| 210 var symlinkPath = path.join(temp, "linkdir"); | 194 var symlinkPath = path.join(temp, "linkdir"); |
| 211 createDir(targetPath); | 195 createDir(targetPath); |
| 212 return createSymlink(targetPath, symlinkPath).then((_) { | 196 createSymlink(targetPath, symlinkPath); |
| 213 expect(predicate(symlinkPath), equals(forDirectorySymlink)); | 197 expect(predicate(symlinkPath), equals(forDirectorySymlink)); |
| 214 }); | |
| 215 }), completes); | 198 }), completes); |
| 216 }); | 199 }); |
| 217 | 200 |
| 218 test('returns $forMultiLevelDirectorySymlink for a multi-level symlink to ' | 201 test('returns $forMultiLevelDirectorySymlink for a multi-level symlink to ' |
| 219 'a directory', () { | 202 'a directory', () { |
| 220 expect(withTempDir((temp) { | 203 expect(withTempDir((temp) { |
| 221 var targetPath = path.join(temp, "dir"); | 204 var targetPath = path.join(temp, "dir"); |
| 222 var symlink1Path = path.join(temp, "link1dir"); | 205 var symlink1Path = path.join(temp, "link1dir"); |
| 223 var symlink2Path = path.join(temp, "link2dir"); | 206 var symlink2Path = path.join(temp, "link2dir"); |
| 224 createDir(targetPath); | 207 createDir(targetPath); |
| 225 return createSymlink(targetPath, symlink1Path) | 208 createSymlink(targetPath, symlink1Path); |
| 226 .then((_) => createSymlink(symlink1Path, symlink2Path)) | 209 createSymlink(symlink1Path, symlink2Path); |
| 227 .then((_) { | 210 expect(predicate(symlink2Path), |
| 228 expect(predicate(symlink2Path), | |
| 229 equals(forMultiLevelDirectorySymlink)); | 211 equals(forMultiLevelDirectorySymlink)); |
| 230 }); | |
| 231 }), completes); | 212 }), completes); |
| 232 }); | 213 }); |
| 233 | 214 |
| 234 test('returns $forBrokenSymlink for a broken symlink', () { | 215 test('returns $forBrokenSymlink for a broken symlink', () { |
| 235 expect(withTempDir((temp) { | 216 expect(withTempDir((temp) { |
| 236 var targetPath = path.join(temp, "dir"); | 217 var targetPath = path.join(temp, "dir"); |
| 237 var symlinkPath = path.join(temp, "linkdir"); | 218 var symlinkPath = path.join(temp, "linkdir"); |
| 238 createDir(targetPath); | 219 createDir(targetPath); |
| 239 return createSymlink(targetPath, symlinkPath).then((_) { | 220 createSymlink(targetPath, symlinkPath); |
| 240 deleteEntry(targetPath); | 221 deleteEntry(targetPath); |
| 241 expect(predicate(symlinkPath), equals(forBrokenSymlink)); | 222 expect(predicate(symlinkPath), equals(forBrokenSymlink)); |
| 242 }); | |
| 243 }), completes); | 223 }), completes); |
| 244 }); | 224 }); |
| 245 | 225 |
| 246 test('returns $forMultiLevelBrokenSymlink for a multi-level broken symlink', | 226 test('returns $forMultiLevelBrokenSymlink for a multi-level broken symlink', |
| 247 () { | 227 () { |
| 248 expect(withTempDir((temp) { | 228 expect(withTempDir((temp) { |
| 249 var targetPath = path.join(temp, "dir"); | 229 var targetPath = path.join(temp, "dir"); |
| 250 var symlink1Path = path.join(temp, "link1dir"); | 230 var symlink1Path = path.join(temp, "link1dir"); |
| 251 var symlink2Path = path.join(temp, "link2dir"); | 231 var symlink2Path = path.join(temp, "link2dir"); |
| 252 createDir(targetPath); | 232 createDir(targetPath); |
| 253 return createSymlink(targetPath, symlink1Path) | 233 createSymlink(targetPath, symlink1Path); |
| 254 .then((_) => createSymlink(symlink1Path, symlink2Path)) | 234 createSymlink(symlink1Path, symlink2Path); |
| 255 .then((_) { | 235 deleteEntry(targetPath); |
| 256 deleteEntry(targetPath); | 236 expect(predicate(symlink2Path), equals(forMultiLevelBrokenSymlink)); |
| 257 expect(predicate(symlink2Path), equals(forMultiLevelBrokenSymlink)); | |
| 258 }); | |
| 259 }), completes); | 237 }), completes); |
| 260 }); | 238 }); |
| 261 | 239 |
| 262 // Windows doesn't support symlinking to files. | 240 // Windows doesn't support symlinking to files. |
| 263 if (Platform.operatingSystem != 'windows') { | 241 if (Platform.operatingSystem != 'windows') { |
| 264 test('returns $forFileSymlink for a symlink to a file', () { | 242 test('returns $forFileSymlink for a symlink to a file', () { |
| 265 expect(withTempDir((temp) { | 243 expect(withTempDir((temp) { |
| 266 var targetPath = path.join(temp, "test.txt"); | 244 var targetPath = path.join(temp, "test.txt"); |
| 267 var symlinkPath = path.join(temp, "link.txt"); | 245 var symlinkPath = path.join(temp, "link.txt"); |
| 268 writeTextFile(targetPath, "contents"); | 246 writeTextFile(targetPath, "contents"); |
| 269 return createSymlink(targetPath, symlinkPath).then((_) { | 247 createSymlink(targetPath, symlinkPath); |
| 270 expect(predicate(symlinkPath), equals(forFileSymlink)); | 248 expect(predicate(symlinkPath), equals(forFileSymlink)); |
| 271 }); | |
| 272 }), completes); | 249 }), completes); |
| 273 }); | 250 }); |
| 274 | 251 |
| 275 test('returns $forMultiLevelFileSymlink for a multi-level symlink to a ' | 252 test('returns $forMultiLevelFileSymlink for a multi-level symlink to a ' |
| 276 'file', () { | 253 'file', () { |
| 277 expect(withTempDir((temp) { | 254 expect(withTempDir((temp) { |
| 278 var targetPath = path.join(temp, "test.txt"); | 255 var targetPath = path.join(temp, "test.txt"); |
| 279 var symlink1Path = path.join(temp, "link1.txt"); | 256 var symlink1Path = path.join(temp, "link1.txt"); |
| 280 var symlink2Path = path.join(temp, "link2.txt"); | 257 var symlink2Path = path.join(temp, "link2.txt"); |
| 281 writeTextFile(targetPath, "contents"); | 258 writeTextFile(targetPath, "contents"); |
| 282 return createSymlink(targetPath, symlink1Path) | 259 createSymlink(targetPath, symlink1Path); |
| 283 .then((_) => createSymlink(symlink1Path, symlink2Path)) | 260 createSymlink(symlink1Path, symlink2Path); |
| 284 .then((_) { | 261 expect(predicate(symlink2Path), equals(forMultiLevelFileSymlink)); |
| 285 expect(predicate(symlink2Path), equals(forMultiLevelFileSymlink)); | |
| 286 }); | |
| 287 }), completes); | 262 }), completes); |
| 288 }); | 263 }); |
| 289 } | 264 } |
| 290 }); | 265 }); |
| 291 } | 266 } |
| OLD | NEW |