package nl.siegmann.epublib.epub;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import net.sf.jazzlib.ZipFile;
import net.sf.jazzlib.ZipInputStream;
import nl.siegmann.epublib.domain.LazyResource;
import nl.siegmann.epublib.domain.Resource;
import nl.siegmann.epublib.domain.Resources;
import nl.siegmann.epublib.service.MediatypeService;
import nl.siegmann.epublib.util.IOUtil;
import org.junit.AfterClass;
import org.junit.Assert;
import org.junit.BeforeClass;
import org.junit.Test;
public class ResourcesLoaderTest {
private static final String encoding = "UTF-8";
private static String testBookFilename;
@BeforeClass
public static void setUpClass() throws IOException {
File testbook = File.createTempFile("testbook", ".epub");
OutputStream out = new FileOutputStream(testbook);
IOUtil.copy(ResourcesLoaderTest.class.getResourceAsStream("/testbook1.epub"), out);
out.close();
ResourcesLoaderTest.testBookFilename = testbook.getAbsolutePath();
}
@AfterClass
public static void tearDownClass() {
new File(testBookFilename).delete();
}
/**
* Loads the Resource from an InputStream
*
* @throws FileNotFoundException
* @throws IOException
*/
@Test
public void testLoadResources_InputStream() throws FileNotFoundException, IOException {
// given
InputStream inputStream = new FileInputStream(new File(testBookFilename));
// when
Resources resources = ResourcesLoader.loadResources(inputStream, encoding);
// then
verifyResources(resources);
}
/**
* Loads the Resources from a ZipInputStream
*
* @throws FileNotFoundException
* @throws IOException
*/
@Test
public void testLoadResources_ZipInputStream() throws FileNotFoundException, IOException {
// given
ZipInputStream zipInputStream = new ZipInputStream(new FileInputStream(new File(testBookFilename)));
// when
Resources resources = ResourcesLoader.loadResources(zipInputStream, encoding);
// then
verifyResources(resources);
}
/**
* Loads the Resources from a ZipFile
*
* @throws FileNotFoundException
* @throws IOException
*/
@Test
public void testLoadResources_ZipFile() throws FileNotFoundException, IOException {
// given
ZipFile zipFile = new ZipFile(testBookFilename);
// when
Resources resources = ResourcesLoader.loadResources(zipFile, encoding);
// then
verifyResources(resources);
}
/**
* Loads all Resources lazily from a ZipFile
*
* @throws FileNotFoundException
* @throws IOException
*/
@Test
public void testLoadResources_ZipFile_lazy_all() throws FileNotFoundException, IOException {
// given
ZipFile zipFile = new ZipFile(testBookFilename);
// when
Resources resources = ResourcesLoader.loadResources(zipFile, encoding, Arrays.asList(MediatypeService.mediatypes));
// then
verifyResources(resources);
Assert.assertEquals(Resource.class, resources.getById("container").getClass());
Assert.assertEquals(LazyResource.class, resources.getById("book1").getClass());
}
/**
* Loads the Resources from a ZipFile, some of them lazily.
*
* @throws FileNotFoundException
* @throws IOException
*/
@Test
public void testLoadResources_ZipFile_partial_lazy() throws FileNotFoundException, IOException {
// given
ZipFile zipFile = new ZipFile(testBookFilename);
// when
Resources resources = ResourcesLoader.loadResources(zipFile, encoding, Arrays.asList(MediatypeService.CSS));
// then
verifyResources(resources);
Assert.assertEquals(Resource.class, resources.getById("container").getClass());
Assert.assertEquals(LazyResource.class, resources.getById("book1").getClass());
Assert.assertEquals(Resource.class, resources.getById("chapter1").getClass());
}
private void verifyResources(Resources resources) throws IOException {
Assert.assertNotNull(resources);
Assert.assertEquals(12, resources.getAll().size());
List<String> allHrefs = new ArrayList<String>(resources.getAllHrefs());
Collections.sort(allHrefs);
Resource resource;
byte[] expectedData;
// container
resource = resources.getByHref(allHrefs.get(0));
Assert.assertEquals("container", resource.getId());
Assert.assertEquals("META-INF/container.xml", resource.getHref());
Assert.assertNull(resource.getMediaType());
Assert.assertEquals(230, resource.getData().length);
// book1.css
resource = resources.getByHref(allHrefs.get(1));
Assert.assertEquals("book1", resource.getId());
Assert.assertEquals("OEBPS/book1.css", resource.getHref());
Assert.assertEquals(MediatypeService.CSS, resource.getMediaType());
Assert.assertEquals(65, resource.getData().length);
expectedData = IOUtil.toByteArray(this.getClass().getResourceAsStream("/book1/book1.css"));
Assert.assertTrue(Arrays.equals(expectedData, resource.getData()));
// chapter1
resource = resources.getByHref(allHrefs.get(2));
Assert.assertEquals("chapter1", resource.getId());
Assert.assertEquals("OEBPS/chapter1.html", resource.getHref());
Assert.assertEquals(MediatypeService.XHTML, resource.getMediaType());
Assert.assertEquals(247, resource.getData().length);
expectedData = IOUtil.toByteArray(this.getClass().getResourceAsStream("/book1/chapter1.html"));
Assert.assertTrue(Arrays.equals(expectedData, resource.getData()));
}
}