package org.codehaus.mojo.deb.jdpkg.ar;
import junit.framework.TestCase;
import static org.codehaus.mojo.deb.jdpkg.ar.ArWriterTest.*;
import org.codehaus.plexus.util.IOUtil;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.Iterator;
/**
* @author <a href="mailto:trygve.laugstol@arktekk.no">Trygve Laugstøl</a>
* @version $Id$
*/
public class ArTest extends TestCase {
private File file1 = new File("file1");
private String file1Contents = "Hello World";
private File file2 = new File("file2");
private String file2Contents = "I'm going to be skipped!";
private File file3 = new File("file3");
private String file3Contents = "Hello World, weee!"; // odd number of characters
private File myAr = new File("my.ar");
public ArTest() throws Exception {
Writer writer = new OutputStreamWriter(new FileOutputStream(file1), "UTF-16");
writer.write(file1Contents);
writer.close();
writer = new OutputStreamWriter(new FileOutputStream(file2), "UTF-16");
writer.write(file2Contents);
writer.close();
writer = new OutputStreamWriter(new FileOutputStream(file3), "UTF-16");
writer.write(file3Contents);
writer.close();
}
public void testAr() throws Exception {
writeFiles();
Ar.create().
addFile(file1).withUid(10).withGid(100).done().
addFileDone(file2).
addFileDone(file3).
storeToFile(myAr);
assertTrue(myAr.canRead());
assertEquals(8 +
60 + file1.length() +
60 + file2.length(),
60 + file3.length(),
myAr.length());
CloseableIterable<ReadableArFile> reader = Ar.read(myAr);
Iterator<ReadableArFile> it = reader.iterator();
ReadableArFile arFile;
assertTrue(it.hasNext());
assertTrue(it.hasNext());
assertTrue(it.hasNext());
arFile = it.next();
assertNotNull(arFile);
assertEquals(file1.getName(), arFile.name);
assertEquals(file1.lastModified() / 1000, arFile.lastModified);
assertEquals(10, arFile.ownerId);
assertEquals(100, arFile.groupId);
assertEquals(420, arFile.mode);
assertEquals(file1.length(), arFile.size);
assertOpenable(file1, arFile, file1Contents);
assertTrue(it.hasNext());
assertTrue(it.hasNext());
it.next();
assertTrue(it.hasNext());
assertTrue(it.hasNext());
arFile = it.next();
assertNotNull(arFile);
assertEquals(file3.getName(), arFile.name);
assertEquals(file3.lastModified() / 1000, arFile.lastModified);
assertEquals(0, arFile.ownerId);
assertEquals(0, arFile.groupId);
assertEquals(420, arFile.mode);
assertEquals(file3.length(), arFile.size);
assertOpenable(file3, arFile, file3Contents);
assertFalse(it.hasNext());
assertFalse(it.hasNext());
assertFalse(it.hasNext());
}
private void assertOpenable(File file, ReadableArFile arFile, String contents) throws IOException {
InputStream is = arFile.open();
byte[] bytes = IOUtil.toByteArray(is);
assertEquals("File length vs bytes read.", file.length(), bytes.length);
assertEquals(contents, new String(bytes, "UTF-16"));
is.close();
is.close();
try {
arFile.open();
fail("Expected IOException when opening a ReadableArFile twice.");
}
catch (RuntimeException ex) {
assertTrue(ex.getMessage().indexOf("already been read") > 0);
// expected
}
}
}