/*
* 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.archivers.tar;
import static org.junit.Assert.*;
import org.junit.Test;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Locale;
import org.apache.commons.compress.AbstractTestCase;
public class TarArchiveEntryTest implements TarConstants {
private static final String OS =
System.getProperty("os.name").toLowerCase(Locale.ENGLISH);
private static final String ROOT =
OS.startsWith("windows") || OS.startsWith("netware") ? "C:\\" : "/";
/**
* JIRA issue SANDBOX-284
*
* @see "https://issues.apache.org/jira/browse/SANDBOX-284"
*/
@Test
public void testFileSystemRoot() {
final TarArchiveEntry t = new TarArchiveEntry(new File(ROOT));
assertEquals("/", t.getName());
}
@Test
public void testTarFileWithFSRoot() throws IOException {
final File f = File.createTempFile("taetest", ".tar");
f.deleteOnExit();
TarArchiveOutputStream tout = null;
TarArchiveInputStream tin = null;
try {
tout = new TarArchiveOutputStream(new FileOutputStream(f));
TarArchiveEntry t = new TarArchiveEntry(new File(ROOT));
tout.putArchiveEntry(t);
tout.closeArchiveEntry();
t = new TarArchiveEntry(new File(new File(ROOT), "foo.txt"));
t.setSize(6);
tout.putArchiveEntry(t);
tout.write(new byte[] {'h', 'e', 'l', 'l', 'o', ' '});
tout.closeArchiveEntry();
t = new TarArchiveEntry(new File(new File(ROOT), "bar.txt")
.getAbsolutePath());
t.setSize(5);
tout.putArchiveEntry(t);
tout.write(new byte[] {'w', 'o', 'r', 'l', 'd'});
tout.closeArchiveEntry();
t = new TarArchiveEntry("dummy");
t.setName(new File(new File(ROOT), "baz.txt").getAbsolutePath());
t.setSize(1);
tout.putArchiveEntry(t);
tout.write(new byte[] {'!'});
tout.closeArchiveEntry();
tout.close();
tout = null;
tin = new TarArchiveInputStream(new FileInputStream(f));
//tin.setDebug(true);
t = tin.getNextTarEntry();
assertNotNull(t);
assertEquals("/", t.getName());
assertTrue(t.isCheckSumOK());
t = tin.getNextTarEntry();
assertNotNull(t);
assertEquals("foo.txt", t.getName());
assertTrue(t.isCheckSumOK());
t = tin.getNextTarEntry();
assertNotNull(t);
assertEquals("bar.txt", t.getName());
assertTrue(t.isCheckSumOK());
t = tin.getNextTarEntry();
assertNotNull(t);
assertEquals("baz.txt", t.getName());
assertTrue(t.isCheckSumOK());
} finally {
if (tin != null) {
tin.close();
}
if (tout != null) {
tout.close();
}
AbstractTestCase.tryHardToDelete(f);
}
}
@Test
public void testMaxFileSize(){
final TarArchiveEntry t = new TarArchiveEntry("");
t.setSize(0);
t.setSize(1);
try {
t.setSize(-1);
fail("Should have generated IllegalArgumentException");
} catch (final IllegalArgumentException expected) {
}
t.setSize(077777777777L);
t.setSize(0100000000000L);
}
@Test
public void testLinkFlagConstructor() {
final TarArchiveEntry t = new TarArchiveEntry("/foo", LF_GNUTYPE_LONGNAME);
assertGnuMagic(t);
assertEquals("foo", t.getName());
}
@Test
public void testLinkFlagConstructorWithFileFlag() {
final TarArchiveEntry t = new TarArchiveEntry("/foo", LF_NORMAL);
assertPosixMagic(t);
assertEquals("foo", t.getName());
}
@Test
public void testLinkFlagConstructorWithPreserve() {
final TarArchiveEntry t = new TarArchiveEntry("/foo", LF_GNUTYPE_LONGNAME,
true);
assertGnuMagic(t);
assertEquals("/foo", t.getName());
}
private void assertGnuMagic(final TarArchiveEntry t) {
assertEquals(MAGIC_GNU + VERSION_GNU_SPACE, readMagic(t));
}
private void assertPosixMagic(final TarArchiveEntry t) {
assertEquals(MAGIC_POSIX + VERSION_POSIX, readMagic(t));
}
private String readMagic(final TarArchiveEntry t) {
final byte[] buf = new byte[512];
t.writeEntryHeader(buf);
return new String(buf, MAGIC_OFFSET, MAGICLEN + VERSIONLEN);
}
}