View Javadoc
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.FileSystem;
27  import java.nio.file.FileSystems;
28  import java.nio.file.Files;
29  import java.nio.file.Path;
30  import java.nio.file.Paths;
31  
32  import org.junit.jupiter.api.Test;
33  import org.junit.jupiter.api.io.TempDir;
34  
35  /**
36   * Tests {@link PathUtils}.
37   */
38  public class PathUtilsContentEqualsTest {
39  
40      @TempDir
41      public File temporaryFolder;
42  
43      private String getName() {
44          return this.getClass().getSimpleName();
45      }
46  
47      @Test
48      public void testDirectoryAndFileContentEquals() throws Exception {
49          // Non-existent files
50          final Path path1 = new File(temporaryFolder, getName()).toPath();
51          final Path path2 = new File(temporaryFolder, getName() + "2").toPath();
52          assertTrue(PathUtils.directoryAndFileContentEquals(null, null));
53          assertFalse(PathUtils.directoryAndFileContentEquals(null, path1));
54          assertFalse(PathUtils.directoryAndFileContentEquals(path1, null));
55          // both don't exist
56          assertTrue(PathUtils.directoryAndFileContentEquals(path1, path1));
57          assertTrue(PathUtils.directoryAndFileContentEquals(path1, path2));
58          assertTrue(PathUtils.directoryAndFileContentEquals(path2, path2));
59          assertTrue(PathUtils.directoryAndFileContentEquals(path2, path1));
60          // Tree equals true tests
61          {
62              // Trees of files only that contain the same files.
63              final Path dir1 = Paths.get("src/test/resources/dir-equals-tests/dir-equals-files-only/directory-files-only1");
64              final Path dir2 = Paths.get("src/test/resources/dir-equals-tests/dir-equals-files-only/directory-files-only2");
65              assertTrue(PathUtils.directoryAndFileContentEquals(dir1, dir2));
66              assertTrue(PathUtils.directoryAndFileContentEquals(dir2, dir2));
67              assertTrue(PathUtils.directoryAndFileContentEquals(dir1, dir1));
68              assertTrue(PathUtils.directoryAndFileContentEquals(dir2, dir2));
69          }
70          {
71              // Trees of directories containing other directories.
72              final Path dir1 = Paths.get("src/test/resources/dir-equals-tests/dir-equals-dirs-then-files/dir1");
73              final Path dir2 = Paths.get("src/test/resources/dir-equals-tests/dir-equals-dirs-then-files/dir2");
74              assertTrue(PathUtils.directoryAndFileContentEquals(dir1, dir2));
75              assertTrue(PathUtils.directoryAndFileContentEquals(dir2, dir2));
76              assertTrue(PathUtils.directoryAndFileContentEquals(dir1, dir1));
77              assertTrue(PathUtils.directoryAndFileContentEquals(dir2, dir2));
78          }
79          {
80              // Trees of directories containing other directories and files.
81              final Path dir1 = Paths.get("src/test/resources/dir-equals-tests/dir-equals-dirs-and-files/dirs-and-files1");
82              final Path dir2 = Paths.get("src/test/resources/dir-equals-tests/dir-equals-dirs-and-files/dirs-and-files1");
83              assertTrue(PathUtils.directoryAndFileContentEquals(dir1, dir2));
84              assertTrue(PathUtils.directoryAndFileContentEquals(dir2, dir2));
85              assertTrue(PathUtils.directoryAndFileContentEquals(dir1, dir1));
86              assertTrue(PathUtils.directoryAndFileContentEquals(dir2, dir2));
87          }
88          // Tree equals false tests
89          {
90              final Path dir1 = Paths.get("src/test/resources/dir-equals-tests/dir-equals-dirs-and-files/dirs-and-files1/directory-files-only1");
91              final Path dir2 = Paths.get("src/test/resources/dir-equals-tests/dir-equals-dirs-and-files/dirs-and-files1/");
92              assertFalse(PathUtils.directoryAndFileContentEquals(dir1, dir2));
93              assertFalse(PathUtils.directoryAndFileContentEquals(dir2, dir1));
94          }
95          {
96              final Path dir1 = Paths.get("src/test/resources/dir-equals-tests/dir-equals-dirs-and-files");
97              final Path dir2 = Paths.get("src/test/resources/dir-equals-tests/dir-equals-dirs-then-files");
98              assertFalse(PathUtils.directoryAndFileContentEquals(dir1, dir2));
99              assertFalse(PathUtils.directoryAndFileContentEquals(dir2, dir1));
100         }
101     }
102 
103     @Test
104     public void testDirectoryContentEquals() throws Exception {
105         // Non-existent files
106         final Path path1 = new File(temporaryFolder, getName()).toPath();
107         final Path path2 = new File(temporaryFolder, getName() + "2").toPath();
108         assertTrue(PathUtils.directoryContentEquals(null, null));
109         assertFalse(PathUtils.directoryContentEquals(null, path1));
110         assertFalse(PathUtils.directoryContentEquals(path1, null));
111         // both don't exist
112         assertTrue(PathUtils.directoryContentEquals(path1, path1));
113         assertTrue(PathUtils.directoryContentEquals(path1, path2));
114         assertTrue(PathUtils.directoryContentEquals(path2, path2));
115         assertTrue(PathUtils.directoryContentEquals(path2, path1));
116         // Tree equals true tests
117         {
118             // Trees of files only that contain the same files.
119             final Path dir1 = Paths.get("src/test/resources/dir-equals-tests/dir-equals-files-only/directory-files-only1");
120             final Path dir2 = Paths.get("src/test/resources/dir-equals-tests/dir-equals-files-only/directory-files-only2");
121             assertTrue(PathUtils.directoryContentEquals(dir1, dir2));
122             assertTrue(PathUtils.directoryContentEquals(dir2, dir2));
123             assertTrue(PathUtils.directoryContentEquals(dir1, dir1));
124             assertTrue(PathUtils.directoryContentEquals(dir2, dir2));
125         }
126         {
127             // Trees of directories containing other directories.
128             final Path dir1 = Paths.get("src/test/resources/dir-equals-tests/dir-equals-dirs-then-files/dir1");
129             final Path dir2 = Paths.get("src/test/resources/dir-equals-tests/dir-equals-dirs-then-files/dir2");
130             assertTrue(PathUtils.directoryContentEquals(dir1, dir2));
131             assertTrue(PathUtils.directoryContentEquals(dir2, dir2));
132             assertTrue(PathUtils.directoryContentEquals(dir1, dir1));
133             assertTrue(PathUtils.directoryContentEquals(dir2, dir2));
134         }
135         {
136             // Trees of directories containing other directories and files.
137             final Path dir1 = Paths.get("src/test/resources/dir-equals-tests/dir-equals-dirs-and-files/dirs-and-files1");
138             final Path dir2 = Paths.get("src/test/resources/dir-equals-tests/dir-equals-dirs-and-files/dirs-and-files1");
139             assertTrue(PathUtils.directoryContentEquals(dir1, dir2));
140             assertTrue(PathUtils.directoryContentEquals(dir2, dir2));
141             assertTrue(PathUtils.directoryContentEquals(dir1, dir1));
142             assertTrue(PathUtils.directoryContentEquals(dir2, dir2));
143         }
144         // Tree equals false tests
145         {
146             final Path dir1 = Paths.get("src/test/resources/dir-equals-tests/dir-equals-dirs-and-files/dirs-and-files1/directory-files-only1");
147             final Path dir2 = Paths.get("src/test/resources/dir-equals-tests/dir-equals-dirs-and-files/dirs-and-files1/");
148             assertFalse(PathUtils.directoryContentEquals(dir1, dir2));
149             assertFalse(PathUtils.directoryContentEquals(dir2, dir1));
150         }
151         {
152             final Path dir1 = Paths.get("src/test/resources/dir-equals-tests/dir-equals-dirs-and-files");
153             final Path dir2 = Paths.get("src/test/resources/dir-equals-tests/dir-equals-dirs-then-files");
154             assertFalse(PathUtils.directoryContentEquals(dir1, dir2));
155             assertFalse(PathUtils.directoryContentEquals(dir2, dir1));
156         }
157     }
158 
159     @Test
160     public void testFileContentEquals() throws Exception {
161         // Non-existent files
162         final Path path1 = new File(temporaryFolder, getName()).toPath();
163         final Path path2 = new File(temporaryFolder, getName() + "2").toPath();
164         assertTrue(PathUtils.fileContentEquals(null, null));
165         assertFalse(PathUtils.fileContentEquals(null, path1));
166         assertFalse(PathUtils.fileContentEquals(path1, null));
167         // both don't exist
168         assertTrue(PathUtils.fileContentEquals(path1, path1));
169         assertTrue(PathUtils.fileContentEquals(path1, path2));
170         assertTrue(PathUtils.fileContentEquals(path2, path2));
171         assertTrue(PathUtils.fileContentEquals(path2, path1));
172 
173         // Directories
174         assertThrows(IOException.class, () -> PathUtils.fileContentEquals(temporaryFolder.toPath(), temporaryFolder.toPath()));
175 
176         // Different files
177         final Path objFile1 = Paths.get(temporaryFolder.getAbsolutePath(), getName() + ".object");
178         PathUtils.copyFile(getClass().getResource("/java/lang/Object.class"), objFile1);
179 
180         final Path objFile1b = Paths.get(temporaryFolder.getAbsolutePath(), getName() + ".object2");
181         PathUtils.copyFile(getClass().getResource("/java/lang/Object.class"), objFile1b);
182 
183         final Path objFile2 = Paths.get(temporaryFolder.getAbsolutePath(), getName() + ".collection");
184         PathUtils.copyFile(getClass().getResource("/java/util/Collection.class"), objFile2);
185 
186         assertFalse(PathUtils.fileContentEquals(objFile1, objFile2));
187         assertFalse(PathUtils.fileContentEquals(objFile1b, objFile2));
188         assertTrue(PathUtils.fileContentEquals(objFile1, objFile1b));
189 
190         assertTrue(PathUtils.fileContentEquals(objFile1, objFile1));
191         assertTrue(PathUtils.fileContentEquals(objFile1b, objFile1b));
192         assertTrue(PathUtils.fileContentEquals(objFile2, objFile2));
193 
194         // Equal files
195         Files.createFile(path1);
196         Files.createFile(path2);
197         assertTrue(PathUtils.fileContentEquals(path1, path1));
198         assertTrue(PathUtils.fileContentEquals(path1, path2));
199     }
200 
201     @Test
202     public void testFileContentEqualsZip() throws Exception {
203         final Path path1 = Paths.get("src/test/resources/org/apache/commons/io/bla.zip");
204         final Path path2 = Paths.get("src/test/resources/org/apache/commons/io/bla-copy.zip");
205         final Path path3 = Paths.get("src/test/resources/org/apache/commons/io/moby.zip");
206         assertTrue(PathUtils.fileContentEquals(path1, path2));
207         assertFalse(PathUtils.fileContentEquals(path1, path3));
208     }
209 
210     @Test
211     public void testFileContentEqualsZipFileSystem() throws Exception {
212         try (FileSystem fileSystem = FileSystems.newFileSystem(Paths.get("src/test/resources/org/apache/commons/io/test-same-size-diff-contents.zip"),
213                 ClassLoader.getSystemClassLoader())) {
214             // Contains one char: A
215             final Path path1 = fileSystem.getPath("/test-same-size-diff-contents/A.txt");
216             // Contains one char: B
217             final Path path2 = fileSystem.getPath("/test-same-size-diff-contents/B.txt");
218             assertTrue(Files.exists(path1));
219             assertTrue(Files.exists(path2));
220             assertTrue(PathUtils.fileContentEquals(path1, path1));
221             assertTrue(PathUtils.fileContentEquals(path2, path2));
222             assertFalse(PathUtils.fileContentEquals(path1, path2));
223         }
224     }
225 
226 }