@@ -627,7 +627,7 @@ class TestFileManager : XCTestCase {
627
627
let tmpParentDirURL = URL ( fileURLWithPath: NSTemporaryDirectory ( ) + " test_contentsEqualdir " , isDirectory: true )
628
628
let testDir1 = tmpParentDirURL. appendingPathComponent ( " testDir1 " )
629
629
let testDir2 = tmpParentDirURL. appendingPathComponent ( " testDir2 " )
630
- let testDir3 = testDir1. appendingPathComponent ( " subDir " )
630
+ let testDir3 = testDir1. appendingPathComponent ( " subDir/anotherDir/extraDir/lastDir " )
631
631
632
632
defer { try ? fm. removeItem ( atPath: tmpParentDirURL. path) }
633
633
@@ -663,6 +663,10 @@ class TestFileManager : XCTestCase {
663
663
try Data ( ) . write ( to: testDir1. appendingPathComponent ( " empty_file " ) )
664
664
try fm. createSymbolicLink ( atPath: symlink, withDestinationPath: testFile1URL. path)
665
665
666
+ try fm. createSymbolicLink ( atPath: testDir1. appendingPathComponent ( " thisDir " ) . path, withDestinationPath: " . " )
667
+ try fm. createSymbolicLink ( atPath: testDir1. appendingPathComponent ( " parentDir " ) . path, withDestinationPath: " .. " )
668
+ try fm. createSymbolicLink ( atPath: testDir1. appendingPathComponent ( " rootDir " ) . path, withDestinationPath: " / " )
669
+
666
670
// testDir2
667
671
try fm. createDirectory ( atPath: testDir2. path, withIntermediateDirectories: true )
668
672
try fm. createSymbolicLink ( atPath: testDir2. appendingPathComponent ( " bar2 " ) . path, withDestinationPath: " foo1 " )
@@ -696,8 +700,57 @@ class TestFileManager : XCTestCase {
696
700
XCTAssertFalse ( fm. contentsEqual ( atPath: testFile1URL. path, andPath: testFile2URL. path) )
697
701
XCTAssertFalse ( fm. contentsEqual ( atPath: testFile3URL. path, andPath: testFile4URL. path) )
698
702
XCTAssertFalse ( fm. contentsEqual ( atPath: symlink, andPath: testFile1URL. path) )
703
+
699
704
XCTAssertTrue ( fm. contentsEqual ( atPath: testDir1. path, andPath: testDir1. path) )
700
705
XCTAssertTrue ( fm. contentsEqual ( atPath: testDir2. path, andPath: testDir3. path) )
701
706
XCTAssertFalse ( fm. contentsEqual ( atPath: testDir1. path, andPath: testDir2. path) )
707
+
708
+ // Copy everything in testDir1 to testDir2 to make them equal
709
+ do {
710
+ for entry in try fm. subpathsOfDirectory ( atPath: testDir1. path) {
711
+ // Skip entries that already exist
712
+ if entry == " bar2 " || entry == " unreadable_file " {
713
+ continue
714
+ }
715
+ let srcPath = testDir1. appendingPathComponent ( entry) . path
716
+ let dstPath = testDir2. appendingPathComponent ( entry) . path
717
+ if let attrs = try ? fm. attributesOfItem ( atPath: srcPath) ,
718
+ let fileType = attrs [ . type] as? FileAttributeType , fileType == . typeDirectory {
719
+ try fm. createDirectory ( atPath: dstPath, withIntermediateDirectories: false , attributes: nil )
720
+ } else {
721
+ try fm. copyItem ( atPath: srcPath, toPath: dstPath)
722
+ }
723
+ }
724
+ } catch {
725
+ XCTFail ( " Failed to copy \( testDir1. path) to \( testDir2. path) , \( error) " )
726
+ return
727
+ }
728
+ // This will still fail due to unreadable files and a file in testDir2 not in testDir1
729
+ XCTAssertFalse ( fm. contentsEqual ( atPath: testDir1. path, andPath: testDir2. path) )
730
+ do {
731
+ try fm. copyItem ( atPath: testDir2. appendingPathComponent ( " foo2 " ) . path, toPath: testDir1. appendingPathComponent ( " foo2 " ) . path)
732
+ try fm. removeItem ( atPath: testDir1. appendingPathComponent ( " unreadable_file " ) . path)
733
+ } catch {
734
+ XCTFail ( String ( describing: error) )
735
+ return
736
+ }
737
+ XCTAssertTrue ( fm. contentsEqual ( atPath: testDir1. path, andPath: testDir2. path) )
738
+
739
+ let dataFile1 = testDir1. appendingPathComponent ( " dataFile " )
740
+ let dataFile2 = testDir2. appendingPathComponent ( " dataFile " )
741
+ do {
742
+ try Data ( count: 100_000 ) . write ( to: dataFile1)
743
+ try fm. copyItem ( atPath: dataFile1. path, toPath: dataFile2. path)
744
+ } catch {
745
+ XCTFail ( " Could not create test data files: \( error) " )
746
+ return
747
+ }
748
+ XCTAssertTrue ( fm. contentsEqual ( atPath: dataFile1. path, andPath: dataFile2. path) )
749
+ XCTAssertTrue ( fm. contentsEqual ( atPath: testDir1. path, andPath: testDir2. path) )
750
+ var data = Data ( count: 100_000 )
751
+ data [ 99_999 ] = 1
752
+ try ? data. write ( to: dataFile1)
753
+ XCTAssertFalse ( fm. contentsEqual ( atPath: dataFile1. path, andPath: dataFile2. path) )
754
+ XCTAssertFalse ( fm. contentsEqual ( atPath: testDir1. path, andPath: testDir2. path) )
702
755
}
703
756
}
0 commit comments