blob: 366989a1cc77a7c7c61c60b8b9227411b28cf243 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.commons.compress.changes;
import static org.junit.Assert.*;
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.apache.commons.compress.AbstractTestCase;
import org.apache.commons.compress.archivers.ArchiveEntry;
import org.apache.commons.compress.archivers.ArchiveInputStream;
import org.apache.commons.compress.archivers.ArchiveOutputStream;
import org.apache.commons.compress.archivers.ar.ArArchiveEntry;
import org.apache.commons.compress.archivers.cpio.CpioArchiveEntry;
import org.apache.commons.compress.archivers.jar.JarArchiveEntry;
import org.apache.commons.compress.archivers.tar.TarArchiveEntry;
import org.apache.commons.compress.archivers.zip.ZipArchiveEntry;
import org.apache.commons.compress.archivers.zip.ZipFile;
import org.junit.Test;
/**
* Checks several ChangeSet business logics.
*/
public final class ChangeSetTestCase extends AbstractTestCase {
// Delete a directory tree
private void archiveListDeleteDir(final String prefix){
final Iterator<String> it = archiveList.iterator();
while(it.hasNext()){
final String entry = it.next();
if (entry.startsWith(prefix+"/")){ // TODO won't work with folders
it.remove();
}
}
}
// Delete a single file
private void archiveListDelete(final String prefix){
final Iterator<String> it = archiveList.iterator();
while(it.hasNext()){
final String entry = it.next();
if (entry.equals(prefix)){
it.remove();
}
}
}
/**
* Adds an ArchiveEntry with the same name two times.
* Only the latest addition should be found in the ChangeSet,
* the first add should be replaced.
*
* @throws Exception
*/
@Test
public void testAddChangeTwice() throws Exception {
InputStream in = null;
InputStream in2 = null;
try {
in = new FileInputStream(getFile("test.txt"));
in2 = new FileInputStream(getFile("test2.xml"));
final ArchiveEntry e = new ZipArchiveEntry("test.txt");
final ArchiveEntry e2 = new ZipArchiveEntry("test.txt");
final ChangeSet changes = new ChangeSet();
changes.add(e, in);
changes.add(e2, in2);
assertEquals(1, changes.getChanges().size());
final Change c = changes.getChanges().iterator().next();
assertEquals(in2, c.getInput());
} finally {
if (in != null) {
in.close();
}
if (in2 != null) {
in2.close();
}
}
}
/**
* Adds an ArchiveEntry with the same name two times.
* Only the first addition should be found in the ChangeSet,
* the second add should never be added since replace = false
*
* @throws Exception
*/
@Test
public void testAddChangeTwiceWithoutReplace() throws Exception {
InputStream in = null;
InputStream in2 = null;
try {
in = new FileInputStream(getFile("test.txt"));
in2 = new FileInputStream(getFile("test2.xml"));
final ArchiveEntry e = new ZipArchiveEntry("test.txt");
final ArchiveEntry e2 = new ZipArchiveEntry("test.txt");
final ChangeSet changes = new ChangeSet();
changes.add(e, in, true);
changes.add(e2, in2, false);
assertEquals(1, changes.getChanges().size());
final Change c = changes.getChanges().iterator().next();
assertEquals(in, c.getInput());
} finally {
if (in != null) {
in.close();
}
if (in2 != null) {
in2.close();
}
}
}
/**
* Tries to delete the folder "bla" from an archive file. This should result in
* the deletion of bla/*, which actually means bla/test4.xml should be
* removed from the archive. The file something/bla (without ending, named
* like the folder) should not be deleted.
*
* @throws Exception
*/
@Test
public void testDeleteDir() throws Exception {
final String archivename = "cpio";
final File input = this.createArchive(archivename);
ArchiveOutputStream out = null;
ArchiveInputStream ais = null;
final File result = File.createTempFile("test", "."+archivename);
result.deleteOnExit();
try {
final InputStream is = new FileInputStream(input);
ais = factory.createArchiveInputStream(archivename, is);
out = factory.createArchiveOutputStream(archivename,
new FileOutputStream(result));
final ChangeSet changes = new ChangeSet();
changes.deleteDir("bla");
archiveListDeleteDir("bla");
final ChangeSetPerformer performer = new ChangeSetPerformer(changes);
performer.perform(ais, out);
is.close();
} finally {
if (out != null) {
out.close();
}
if (ais != null) {
ais.close();
}
}
this.checkArchiveContent(result, archiveList);
}
/**
* Tries to delete the folder "la" from an archive file. This should result in
* the deletion of la/*, which should not match any files/folders.
*
* @throws Exception
*/
@Test
public void testDeleteDir2() throws Exception {
final String archivename = "cpio";
final File input = this.createArchive(archivename);
ArchiveOutputStream out = null;
ArchiveInputStream ais = null;
final File result = File.createTempFile("test", "."+archivename);
result.deleteOnExit();
try {
final InputStream is = new FileInputStream(input);
ais = factory.createArchiveInputStream(archivename, is);
out = factory.createArchiveOutputStream(archivename,
new FileOutputStream(result));
final ChangeSet changes = new ChangeSet();
changes.deleteDir("la");
archiveListDeleteDir("la");
final ChangeSetPerformer performer = new ChangeSetPerformer(changes);
performer.perform(ais, out);
is.close();
} finally {
if (out != null) {
out.close();
}
if (ais != null) {
ais.close();
}
}
this.checkArchiveContent(result, archiveList);
}
/**
* Tries to delete the folder "test.txt" from an archive file.
* This should not match any files/folders.
*
* @throws Exception
*/
@Test
public void testDeleteDir3() throws Exception {
final String archivename = "cpio";
final File input = this.createArchive(archivename);
ArchiveOutputStream out = null;
ArchiveInputStream ais = null;
final File result = File.createTempFile("test", "."+archivename);
result.deleteOnExit();
try {
final InputStream is = new FileInputStream(input);
ais = factory.createArchiveInputStream(archivename, is);
out = factory.createArchiveOutputStream(archivename,
new FileOutputStream(result));
final ChangeSet changes = new ChangeSet();
changes.deleteDir("test.txt");
archiveListDeleteDir("test.txt");
final ChangeSetPerformer performer = new ChangeSetPerformer(changes);
performer.perform(ais, out);
is.close();
} finally {
if (out != null) {
out.close();
}
if (ais != null) {
ais.close();
}
}
this.checkArchiveContent(result, archiveList);
}
/**
* Tries to delete the file "bla/test5.xml" from an archive. This should
* result in the deletion of "bla/test5.xml".
*
* @throws Exception
*/
@Test
public void testDeleteFile() throws Exception {
final String archivename = "cpio";
final File input = this.createArchive(archivename);
ArchiveOutputStream out = null;
ArchiveInputStream ais = null;
final File result = File.createTempFile("test", "."+archivename);
result.deleteOnExit();
try {
final InputStream is = new FileInputStream(input);
ais = factory.createArchiveInputStream(archivename, is);
out = factory.createArchiveOutputStream(archivename,
new FileOutputStream(result));
final ChangeSet changes = new ChangeSet();
changes.delete("bla/test5.xml");
archiveListDelete("bla/test5.xml");
final ChangeSetPerformer performer = new ChangeSetPerformer(changes);
performer.perform(ais, out);
is.close();
} finally {
if (out != null) {
out.close();
}
if (ais != null) {
ais.close();
}
}
this.checkArchiveContent(result, archiveList);
}
/**
* Tries to delete the file "bla" from an archive. This should
* result in the deletion of nothing.
*
* @throws Exception
*/
@Test
public void testDeleteFile2() throws Exception {
final String archivename = "cpio";
final File input = this.createArchive(archivename);
ArchiveOutputStream out = null;
ArchiveInputStream ais = null;
final File result = File.createTempFile("test", "."+archivename);
result.deleteOnExit();
try {
final InputStream is = new FileInputStream(input);
ais = factory.createArchiveInputStream(archivename, is);
out = factory.createArchiveOutputStream(archivename,
new FileOutputStream(result));
final ChangeSet changes = new ChangeSet();
changes.delete("bla");
//archiveListDelete("bla");
final ChangeSetPerformer performer = new ChangeSetPerformer(changes);
performer.perform(ais, out);
is.close();
} finally {
if (out != null) {
out.close();
}
if (ais != null) {
ais.close();
}
}
this.checkArchiveContent(result, archiveList);
}
/**
* Tries to delete and then add a file with the same name.
* Should delete test/test3.xml and adds test.txt with the name
* test/test3.xml
*
* @throws Exception
*/
@Test
public void testDeletePlusAddSame() throws Exception {
final String archivename = "zip";
final File input = this.createArchive(archivename);
ArchiveOutputStream out = null;
ArchiveInputStream ais = null;
final File result = File.createTempFile("test", "."+archivename);
result.deleteOnExit();
File testtxt = null;
try {
final InputStream is = new FileInputStream(input);
ais = factory.createArchiveInputStream(archivename, is);
out = factory.createArchiveOutputStream(archivename,
new FileOutputStream(result));
final ChangeSet changes = new ChangeSet();
changes.delete("test/test3.xml");
archiveListDelete("test/test3.xml");
// Add a file
testtxt = getFile("test.txt");
final ArchiveEntry entry = out.createArchiveEntry(testtxt, "test/test3.xml");
changes.add(entry, new FileInputStream(testtxt));
archiveList.add("test/test3.xml");
final ChangeSetPerformer performer = new ChangeSetPerformer(changes);
performer.perform(ais, out);
is.close();
} finally {
if (out != null) {
out.close();
}
if (ais != null) {
ais.close();
}
}
// Checks
ArchiveInputStream in = null;
File check = null;
try {
final InputStream is = new FileInputStream(result);
final BufferedInputStream buf = new BufferedInputStream(is);
in = factory.createArchiveInputStream(buf);
check = this.checkArchiveContent(in, archiveList, false);
final File test3xml = new File(check,"result/test/test3.xml");
assertEquals(testtxt.length(), test3xml.length());
final BufferedReader reader = new BufferedReader(new FileReader(test3xml));
String str;
while ((str = reader.readLine()) != null) {
// All lines look like this
"111111111111111111111111111000101011".equals(str);
}
reader.close();
} finally {
if (in != null) {
in.close();
}
rmdir(check);
}
}
/**
* Checks for the correct ChangeSetResults
*
* @throws Exception
*/
@Test
public void testChangeSetResults() throws Exception {
final String archivename = "cpio";
final File input = this.createArchive(archivename);
ArchiveOutputStream out = null;
ArchiveInputStream ais = null;
final File result = File.createTempFile("test", "."+archivename);
result.deleteOnExit();
try {
final InputStream is = new FileInputStream(input);
ais = factory.createArchiveInputStream(archivename, is);
out = factory.createArchiveOutputStream(archivename,
new FileOutputStream(result));
final ChangeSet changes = new ChangeSet();
changes.deleteDir("bla");
archiveListDeleteDir("bla");
// Add a file
final File file1 = getFile("test.txt");
final ArchiveEntry entry = out.createArchiveEntry(file1, "bla/test.txt");
changes.add(entry, new FileInputStream(file1));
archiveList.add("bla/test.txt");
final ChangeSetPerformer performer = new ChangeSetPerformer(changes);
final ChangeSetResults results = performer.perform(ais, out);
is.close();
// Checks
assertEquals(1,results.getAddedFromChangeSet().size());
assertEquals("bla/test.txt",results.getAddedFromChangeSet().iterator().next());
assertEquals(3,results.getDeleted().size());
assertTrue(results.getDeleted().contains("bla/test4.xml"));
assertTrue(results.getDeleted().contains("bla/test5.xml"));
assertTrue(results.getDeleted().contains("bla/blubber/test6.xml"));
assertTrue(results.getAddedFromStream().contains("testdata/test1.xml"));
assertTrue(results.getAddedFromStream().contains("testdata/test2.xml"));
assertTrue(results.getAddedFromStream().contains("test/test3.xml"));
assertTrue(results.getAddedFromStream().contains("test.txt"));
assertTrue(results.getAddedFromStream().contains("something/bla"));
assertTrue(results.getAddedFromStream().contains("test with spaces.txt"));
assertEquals(6,results.getAddedFromStream().size());
} finally {
if (out != null) {
out.close();
}
if (ais != null) {
ais.close();
}
}
this.checkArchiveContent(result, archiveList);
}
/**
* Tries to delete a directory with a file and adds a new directory with a
* new file and with the same name. Should delete dir1/* and add
* dir1/test.txt at the end
*
* @throws Exception
*/
@Test
public void testDeletePlusAdd() throws Exception {
final String archivename = "cpio";
final File input = this.createArchive(archivename);
ArchiveOutputStream out = null;
ArchiveInputStream ais = null;
final File result = File.createTempFile("test", "."+archivename);
result.deleteOnExit();
try {
final InputStream is = new FileInputStream(input);
ais = factory.createArchiveInputStream(archivename, is);
out = factory.createArchiveOutputStream(archivename,
new FileOutputStream(result));
final ChangeSet changes = new ChangeSet();
changes.deleteDir("bla");
archiveListDeleteDir("bla");
// Add a file
final File file1 = getFile("test.txt");
final ArchiveEntry entry = out.createArchiveEntry(file1, "bla/test.txt");
changes.add(entry, new FileInputStream(file1));
archiveList.add("bla/test.txt");
final ChangeSetPerformer performer = new ChangeSetPerformer(changes);
performer.perform(ais, out);
is.close();
} finally {
if (out != null) {
out.close();
}
if (ais != null) {
ais.close();
}
}
this.checkArchiveContent(result, archiveList);
}
/**
* Adds a file to a zip archive. Deletes an other file.
*
* @throws Exception
*/
@Test
public void testDeleteFromAndAddToZip() throws Exception {
final String archivename = "zip";
final File input = this.createArchive(archivename);
ArchiveOutputStream out = null;
ArchiveInputStream ais = null;
final File result = File.createTempFile("test", "."+archivename);
result.deleteOnExit();
try {
final InputStream is = new FileInputStream(input);
ais = factory.createArchiveInputStream(archivename, is);
out = factory.createArchiveOutputStream(archivename,
new FileOutputStream(result));
final ChangeSet changes = new ChangeSet();
final File file1 = getFile("test.txt");
final ArchiveEntry entry = new ZipArchiveEntry("blub/test.txt");
changes.add(entry, new FileInputStream(file1));
archiveList.add("blub/test.txt");
changes.delete("testdata/test1.xml");
archiveListDelete("testdata/test1.xml");
final ChangeSetPerformer performer = new ChangeSetPerformer(changes);
performer.perform(ais, out);
is.close();
} finally {
if (out != null) {
out.close();
}
if (ais != null) {
ais.close();
}
}
this.checkArchiveContent(result, archiveList);
}
/**
* Adds a file to a zip archive. Deletes an other file.
*
* @throws Exception
*/
@Test
public void testDeleteFromAndAddToZipUsingZipFilePerform() throws Exception {
final String archivename = "zip";
final File input = this.createArchive(archivename);
ArchiveOutputStream out = null;
ZipFile ais = null;
final File result = File.createTempFile("test", "."+archivename);
result.deleteOnExit();
try {
ais = new ZipFile(input);
out = factory.createArchiveOutputStream(archivename,
new FileOutputStream(result));
final ChangeSet changes = new ChangeSet();
final File file1 = getFile("test.txt");
final ArchiveEntry entry = new ZipArchiveEntry("blub/test.txt");
changes.add(entry, new FileInputStream(file1));
archiveList.add("blub/test.txt");
changes.delete("testdata/test1.xml");
archiveListDelete("testdata/test1.xml");
final ChangeSetPerformer performer = new ChangeSetPerformer(changes);
performer.perform(ais, out);
} finally {
if (out != null) {
out.close();
}
if (ais != null) {
ais.close();
}
}
this.checkArchiveContent(result, archiveList);
}
/**
* add blub/test.txt + delete blub Should add blub/test.txt and delete it
* afterwards. In this example, the archive should stay untouched.
*
* @throws Exception
*/
@Test
public void testAddDeleteAdd() throws Exception {
final String archivename = "cpio";
final File input = this.createArchive(archivename);
ArchiveOutputStream out = null;
ArchiveInputStream ais = null;
final File result = File.createTempFile("test", "."+archivename);
result.deleteOnExit();
try {
final InputStream is = new FileInputStream(input);
ais = factory.createArchiveInputStream(archivename, is);
out = factory.createArchiveOutputStream(archivename,
new FileOutputStream(result));
final ChangeSet changes = new ChangeSet();
final File file1 = getFile("test.txt");
final ArchiveEntry entry = new CpioArchiveEntry("blub/test.txt");
changes.add(entry, new FileInputStream(file1));
archiveList.add("blub/test.txt");
changes.deleteDir("blub");
archiveListDeleteDir("blub");
final ChangeSetPerformer performer = new ChangeSetPerformer(changes);
performer.perform(ais, out);
is.close();
} finally {
if (out != null) {
out.close();
}
if (ais != null) {
ais.close();
}
}
this.checkArchiveContent(result, archiveList);
}
/**
* delete bla + add bla/test.txt + delete bla Deletes dir1/* first, then
* suppresses the add of bla.txt because there is a delete operation later.
*
* @throws Exception
*/
@Test
public void testDeleteAddDelete() throws Exception {
final String archivename = "cpio";
final File input = this.createArchive(archivename);
ArchiveOutputStream out = null;
ArchiveInputStream ais = null;
final File result = File.createTempFile("test", "."+archivename);
result.deleteOnExit();
try {
final InputStream is = new FileInputStream(input);
ais = factory.createArchiveInputStream(archivename, is);
out = factory.createArchiveOutputStream(archivename,
new FileOutputStream(result));
final ChangeSet changes = new ChangeSet();
changes.deleteDir("bla");
final File file1 = getFile("test.txt");
final ArchiveEntry entry = new CpioArchiveEntry("bla/test.txt");
changes.add(entry, new FileInputStream(file1));
archiveList.add("bla/test.txt");
changes.deleteDir("bla");
archiveListDeleteDir("bla");
final ChangeSetPerformer performer = new ChangeSetPerformer(changes);
performer.perform(ais, out);
is.close();
} finally {
if (out != null) {
out.close();
}
if (ais != null) {
ais.close();
}
}
this.checkArchiveContent(result, archiveList);
}
/**
* Simple Delete from a zip file.
*
* @throws Exception
*/
@Test
public void testDeleteFromZip() throws Exception {
ArchiveOutputStream out = null;
ArchiveInputStream ais = null;
File temp = null;
try {
final ChangeSet changes = new ChangeSet();
changes.delete("test2.xml");
final File input = getFile("bla.zip");
final InputStream is = new FileInputStream(input);
ais = factory.createArchiveInputStream("zip", is);
temp = File.createTempFile("test", ".zip");
temp.deleteOnExit();
out = factory.createArchiveOutputStream("zip",
new FileOutputStream(temp));
final ChangeSetPerformer performer = new ChangeSetPerformer(changes);
performer.perform(ais, out);
} finally {
if (out != null) {
out.close();
}
if (ais != null) {
ais.close();
}
}
final List<String> expected = new ArrayList<>();
expected.add("test1.xml");
this.checkArchiveContent(temp, expected);
}
/**
* Simple delete from a tar file
*
* @throws Exception
*/
@Test
public void testDeleteFromTar() throws Exception {
ArchiveOutputStream out = null;
ArchiveInputStream ais = null;
File temp = null;
try {
final ChangeSet changes = new ChangeSet();
changes.delete("test2.xml");
final File input = getFile("bla.tar");
final InputStream is = new FileInputStream(input);
ais = factory.createArchiveInputStream("tar", is);
temp = new File(dir, "bla.tar");
out = factory.createArchiveOutputStream("tar",
new FileOutputStream(temp));
final ChangeSetPerformer performer = new ChangeSetPerformer(changes);
performer.perform(ais, out);
} finally {
if (out != null) {
out.close();
}
if (ais != null) {
ais.close();
}
}
final List<String> expected = new ArrayList<>();
expected.add("test1.xml");
this.checkArchiveContent(temp, expected);
}
/**
* Simple delete from a jar file
*
* @throws Exception
*/
@Test
public void testDeleteFromJar() throws Exception {
ArchiveOutputStream out = null;
ArchiveInputStream ais = null;
File temp = null;
try {
final ChangeSet changes = new ChangeSet();
changes.delete("test2.xml");
changes.deleteDir("META-INF");
changes.delete(".classpath");
changes.delete(".project");
final File input = getFile("bla.jar");
final InputStream is = new FileInputStream(input);
ais = factory.createArchiveInputStream("jar", is);
temp = new File(dir, "bla.jar");
out = factory.createArchiveOutputStream("jar",
new FileOutputStream(temp));
final ChangeSetPerformer performer = new ChangeSetPerformer(changes);
performer.perform(ais, out);
} finally {
if (out != null) {
out.close();
}
if (ais != null) {
ais.close();
}
}
final List<String> expected = new ArrayList<>();
expected.add("test1.xml");
this.checkArchiveContent(temp, expected);
}
@Test
public void testDeleteFromAndAddToTar() throws Exception {
ArchiveOutputStream out = null;
ArchiveInputStream ais = null;
File temp = null;
try {
final ChangeSet changes = new ChangeSet();
changes.delete("test2.xml");
final File file1 = getFile("test.txt");
final TarArchiveEntry entry = new TarArchiveEntry(
"testdata/test.txt");
entry.setModTime(0);
entry.setSize(file1.length());
entry.setUserId(0);
entry.setGroupId(0);
entry.setUserName("avalon");
entry.setGroupName("excalibur");
entry.setMode(0100000);
changes.add(entry, new FileInputStream(file1));
final File input = getFile("bla.tar");
final InputStream is = new FileInputStream(input);
ais = factory.createArchiveInputStream("tar", is);
temp = new File(dir, "bla.tar");
out = factory.createArchiveOutputStream("tar",
new FileOutputStream(temp));
final ChangeSetPerformer performer = new ChangeSetPerformer(changes);
performer.perform(ais, out);
} finally {
if (out != null) {
out.close();
}
if (ais != null) {
ais.close();
}
}
final List<String> expected = new ArrayList<>();
expected.add("test1.xml");
expected.add("testdata/test.txt");
final ArchiveInputStream in = factory.createArchiveInputStream("tar", new FileInputStream(temp));
this.checkArchiveContent(in, expected);
}
/**
* Delete from a jar file and add another file
*
* @throws Exception
*/
@Test
public void testDeleteFromAndAddToJar() throws Exception {
ArchiveOutputStream out = null;
ArchiveInputStream ais = null;
File temp = null;
try {
final ChangeSet changes = new ChangeSet();
changes.delete("test2.xml");
changes.deleteDir("META-INF");
changes.delete(".classpath");
changes.delete(".project");
final File file1 = getFile("test.txt");
final JarArchiveEntry entry = new JarArchiveEntry("testdata/test.txt");
changes.add(entry, new FileInputStream(file1));
final File input = getFile("bla.jar");
final InputStream is = new FileInputStream(input);
ais = factory.createArchiveInputStream("jar", is);
temp = new File(dir, "bla.jar");
out = factory.createArchiveOutputStream("jar",
new FileOutputStream(temp));
final ChangeSetPerformer performer = new ChangeSetPerformer(changes);
performer.perform(ais, out);
} finally {
if (out != null) {
out.close();
}
if (ais != null) {
ais.close();
}
}
final List<String> expected = new ArrayList<>();
expected.add("test1.xml");
expected.add("testdata/test.txt");
this.checkArchiveContent(temp, expected);
}
/**
* Simple delete from an ar file
*
* @throws Exception
*/
@Test
public void testDeleteFromAr() throws Exception {
ArchiveOutputStream out = null;
ArchiveInputStream ais = null;
File temp = null;
try {
final ChangeSet changes = new ChangeSet();
changes.delete("test2.xml");
final File input = getFile("bla.ar");
final InputStream is = new FileInputStream(input);
ais = factory.createArchiveInputStream("ar", is);
temp = new File(dir, "bla.ar");
out = factory.createArchiveOutputStream("ar",
new FileOutputStream(temp));
final ChangeSetPerformer performer = new ChangeSetPerformer(changes);
performer.perform(ais, out);
} finally {
if (out != null) {
out.close();
}
if (ais != null) {
ais.close();
}
}
final List<String> expected = new ArrayList<>();
expected.add("test1.xml");
this.checkArchiveContent(temp, expected);
}
/**
* Deletes a file from an AR-archive and adds another
*
* @throws Exception
*/
@Test
public void testDeleteFromAndAddToAr() throws Exception {
ArchiveOutputStream out = null;
ArchiveInputStream ais = null;
File temp = null;
try {
final ChangeSet changes = new ChangeSet();
changes.delete("test2.xml");
final File file1 = getFile("test.txt");
final ArArchiveEntry entry = new ArArchiveEntry("test.txt", file1
.length());
changes.add(entry, new FileInputStream(file1));
final File input = getFile("bla.ar");
final InputStream is = new FileInputStream(input);
ais = factory.createArchiveInputStream("ar", is);
temp = new File(dir, "bla.ar");
out = factory.createArchiveOutputStream("ar",
new FileOutputStream(temp));
final ChangeSetPerformer performer = new ChangeSetPerformer(changes);
performer.perform(ais, out);
} finally {
if (out != null) {
out.close();
}
if (ais != null) {
ais.close();
}
}
final List<String> expected = new ArrayList<>();
expected.add("test1.xml");
expected.add("test.txt");
this.checkArchiveContent(temp, expected);
}
/**
* TODO: Move operations are not supported currently
*
* mv dir1/test.text dir2/test.txt + delete dir1 Moves the file to dir2 and
* deletes everything in dir1
*
* @throws Exception
*/
@Test
public void testRenameAndDelete() throws Exception {
}
/**
* TODO: Move operations are not supported currently
*
* add dir1/bla.txt + mv dir1/test.text dir2/test.txt + delete dir1
*
* Add dir1/bla.txt should be surpressed. All other dir1 files will be
* deleted, except dir1/test.text will be moved
*
* @throws Exception
*/
@Test
public void testAddMoveDelete() throws Exception {
}
/**
* Check can add a file to an empty archive.
*
* @throws Exception
*/
@Test
public void testAddToEmptyArchive() throws Exception {
final String archivename = "zip";
final File input = this.createEmptyArchive(archivename);
ArchiveOutputStream out = null;
ArchiveInputStream ais = null;
InputStream is = null;
final File result = File.createTempFile("test", "."+archivename);
result.deleteOnExit();
final ChangeSet changes = new ChangeSet();
try {
is = new FileInputStream(input);
ais = factory.createArchiveInputStream(archivename, is);
out = factory.createArchiveOutputStream(archivename,
new FileOutputStream(result));
final File file1 = getFile("test.txt");
final ArchiveEntry entry = new ZipArchiveEntry("bla/test.txt");
changes.add(entry, new FileInputStream(file1));
archiveList.add("bla/test.txt");
final ChangeSetPerformer performer = new ChangeSetPerformer(changes);
performer.perform(ais, out);
is.close();
} finally {
if (out != null) {
out.close();
}
if (ais != null) {
ais.close(); // will close is
} else if (is != null){
is.close();
}
}
this.checkArchiveContent(result, archiveList);
}
/**
* Check can delete and add a file to an archive with a single file
*
* @throws Exception
*/
@Test
public void testDeleteAddToOneFileArchive() throws Exception {
final String archivename = "zip";
final File input = this.createSingleEntryArchive(archivename);
ArchiveOutputStream out = null;
ArchiveInputStream ais = null;
InputStream is = null;
final File result = File.createTempFile("test", "."+archivename);
result.deleteOnExit();
final ChangeSet changes = new ChangeSet();
try {
is = new FileInputStream(input);
ais = factory.createArchiveInputStream(archivename, is);
out = factory.createArchiveOutputStream(archivename,
new FileOutputStream(result));
changes.delete("test1.xml");
archiveListDelete("test1.xml");
final File file = getFile("test.txt");
final ArchiveEntry entry = out.createArchiveEntry(file,"bla/test.txt");
changes.add(entry, new FileInputStream(file));
archiveList.add("bla/test.txt");
final ChangeSetPerformer performer = new ChangeSetPerformer(changes);
performer.perform(ais, out);
is.close();
} finally {
if (out != null) {
out.close();
}
if (ais != null) {
ais.close(); // will close is
} else if (is != null){
is.close();
}
}
this.checkArchiveContent(result, archiveList);
}
/**
* Check can add and delete a file to an archive with a single file
*
* @throws Exception
*/
@Test
public void testAddDeleteToOneFileArchive() throws Exception {
final String archivename = "cpio";
final File input = this.createSingleEntryArchive(archivename);
ArchiveOutputStream out = null;
ArchiveInputStream ais = null;
InputStream is = null;
final File result = File.createTempFile("test", "."+archivename);
result.deleteOnExit();
final ChangeSet changes = new ChangeSet();
try {
is = new FileInputStream(input);
ais = factory.createArchiveInputStream(archivename, is);
out = factory.createArchiveOutputStream(archivename,
new FileOutputStream(result));
final File file = getFile("test.txt");
final ArchiveEntry entry = out.createArchiveEntry(file,"bla/test.txt");
changes.add(entry, new FileInputStream(file));
archiveList.add("bla/test.txt");
changes.delete("test1.xml");
archiveListDelete("test1.xml");
final ChangeSetPerformer performer = new ChangeSetPerformer(changes);
performer.perform(ais, out);
is.close();
} finally {
if (out != null) {
out.close();
}
if (ais != null) {
ais.close(); // will close is
} else if (is != null){
is.close();
}
}
this.checkArchiveContent(result, archiveList);
}
/**
* Adds a file with the same filename as an existing file from the stream.
* Should lead to a replacement.
*
* @throws Exception
*/
@Test
public void testAddAllreadyExistingWithReplaceTrue() throws Exception {
final String archivename = "zip";
final File input = this.createArchive(archivename);
ArchiveOutputStream out = null;
ArchiveInputStream ais = null;
final File result = File.createTempFile("test", "."+archivename);
result.deleteOnExit();
try {
final InputStream is = new FileInputStream(input);
ais = factory.createArchiveInputStream(archivename, is);
out = factory.createArchiveOutputStream(archivename,
new FileOutputStream(result));
final ChangeSet changes = new ChangeSet();
final File file1 = getFile("test.txt");
final ArchiveEntry entry = new ZipArchiveEntry("testdata/test1.xml");
changes.add(entry, new FileInputStream(file1), true);
final ChangeSetPerformer performer = new ChangeSetPerformer(changes);
final ChangeSetResults results = performer.perform(ais, out);
assertTrue(results.getAddedFromChangeSet().contains("testdata/test1.xml"));
is.close();
} finally {
if (out != null) {
out.close();
}
if (ais != null) {
ais.close();
}
}
this.checkArchiveContent(result, archiveList);
}
/**
* Adds a file with the same filename as an existing file from the stream.
* Should lead to a replacement.
*
* @throws Exception
*/
@Test
public void testAddAllreadyExistingWithReplaceFalse() throws Exception {
final String archivename = "zip";
final File input = this.createArchive(archivename);
ArchiveOutputStream out = null;
ArchiveInputStream ais = null;
final File result = File.createTempFile("test", "."+archivename);
result.deleteOnExit();
try {
final InputStream is = new FileInputStream(input);
ais = factory.createArchiveInputStream(archivename, is);
out = factory.createArchiveOutputStream(archivename,
new FileOutputStream(result));
final ChangeSet changes = new ChangeSet();
final File file1 = getFile("test.txt");
final ArchiveEntry entry = new ZipArchiveEntry("testdata/test1.xml");
changes.add(entry, new FileInputStream(file1), false);
final ChangeSetPerformer performer = new ChangeSetPerformer(changes);
final ChangeSetResults results = performer.perform(ais, out);
assertTrue(results.getAddedFromStream().contains("testdata/test1.xml"));
assertTrue(results.getAddedFromChangeSet().isEmpty());
assertTrue(results.getDeleted().isEmpty());
is.close();
} finally {
if (out != null) {
out.close();
}
if (ais != null) {
ais.close();
}
}
this.checkArchiveContent(result, archiveList);
}
}