Index: packages/quiver/test/io_test.dart |
diff --git a/packages/quiver/test/io_test.dart b/packages/quiver/test/io_test.dart |
new file mode 100644 |
index 0000000000000000000000000000000000000000..a194f8b19ae5c725553fa11ba7d8879cfc0d0bd2 |
--- /dev/null |
+++ b/packages/quiver/test/io_test.dart |
@@ -0,0 +1,135 @@ |
+// Copyright 2013 Google Inc. All Rights Reserved. |
+// |
+// Licensed under the Apache License, Version 2.0 (the "License"); |
+// you may not use this file except in compliance with the License. |
+// You may obtain a copy of the License at |
+// |
+// http://www.apache.org/licenses/LICENSE-2.0 |
+// |
+// Unless required by applicable law or agreed to in writing, software |
+// distributed under the License is distributed on an "AS IS" BASIS, |
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
+// See the License for the specific language governing permissions and |
+// limitations under the License. |
+ |
+library quiver.io_test; |
+ |
+import 'dart:async'; |
+import 'dart:convert'; |
+import 'dart:io'; |
+ |
+import 'package:path/path.dart' as path; |
+import 'package:quiver/io.dart'; |
+import 'package:test/test.dart'; |
+ |
+main() { |
+ group('byteStreamToString', () { |
+ test('should decode UTF8 text by default', () { |
+ var string = '箙、靫'; |
+ var encoded = UTF8.encoder.convert(string); |
+ var data = [encoded.sublist(0, 3), encoded.sublist(3)]; |
+ var stream = new Stream.fromIterable(data); |
+ byteStreamToString(stream).then((decoded) { |
+ expect(decoded, string); |
+ }); |
+ }); |
+ |
+ test('should decode text with the specified encoding', () { |
+ var string = 'blåbærgrød'; |
+ var encoded = LATIN1.encoder.convert(string); |
+ var data = [encoded.sublist(0, 4), encoded.sublist(4)]; |
+ var stream = new Stream.fromIterable(data); |
+ byteStreamToString(stream, encoding: LATIN1).then((decoded) { |
+ expect(decoded, string); |
+ }); |
+ }); |
+ }); |
+ |
+ group('visitDirectory', () { |
+ var testPath; |
+ var testDir; |
+ |
+ setUp(() { |
+ testDir = Directory.systemTemp.createTempSync(); |
+ testPath = testDir.path; |
+ }); |
+ |
+ tearDown(() { |
+ if (testDir.existsSync()) testDir.deleteSync(recursive: true); |
+ }); |
+ |
+ /* |
+ * Tests listing 7 cases of files, directories and links: |
+ * 1. A file |
+ * 2. A directory |
+ * 3. A file in a directory |
+ * 4. A link to a file |
+ * 5. A link to a directory |
+ * 6 A file in a directory, reached by a link to that directory |
+ * 7. A broken link |
+ */ |
+ test('should handle symlinks', () { |
+ new File(path.join(testPath, 'file_target')).createSync(); |
+ new Directory(path.join(testPath, 'dir_target')).createSync(); |
+ new File(path.join(testPath, 'dir_target/file')).createSync(); |
+ new Link(path.join(testPath, 'file_link')).createSync('file_target'); |
+ new Link(path.join(testPath, 'dir_link')).createSync('dir_target'); |
+ new Link(path.join(testPath, 'broken_link')).createSync('broken_target'); |
+ |
+ var results = []; |
+ |
+ return visitDirectory(testDir, (FileSystemEntity e) { |
+ if (e is File) { |
+ results.add("file: ${e.path}"); |
+ } else if (e is Directory) { |
+ results.add("dir: ${e.path}"); |
+ } else if (e is Link) { |
+ results.add("link: ${e.path}, ${e.targetSync()}"); |
+ } else { |
+ throw "bad"; |
+ } |
+ return new Future.value(true); |
+ }).then((_) { |
+ var expectation = [ |
+ "file: $testPath/file_target", |
+ "dir: $testPath/dir_target", |
+ "file: $testPath/dir_target/file", |
+ "link: $testPath/file_link, file_target", |
+ "link: $testPath/dir_link, dir_target", |
+ "file: $testPath/dir_link/file", |
+ "link: $testPath/broken_link, broken_target", |
+ ]; |
+ expect(results, unorderedEquals(expectation)); |
+ }); |
+ }); |
+ |
+ test('should conditionally recurse sub-directories', () { |
+ new Directory(path.join(testPath, 'dir')).createSync(); |
+ new File(path.join(testPath, 'dir/file')).createSync(); |
+ new Directory(path.join(testPath, 'dir2')).createSync(); |
+ new File(path.join(testPath, 'dir2/file')).createSync(); |
+ |
+ var files = []; |
+ return visitDirectory(testDir, (e) { |
+ files.add(e); |
+ return new Future.value(!e.path.endsWith('dir2')); |
+ }).then((_) { |
+ expect(files.map((e) => e.path), unorderedEquals( |
+ ["$testPath/dir", "$testPath/dir/file", "$testPath/dir2",])); |
+ }); |
+ }); |
+ |
+ test('should not infinitely recurse on symlink cycles', () { |
+ var dir = new Directory(path.join(testPath, 'dir'))..createSync(); |
+ new Link(path.join(testPath, 'dir/link')).createSync('../dir'); |
+ var files = []; |
+ return visitDirectory(dir, (e) { |
+ files.add(e); |
+ return new Future.value(true); |
+ }).then((_) { |
+ expect(files.length, 1); |
+ expect(files.first.targetSync(), '../dir'); |
+ }); |
+ }); |
+ }); |
+} |