1 /* 2 * Licensed to the Apache Software Foundation (ASF) under one or more 3 * contributor license agreements. See the NOTICE file distributed with 4 * this work for additional information regarding copyright ownership. 5 * The ASF licenses this file to You under the Apache License, Version 2.0 6 * (the "License"); you may not use this file except in compliance with 7 * the License. You may obtain a copy of the License at 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 */ 17 18 package org.apache.commons.io.file; 19 20 import static org.junit.jupiter.api.Assertions.assertFalse; 21 import static org.junit.jupiter.api.Assertions.assertThrows; 22 import static org.junit.jupiter.api.Assertions.assertTrue; 23 24 import java.io.File; 25 import java.io.IOException; 26 import java.nio.file.Files; 27 import java.nio.file.Path; 28 import java.nio.file.Paths; 29 30 import org.junit.jupiter.api.Test; 31 import org.junit.jupiter.api.io.TempDir; 32 33 /** 34 * Tests {@link PathUtils}. 35 */ 36 public class PathUtilsContentEqualsTest { 37 38 @TempDir 39 public File temporaryFolder; 40 getName()41 private String getName() { 42 return this.getClass().getSimpleName(); 43 } 44 45 @Test testDirectoryAndFileContentEquals()46 public void testDirectoryAndFileContentEquals() throws Exception { 47 // Non-existent files 48 final Path path1 = new File(temporaryFolder, getName()).toPath(); 49 final Path path2 = new File(temporaryFolder, getName() + "2").toPath(); 50 assertTrue(PathUtils.directoryAndFileContentEquals(null, null)); 51 assertFalse(PathUtils.directoryAndFileContentEquals(null, path1)); 52 assertFalse(PathUtils.directoryAndFileContentEquals(path1, null)); 53 // both don't exist 54 assertTrue(PathUtils.directoryAndFileContentEquals(path1, path1)); 55 assertTrue(PathUtils.directoryAndFileContentEquals(path1, path2)); 56 assertTrue(PathUtils.directoryAndFileContentEquals(path2, path2)); 57 assertTrue(PathUtils.directoryAndFileContentEquals(path2, path1)); 58 // Tree equals true tests 59 { 60 // Trees of files only that contain the same files. 61 final Path dir1 = Paths.get("src/test/resources/dir-equals-tests/dir-equals-files-only/directory-files-only1"); 62 final Path dir2 = Paths.get("src/test/resources/dir-equals-tests/dir-equals-files-only/directory-files-only2"); 63 assertTrue(PathUtils.directoryAndFileContentEquals(dir1, dir2)); 64 assertTrue(PathUtils.directoryAndFileContentEquals(dir2, dir2)); 65 assertTrue(PathUtils.directoryAndFileContentEquals(dir1, dir1)); 66 assertTrue(PathUtils.directoryAndFileContentEquals(dir2, dir2)); 67 } 68 { 69 // Trees of directories containing other directories. 70 final Path dir1 = Paths.get("src/test/resources/dir-equals-tests/dir-equals-dirs-then-files/dir1"); 71 final Path dir2 = Paths.get("src/test/resources/dir-equals-tests/dir-equals-dirs-then-files/dir2"); 72 assertTrue(PathUtils.directoryAndFileContentEquals(dir1, dir2)); 73 assertTrue(PathUtils.directoryAndFileContentEquals(dir2, dir2)); 74 assertTrue(PathUtils.directoryAndFileContentEquals(dir1, dir1)); 75 assertTrue(PathUtils.directoryAndFileContentEquals(dir2, dir2)); 76 } 77 { 78 // Trees of directories containing other directories and files. 79 final Path dir1 = Paths.get("src/test/resources/dir-equals-tests/dir-equals-dirs-and-files/dirs-and-files1"); 80 final Path dir2 = Paths.get("src/test/resources/dir-equals-tests/dir-equals-dirs-and-files/dirs-and-files1"); 81 assertTrue(PathUtils.directoryAndFileContentEquals(dir1, dir2)); 82 assertTrue(PathUtils.directoryAndFileContentEquals(dir2, dir2)); 83 assertTrue(PathUtils.directoryAndFileContentEquals(dir1, dir1)); 84 assertTrue(PathUtils.directoryAndFileContentEquals(dir2, dir2)); 85 } 86 // Tree equals false tests 87 { 88 final Path dir1 = Paths.get("src/test/resources/dir-equals-tests/dir-equals-dirs-and-files/dirs-and-files1/directory-files-only1"); 89 final Path dir2 = Paths.get("src/test/resources/dir-equals-tests/dir-equals-dirs-and-files/dirs-and-files1/"); 90 assertFalse(PathUtils.directoryAndFileContentEquals(dir1, dir2)); 91 assertFalse(PathUtils.directoryAndFileContentEquals(dir2, dir1)); 92 } 93 { 94 final Path dir1 = Paths.get("src/test/resources/dir-equals-tests/dir-equals-dirs-and-files"); 95 final Path dir2 = Paths.get("src/test/resources/dir-equals-tests/dir-equals-dirs-then-files"); 96 assertFalse(PathUtils.directoryAndFileContentEquals(dir1, dir2)); 97 assertFalse(PathUtils.directoryAndFileContentEquals(dir2, dir1)); 98 } 99 } 100 101 @Test testDirectoryContentEquals()102 public void testDirectoryContentEquals() throws Exception { 103 // Non-existent files 104 final Path path1 = new File(temporaryFolder, getName()).toPath(); 105 final Path path2 = new File(temporaryFolder, getName() + "2").toPath(); 106 assertTrue(PathUtils.directoryContentEquals(null, null)); 107 assertFalse(PathUtils.directoryContentEquals(null, path1)); 108 assertFalse(PathUtils.directoryContentEquals(path1, null)); 109 // both don't exist 110 assertTrue(PathUtils.directoryContentEquals(path1, path1)); 111 assertTrue(PathUtils.directoryContentEquals(path1, path2)); 112 assertTrue(PathUtils.directoryContentEquals(path2, path2)); 113 assertTrue(PathUtils.directoryContentEquals(path2, path1)); 114 // Tree equals true tests 115 { 116 // Trees of files only that contain the same files. 117 final Path dir1 = Paths.get("src/test/resources/dir-equals-tests/dir-equals-files-only/directory-files-only1"); 118 final Path dir2 = Paths.get("src/test/resources/dir-equals-tests/dir-equals-files-only/directory-files-only2"); 119 assertTrue(PathUtils.directoryContentEquals(dir1, dir2)); 120 assertTrue(PathUtils.directoryContentEquals(dir2, dir2)); 121 assertTrue(PathUtils.directoryContentEquals(dir1, dir1)); 122 assertTrue(PathUtils.directoryContentEquals(dir2, dir2)); 123 } 124 { 125 // Trees of directories containing other directories. 126 final Path dir1 = Paths.get("src/test/resources/dir-equals-tests/dir-equals-dirs-then-files/dir1"); 127 final Path dir2 = Paths.get("src/test/resources/dir-equals-tests/dir-equals-dirs-then-files/dir2"); 128 assertTrue(PathUtils.directoryContentEquals(dir1, dir2)); 129 assertTrue(PathUtils.directoryContentEquals(dir2, dir2)); 130 assertTrue(PathUtils.directoryContentEquals(dir1, dir1)); 131 assertTrue(PathUtils.directoryContentEquals(dir2, dir2)); 132 } 133 { 134 // Trees of directories containing other directories and files. 135 final Path dir1 = Paths.get("src/test/resources/dir-equals-tests/dir-equals-dirs-and-files/dirs-and-files1"); 136 final Path dir2 = Paths.get("src/test/resources/dir-equals-tests/dir-equals-dirs-and-files/dirs-and-files1"); 137 assertTrue(PathUtils.directoryContentEquals(dir1, dir2)); 138 assertTrue(PathUtils.directoryContentEquals(dir2, dir2)); 139 assertTrue(PathUtils.directoryContentEquals(dir1, dir1)); 140 assertTrue(PathUtils.directoryContentEquals(dir2, dir2)); 141 } 142 // Tree equals false tests 143 { 144 final Path dir1 = Paths.get("src/test/resources/dir-equals-tests/dir-equals-dirs-and-files/dirs-and-files1/directory-files-only1"); 145 final Path dir2 = Paths.get("src/test/resources/dir-equals-tests/dir-equals-dirs-and-files/dirs-and-files1/"); 146 assertFalse(PathUtils.directoryContentEquals(dir1, dir2)); 147 assertFalse(PathUtils.directoryContentEquals(dir2, dir1)); 148 } 149 { 150 final Path dir1 = Paths.get("src/test/resources/dir-equals-tests/dir-equals-dirs-and-files"); 151 final Path dir2 = Paths.get("src/test/resources/dir-equals-tests/dir-equals-dirs-then-files"); 152 assertFalse(PathUtils.directoryContentEquals(dir1, dir2)); 153 assertFalse(PathUtils.directoryContentEquals(dir2, dir1)); 154 } 155 } 156 157 @Test testFileContentEquals()158 public void testFileContentEquals() throws Exception { 159 // Non-existent files 160 final Path path1 = new File(temporaryFolder, getName()).toPath(); 161 final Path path2 = new File(temporaryFolder, getName() + "2").toPath(); 162 assertTrue(PathUtils.fileContentEquals(null, null)); 163 assertFalse(PathUtils.fileContentEquals(null, path1)); 164 assertFalse(PathUtils.fileContentEquals(path1, null)); 165 // both don't exist 166 assertTrue(PathUtils.fileContentEquals(path1, path1)); 167 assertTrue(PathUtils.fileContentEquals(path1, path2)); 168 assertTrue(PathUtils.fileContentEquals(path2, path2)); 169 assertTrue(PathUtils.fileContentEquals(path2, path1)); 170 171 // Directories 172 assertThrows(IOException.class, () -> PathUtils.fileContentEquals(temporaryFolder.toPath(), temporaryFolder.toPath())); 173 174 // Different files 175 final Path objFile1 = Paths.get(temporaryFolder.getAbsolutePath(), getName() + ".object"); 176 PathUtils.copyFile(getClass().getResource("/java/lang/Object.class"), objFile1); 177 178 final Path objFile1b = Paths.get(temporaryFolder.getAbsolutePath(), getName() + ".object2"); 179 PathUtils.copyFile(getClass().getResource("/java/lang/Object.class"), objFile1b); 180 181 final Path objFile2 = Paths.get(temporaryFolder.getAbsolutePath(), getName() + ".collection"); 182 PathUtils.copyFile(getClass().getResource("/java/util/Collection.class"), objFile2); 183 184 assertFalse(PathUtils.fileContentEquals(objFile1, objFile2)); 185 assertFalse(PathUtils.fileContentEquals(objFile1b, objFile2)); 186 assertTrue(PathUtils.fileContentEquals(objFile1, objFile1b)); 187 188 assertTrue(PathUtils.fileContentEquals(objFile1, objFile1)); 189 assertTrue(PathUtils.fileContentEquals(objFile1b, objFile1b)); 190 assertTrue(PathUtils.fileContentEquals(objFile2, objFile2)); 191 192 // Equal files 193 Files.createFile(path1); 194 Files.createFile(path2); 195 assertTrue(PathUtils.fileContentEquals(path1, path1)); 196 assertTrue(PathUtils.fileContentEquals(path1, path2)); 197 } 198 199 } 200