| // Copyright (c) 2017, 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. | |
| @TestOn('vm') | |
| library; | |
| import 'dart:io'; | |
| import 'package:io/io.dart'; | |
| import 'package:path/path.dart' as p; | |
| import 'package:test/test.dart'; | |
| import 'package:test_descriptor/test_descriptor.dart' as d; | |
| void main() { | |
| test('should copy a directory (async)', () async { | |
| await _create(); | |
| await copyPath(p.join(d.sandbox, _parentDir), p.join(d.sandbox, _copyDir)); | |
| await _validate(); | |
| }); | |
| test('should copy a directory (sync)', () async { | |
| await _create(); | |
| copyPathSync(p.join(d.sandbox, _parentDir), p.join(d.sandbox, _copyDir)); | |
| await _validate(); | |
| }); | |
| test('should catch an infinite operation', () async { | |
| await _create(); | |
| expect( | |
| copyPath( | |
| p.join(d.sandbox, _parentDir), | |
| p.join(d.sandbox, _parentDir, 'child'), | |
| ), | |
| throwsArgumentError, | |
| ); | |
| }); | |
| group('links', () { | |
| const linkTarget = 'link_target'; | |
| const linkSource = 'link_source'; | |
| const linkContent = 'link_content.txt'; | |
| late String targetPath; | |
| setUp(() async { | |
| await _create(); | |
| await d | |
| .dir(linkTarget, [d.file(linkContent, 'original content')]).create(); | |
| targetPath = p.join(d.sandbox, linkTarget); | |
| await Link(p.join(d.sandbox, _parentDir, linkSource)).create(targetPath); | |
| }); | |
| test('are shallow copied with deepCopyLinks: false in copyPath', () async { | |
| await copyPath( | |
| deepCopyLinks: false, | |
| p.join(d.sandbox, _parentDir), | |
| p.join(d.sandbox, _copyDir)); | |
| final expectedLink = Link(p.join(d.sandbox, _copyDir, linkSource)); | |
| expect(await expectedLink.exists(), isTrue); | |
| expect(await expectedLink.target(), targetPath); | |
| }); | |
| test('are shallow copied with deepCopyLinks: false in copyPathSync', | |
| () async { | |
| copyPathSync( | |
| deepCopyLinks: false, | |
| p.join(d.sandbox, _parentDir), | |
| p.join(d.sandbox, _copyDir)); | |
| final expectedLink = Link(p.join(d.sandbox, _copyDir, linkSource)); | |
| expect(await expectedLink.exists(), isTrue); | |
| expect(await expectedLink.target(), targetPath); | |
| }); | |
| test('are deep copied by default in copyPath', () async { | |
| await copyPath( | |
| p.join(d.sandbox, _parentDir), p.join(d.sandbox, _copyDir)); | |
| final expectedDir = Directory(p.join(d.sandbox, _copyDir, linkSource)); | |
| final expectedFile = | |
| File(p.join(d.sandbox, _copyDir, linkSource, linkContent)); | |
| expect(await expectedDir.exists(), isTrue); | |
| expect(await expectedFile.exists(), isTrue); | |
| expect(await expectedFile.readAsString(), 'original content', | |
| reason: 'The file behind the link was copied with invalid content'); | |
| await expectedFile.writeAsString('new content'); | |
| final originalFile = | |
| File(p.join(d.sandbox, _parentDir, linkSource, linkContent)); | |
| expect(await originalFile.readAsString(), 'original content', | |
| reason: 'The file behind the link should not change'); | |
| }); | |
| test('are deep copied by default in copyPathSync', () async { | |
| copyPathSync(p.join(d.sandbox, _parentDir), p.join(d.sandbox, _copyDir)); | |
| final expectedDir = Directory(p.join(d.sandbox, _copyDir, linkSource)); | |
| final expectedFile = | |
| File(p.join(d.sandbox, _copyDir, linkSource, linkContent)); | |
| expect(await expectedDir.exists(), isTrue); | |
| expect(await expectedFile.exists(), isTrue); | |
| expect(await expectedFile.readAsString(), 'original content', | |
| reason: 'The file behind the link was copied with invalid content'); | |
| await expectedFile.writeAsString('new content'); | |
| final originalFile = | |
| File(p.join(d.sandbox, _parentDir, linkSource, linkContent)); | |
| expect(await originalFile.readAsString(), 'original content', | |
| reason: 'The file behind the link should not change'); | |
| }); | |
| }); | |
| } | |
| const _parentDir = 'parent'; | |
| const _copyDir = 'copy'; | |
| d.DirectoryDescriptor _struct(String dirName) => d.dir(dirName, [ | |
| d.dir('child', [ | |
| d.file('foo.txt'), | |
| ]), | |
| ]); | |
| Future<void> _create() => _struct(_parentDir).create(); | |
| Future<void> _validate() => _struct(_copyDir).validate(); |