|  | 
| 14 | 14 | import org.junit.jupiter.api.condition.DisabledOnOs; | 
| 15 | 15 | import org.junit.jupiter.api.condition.OS; | 
| 16 | 16 | 
 | 
|  | 17 | +import static org.junit.jupiter.api.Assertions.assertEquals; | 
| 17 | 18 | import static org.junit.jupiter.api.Assertions.assertFalse; | 
| 18 | 19 | import static org.junit.jupiter.api.Assertions.assertTrue; | 
| 19 | 20 | 
 | 
| @@ -107,4 +108,156 @@ void testSymlinkDirArchiver() throws Exception { | 
| 107 | 108 |         symbolicLink = new File("target/output/dirarchiver-symlink/aDirWithALink/backOutsideToFileX"); | 
| 108 | 109 |         assertTrue(Files.isSymbolicLink(symbolicLink.toPath())); | 
| 109 | 110 |     } | 
|  | 111 | + | 
|  | 112 | +    @Test | 
|  | 113 | +    @DisabledOnOs(OS.WINDOWS) | 
|  | 114 | +    void testSymlinkOverwriteZip() throws Exception { | 
|  | 115 | +        // Create temporary directory structure for testing | 
|  | 116 | +        File tempDir = new File("target/test-symlink-overwrite"); | 
|  | 117 | +        // Clean up from any previous test runs | 
|  | 118 | +        if (tempDir.exists()) { | 
|  | 119 | +            org.codehaus.plexus.util.FileUtils.deleteDirectory(tempDir); | 
|  | 120 | +        } | 
|  | 121 | +        tempDir.mkdirs(); | 
|  | 122 | + | 
|  | 123 | +        // Create two target files | 
|  | 124 | +        File target1 = new File(tempDir, "target1.txt"); | 
|  | 125 | +        File target2 = new File(tempDir, "target2.txt"); | 
|  | 126 | +        Files.write(target1.toPath(), "content1".getBytes()); | 
|  | 127 | +        Files.write(target2.toPath(), "content2".getBytes()); | 
|  | 128 | + | 
|  | 129 | +        // Create first archive with symlink pointing to target1 | 
|  | 130 | +        File archive1Dir = new File(tempDir, "archive1"); | 
|  | 131 | +        archive1Dir.mkdirs(); | 
|  | 132 | +        File archive1Target1 = new File(archive1Dir, "target1.txt"); | 
|  | 133 | +        Files.write(archive1Target1.toPath(), "content1".getBytes()); | 
|  | 134 | +        Files.createSymbolicLink( | 
|  | 135 | +                new File(archive1Dir, "link.txt").toPath(), | 
|  | 136 | +                archive1Target1.toPath().getFileName()); | 
|  | 137 | + | 
|  | 138 | +        ZipArchiver archiver1 = (ZipArchiver) lookup(Archiver.class, "zip"); | 
|  | 139 | +        archiver1.addDirectory(archive1Dir); | 
|  | 140 | +        File zipFile1 = new File(tempDir, "archive1.zip"); | 
|  | 141 | +        archiver1.setDestFile(zipFile1); | 
|  | 142 | +        archiver1.createArchive(); | 
|  | 143 | + | 
|  | 144 | +        // Extract first archive | 
|  | 145 | +        File outputDir = new File(tempDir, "output"); | 
|  | 146 | +        outputDir.mkdirs(); | 
|  | 147 | +        ZipUnArchiver unarchiver1 = (ZipUnArchiver) lookup(UnArchiver.class, "zip"); | 
|  | 148 | +        unarchiver1.setSourceFile(zipFile1); | 
|  | 149 | +        unarchiver1.setDestFile(outputDir); | 
|  | 150 | +        unarchiver1.extract(); | 
|  | 151 | + | 
|  | 152 | +        // Verify symlink points to target1.txt | 
|  | 153 | +        File extractedLink = new File(outputDir, "link.txt"); | 
|  | 154 | +        assertTrue(Files.isSymbolicLink(extractedLink.toPath())); | 
|  | 155 | +        assertEquals( | 
|  | 156 | +                "target1.txt", Files.readSymbolicLink(extractedLink.toPath()).toString()); | 
|  | 157 | + | 
|  | 158 | +        // Create second archive with symlink pointing to target2 | 
|  | 159 | +        File archive2Dir = new File(tempDir, "archive2"); | 
|  | 160 | +        archive2Dir.mkdirs(); | 
|  | 161 | +        File archive2Target2 = new File(archive2Dir, "target2.txt"); | 
|  | 162 | +        Files.write(archive2Target2.toPath(), "content2".getBytes()); | 
|  | 163 | +        Files.createSymbolicLink( | 
|  | 164 | +                new File(archive2Dir, "link.txt").toPath(), | 
|  | 165 | +                archive2Target2.toPath().getFileName()); | 
|  | 166 | + | 
|  | 167 | +        ZipArchiver archiver2 = (ZipArchiver) lookup(Archiver.class, "zip"); | 
|  | 168 | +        archiver2.addDirectory(archive2Dir); | 
|  | 169 | +        File zipFile2 = new File(tempDir, "archive2.zip"); | 
|  | 170 | +        archiver2.setDestFile(zipFile2); | 
|  | 171 | +        archiver2.createArchive(); | 
|  | 172 | + | 
|  | 173 | +        // Extract second archive (should overwrite the symlink) | 
|  | 174 | +        ZipUnArchiver unarchiver2 = (ZipUnArchiver) lookup(UnArchiver.class, "zip"); | 
|  | 175 | +        unarchiver2.setSourceFile(zipFile2); | 
|  | 176 | +        unarchiver2.setDestFile(outputDir); | 
|  | 177 | +        unarchiver2.extract(); | 
|  | 178 | + | 
|  | 179 | +        // Verify symlink now points to target2.txt (THIS IS THE KEY TEST) | 
|  | 180 | +        assertTrue(Files.isSymbolicLink(extractedLink.toPath()), "link.txt should still be a symlink"); | 
|  | 181 | +        assertEquals( | 
|  | 182 | +                "target2.txt", | 
|  | 183 | +                Files.readSymbolicLink(extractedLink.toPath()).toString(), | 
|  | 184 | +                "Symlink should be updated to point to target2.txt"); | 
|  | 185 | +    } | 
|  | 186 | + | 
|  | 187 | +    @Test | 
|  | 188 | +    @DisabledOnOs(OS.WINDOWS) | 
|  | 189 | +    void testSymlinkOverwriteTar() throws Exception { | 
|  | 190 | +        // Create temporary directory structure for testing | 
|  | 191 | +        File tempDir = new File("target/test-symlink-overwrite-tar"); | 
|  | 192 | +        // Clean up from any previous test runs | 
|  | 193 | +        if (tempDir.exists()) { | 
|  | 194 | +            org.codehaus.plexus.util.FileUtils.deleteDirectory(tempDir); | 
|  | 195 | +        } | 
|  | 196 | +        tempDir.mkdirs(); | 
|  | 197 | + | 
|  | 198 | +        // Create two target files | 
|  | 199 | +        File target1 = new File(tempDir, "target1.txt"); | 
|  | 200 | +        File target2 = new File(tempDir, "target2.txt"); | 
|  | 201 | +        Files.write(target1.toPath(), "content1".getBytes()); | 
|  | 202 | +        Files.write(target2.toPath(), "content2".getBytes()); | 
|  | 203 | + | 
|  | 204 | +        // Create first archive with symlink pointing to target1 | 
|  | 205 | +        File archive1Dir = new File(tempDir, "archive1"); | 
|  | 206 | +        archive1Dir.mkdirs(); | 
|  | 207 | +        File archive1Target1 = new File(archive1Dir, "target1.txt"); | 
|  | 208 | +        Files.write(archive1Target1.toPath(), "content1".getBytes()); | 
|  | 209 | +        Files.createSymbolicLink( | 
|  | 210 | +                new File(archive1Dir, "link.txt").toPath(), | 
|  | 211 | +                archive1Target1.toPath().getFileName()); | 
|  | 212 | + | 
|  | 213 | +        TarArchiver archiver1 = (TarArchiver) lookup(Archiver.class, "tar"); | 
|  | 214 | +        archiver1.setLongfile(TarLongFileMode.posix); | 
|  | 215 | +        archiver1.addDirectory(archive1Dir); | 
|  | 216 | +        File tarFile1 = new File(tempDir, "archive1.tar"); | 
|  | 217 | +        archiver1.setDestFile(tarFile1); | 
|  | 218 | +        archiver1.createArchive(); | 
|  | 219 | + | 
|  | 220 | +        // Extract first archive | 
|  | 221 | +        File outputDir = new File(tempDir, "output"); | 
|  | 222 | +        outputDir.mkdirs(); | 
|  | 223 | +        TarUnArchiver unarchiver1 = (TarUnArchiver) lookup(UnArchiver.class, "tar"); | 
|  | 224 | +        unarchiver1.setSourceFile(tarFile1); | 
|  | 225 | +        unarchiver1.setDestFile(outputDir); | 
|  | 226 | +        unarchiver1.extract(); | 
|  | 227 | + | 
|  | 228 | +        // Verify symlink points to target1.txt | 
|  | 229 | +        File extractedLink = new File(outputDir, "link.txt"); | 
|  | 230 | +        assertTrue(Files.isSymbolicLink(extractedLink.toPath())); | 
|  | 231 | +        assertEquals( | 
|  | 232 | +                "target1.txt", Files.readSymbolicLink(extractedLink.toPath()).toString()); | 
|  | 233 | + | 
|  | 234 | +        // Create second archive with symlink pointing to target2 | 
|  | 235 | +        File archive2Dir = new File(tempDir, "archive2"); | 
|  | 236 | +        archive2Dir.mkdirs(); | 
|  | 237 | +        File archive2Target2 = new File(archive2Dir, "target2.txt"); | 
|  | 238 | +        Files.write(archive2Target2.toPath(), "content2".getBytes()); | 
|  | 239 | +        Files.createSymbolicLink( | 
|  | 240 | +                new File(archive2Dir, "link.txt").toPath(), | 
|  | 241 | +                archive2Target2.toPath().getFileName()); | 
|  | 242 | + | 
|  | 243 | +        TarArchiver archiver2 = (TarArchiver) lookup(Archiver.class, "tar"); | 
|  | 244 | +        archiver2.setLongfile(TarLongFileMode.posix); | 
|  | 245 | +        archiver2.addDirectory(archive2Dir); | 
|  | 246 | +        File tarFile2 = new File(tempDir, "archive2.tar"); | 
|  | 247 | +        archiver2.setDestFile(tarFile2); | 
|  | 248 | +        archiver2.createArchive(); | 
|  | 249 | + | 
|  | 250 | +        // Extract second archive (should overwrite the symlink) | 
|  | 251 | +        TarUnArchiver unarchiver2 = (TarUnArchiver) lookup(UnArchiver.class, "tar"); | 
|  | 252 | +        unarchiver2.setSourceFile(tarFile2); | 
|  | 253 | +        unarchiver2.setDestFile(outputDir); | 
|  | 254 | +        unarchiver2.extract(); | 
|  | 255 | + | 
|  | 256 | +        // Verify symlink now points to target2.txt (THIS IS THE KEY TEST) | 
|  | 257 | +        assertTrue(Files.isSymbolicLink(extractedLink.toPath()), "link.txt should still be a symlink"); | 
|  | 258 | +        assertEquals( | 
|  | 259 | +                "target2.txt", | 
|  | 260 | +                Files.readSymbolicLink(extractedLink.toPath()).toString(), | 
|  | 261 | +                "Symlink should be updated to point to target2.txt"); | 
|  | 262 | +    } | 
| 110 | 263 | } | 
0 commit comments