blob: 941a8821053e87c68a3a77355e61eaab5fc5bf30 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2011, 2014 Torkild U. Resheim.
*
* All rights reserved. This program and the accompanying materials are made
* available under the terms of the Eclipse Public License v1.0 which
* accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Torkild U. Resheim - initial API and implementation
*******************************************************************************/
package org.eclipse.mylyn.docs.epub.tests.api;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import org.eclipse.emf.common.util.EList;
import org.eclipse.mylyn.docs.epub.core.EPUB;
import org.eclipse.mylyn.docs.epub.core.OPSPublication;
import org.eclipse.mylyn.docs.epub.core.Publication;
import org.eclipse.mylyn.docs.epub.ocf.Container;
import org.eclipse.mylyn.docs.epub.ocf.RootFile;
import org.eclipse.mylyn.docs.epub.ocf.RootFiles;
import org.junit.Test;
/**
* @author Torkild U. Resheim
*/
@SuppressWarnings("nls")
public class TestEPUB extends AbstractTest {
/**
* Test method for {@link org.eclipse.mylyn.docs.epub.core.EPUB#EPUB()}.
* <p>
* It must be possible to obtain the publication list which must be empty.
* </p>
*/
@Test
public final void testEPUB() {
EPUB epub = new EPUB();
assertEquals(true, epub.getOPSPublications().isEmpty());
}
/**
* Verify that we can open a basic EPUB file.
*
* @throws Exception
*/
@Test
public final void testEPUB3() throws Exception {
EPUB epub = new EPUB();
File epub_3 = new File("testdata/epub/basic_3.epub");
assertEquals(true, epub.isEPUB(epub_3));
epub.unpack(epub_3);
assertEquals(1, epub.getOPSPublications().size());
}
/**
* Test method for {@link org.eclipse.mylyn.docs.epub.core.EPUB#add(java.io.File, java.lang.String)} .
* <ul>
* <li>Publication MIME-type shall be correct</li>
* <li>Rootfile path shall be correct</li>
* <li>Rootfile object shall be correct.</li>
* </ul>
*
* @throws Exception
*/
@Test
public final void testAddFileString() throws Exception {
EPUB epub = new EPUB();
File drawing = new File("testdata/drawing.svg");
epub.add(drawing, "image/svg+xml");
Container container = epub.getContainer();
RootFiles rootfiles = container.getRootfiles();
EList<RootFile> files = rootfiles.getRootfiles();
assertEquals(true, files.get(0).getFullPath().equals("SVG+XML/drawing.svg"));
assertEquals(true, files.get(0).getMediaType().equals("image/svg+xml"));
assertEquals(true, files.get(0).getPublication() == drawing);
}
/**
* Test method for {@link org.eclipse.mylyn.docs.epub.core.EPUB#pack(java.io.File)}.
* <ul>
* <li>Shall throw exception when unknown publication type is added.</li>
* </ul>
*
* @throws Exception
*/
@Test
public final void testPackFail() throws Exception {
EPUB epub = new EPUB();
File drawing = new File("testdata/drawing.svg");
epub.add(drawing, "image/svg+xml");
Container container = epub.getContainer();
RootFiles rootfiles = container.getRootfiles();
EList<RootFile> files = rootfiles.getRootfiles();
files.get(0).setPublication(null);
try {
epub.pack(epubFile);
fail();
} catch (Exception e) {
}
}
/**
* Test method for {@link org.eclipse.mylyn.docs.epub.core.EPUB#add(org.eclipse.mylyn.docs.epub.core.Publication)} .
* <ul>
* <li>Container shall hold more than one OPS publication</li>
* <li>OPS structures shall follow naming conventions.</li>
* <li>OPS MIME-type shall be correct</li>
* <li>Rootfile object shall be correct.</li>
* </ul>
*
* @throws Exception
*/
@Test
public final void testAddOPSPublication() throws Exception {
EPUB epub = new EPUB();
Publication oebps1 = new OPSPublication();
Publication oebps2 = new OPSPublication();
epub.add(oebps1);
epub.add(oebps2);
Container container = epub.getContainer();
RootFiles rootfiles = container.getRootfiles();
EList<RootFile> files = rootfiles.getRootfiles();
assertEquals(true, files.get(0).getFullPath().equals("OEBPS/content.opf"));
assertEquals(true, files.get(1).getFullPath().equals("OEBPS_1/content.opf"));
assertEquals(true, files.get(0).getMediaType().equals("application/oebps-package+xml"));
assertEquals(true, files.get(1).getMediaType().equals("application/oebps-package+xml"));
assertEquals(true, files.get(0).getPublication() == oebps1);
assertEquals(true, files.get(1).getPublication() == oebps2);
}
/**
* Test method for {@link org.eclipse.mylyn.docs.epub.core.EPUB#getOPSPublications()}.
* <p>
* One OPS-publication and one SVG drawing are added. Only the OPS-publication shall be returned.
* </p>
*
* @throws Exception
*/
@Test
public final void testGetOPSPublications() throws Exception {
EPUB epub = new EPUB();
Publication oebps = new OPSPublication();
epub.add(oebps);
File drawing = new File("testdata/drawing.svg");
epub.add(drawing, "image/svg+xml");
assertEquals(1, epub.getOPSPublications().size());
}
/**
* Test method for {@link org.eclipse.mylyn.docs.epub.core.EPUB#pack(java.io.File)}.
* <ul>
* <li>Temporary folder shall not exist when job is done.</li>
* </ul>
*
* @throws Exception
*/
@Test
public final void testPackFile() throws Exception {
EPUB epub = new EPUB();
Publication oebps = new OPSPublication();
oebps.addItem(new File("testdata/plain-page.xhtml"));
epub.add(oebps);
File drawing = new File("testdata/drawing.svg");
epub.add(drawing, "image/svg+xml");
File tempFolder = epub.pack(epubFile);
assertEquals(false, tempFolder.exists());
}
/**
* Test method for {@link org.eclipse.mylyn.docs.epub.core.EPUB#pack(java.io.File, java.io.File)} .
* <ul>
* <li>Work folder shall exist when job is done.</li>
* <li>Work folder shall contain EPUB artifacts.</li>
* <li>Exception shall be thrown if working folder already exist.</li>
* </ul>
*
* @throws Exception
*/
@Test
public final void testPackFileFile() throws Exception {
EPUB epub = new EPUB();
Publication oebps = new OPSPublication();
oebps.addItem(new File("testdata/plain-page.xhtml"));
epub.add(oebps);
epub.pack(epubFile, epubFolder);
// Make sure all required files are present
File metaFolder = new File(epubFolder.getAbsolutePath() + File.separator + "META-INF");
assertEquals(true, metaFolder.exists());
assertEquals(true, metaFolder.isDirectory());
File containerFile = new File(
epubFolder.getAbsolutePath() + File.separator + "META-INF" + File.separator + "container.xml");
assertEquals(true, containerFile.exists());
assertEquals(false, containerFile.isDirectory());
File oebpsFolder = new File(epubFolder.getAbsolutePath() + File.separator + "OEBPS");
assertEquals(true, oebpsFolder.exists());
assertEquals(true, oebpsFolder.isDirectory());
}
/**
* Test method for {@link org.eclipse.mylyn.docs.epub.core.EPUB#pack(java.io.File, java.io.File)} .
* <ul>
* <li>Exception shall be thrown if working folder already exist.</li>
* </ul>
*
* @throws Exception
*/
@Test
public final void testPackFileFileExists() throws Exception {
File workingFolder = File.createTempFile("epub_", null);
EPUB epub = new EPUB();
Publication oebps = new OPSPublication();
epub.add(oebps);
try {
epub.pack(epubFile, workingFolder);
fail();
} catch (Exception e) {
}
}
/**
* Test method for {@link org.eclipse.mylyn.docs.epub.core.EPUB#pack(java.io.File)} .
* <ul>
* <li>Exception shall be thrown if the EPUB is empty.</li>
* </ul>
*
* @throws Exception
*/
@Test
public final void testPackMissingPublication() throws Exception {
try {
epub.pack(epubFile);
fail();
} catch (Exception e) {
}
}
/**
* Test method for {@link org.eclipse.mylyn.docs.epub.core.EPUB#unpack(java.io.File)}.
* <ul>
* <li>Unpacked EPUB shall have the same contents as the packed one.</li>
* </ul>
*
* @throws Exception
*/
@Test
public final void testUnpackFile() throws Exception {
EPUB epub = new EPUB();
Publication oebps = new OPSPublication();
oebps.addItem(new File("testdata/plain-page.xhtml"));
epub.add(oebps);
epub.pack(epubFile, epubFolder);
EPUB epub2 = new EPUB();
epub2.unpack(epubFile);
assertEquals(1, epub2.getOPSPublications().size());
}
/**
* Test method for {@link org.eclipse.mylyn.docs.epub.core.EPUB#unpack(java.io.File, java.io.File)} .
*
* @throws Exception
*/
@Test
public final void testUnpackFileFile() throws Exception {
// First pack the EPUB
EPUB epub = new EPUB();
Publication oebps = new OPSPublication();
oebps.addItem(new File("testdata/plain-page.xhtml"));
epub.add(oebps);
epub.pack(epubFile, epubFolder);
deleteFolder(epubFolder);
// Then check for some contents when unpacked
EPUB epub2 = new EPUB();
epub2.unpack(epubFile, epubFolder);
// Make sure all required files are present
File metaFolder = new File(epubFolder.getAbsolutePath() + File.separator + "META-INF");
assertEquals(true, metaFolder.exists());
assertEquals(true, metaFolder.isDirectory());
File containerFile = new File(
epubFolder.getAbsolutePath() + File.separator + "META-INF" + File.separator + "container.xml");
assertEquals(true, containerFile.exists());
assertEquals(false, containerFile.isDirectory());
File oebpsFolder = new File(epubFolder.getAbsolutePath() + File.separator + "OEBPS");
assertEquals(true, oebpsFolder.exists());
assertEquals(true, oebpsFolder.isDirectory());
}
private class EPUB_OCF_Test extends EPUB {
public void testReadOCF(File workingFolder) throws IOException {
readOCF(workingFolder);
}
}
/**
* See if the OCF file generated by this tooling can be read. As of bug 378800 elements are no longer prefixed with
* "ocf", however both are allowed and tested for.
*
* @throws Exception
*/
@Test
public final void testReadOCF_Dogfood() throws Exception {
EPUB_OCF_Test epub = new EPUB_OCF_Test();
File workingFolder = new File("testdata/OCF-Tests/Dogfood");
epub.testReadOCF(workingFolder);
workingFolder = new File("testdata/OCF-Tests/Bug_378800");
epub.testReadOCF(workingFolder);
}
/**
* This case was discovered when testing an EPUB file generated by DocBook Reading the OCF fails with a
* java.net.SocketException: Unexpected end of file from server. On closer inspection we can see that the file is
* declared as XHTML (which it of course is not). This is probably due to an issue in DocBook XSL 1.76.1
*
* @see http://sourceforge.net/tracker/index.php?func=detail&aid=3353537 &group_id=21935&atid=373747.
* @throws Exception
*/
@Test
public final void testReadOCF_SocketException() throws Exception {
File workingFolder = new File("testdata/OCF-Tests/SocketException");
EPUB_OCF_Test epub = new EPUB_OCF_Test();
epub.testReadOCF(workingFolder);
}
/**
* Test method for <a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=377705">bug 377705</a>: [epub] Fail
* gracefully when opening an unsupported file
* <p>
* When attempting to open a file that is not an EPUB the tooling shall reply by throwing an
* {@link IllegalArgumentException}.
* </p>
*
* @throws Exception
*/
@Test
public final void test_Bug377705() throws Exception {
EPUB epub = new EPUB();
File drawing = new File("testdata/drawing.svg");
File epub_2 = new File("testdata/epub/basic_2.epub");
assertEquals(false, epub.isEPUB(drawing));
assertEquals(true, epub.isEPUB(epub_2));
try {
epub.unpack(drawing);
fail();
} catch (IllegalArgumentException e) {
}
try {
epub.unpack(epub_2);
} catch (Exception e) {
fail();
}
}
/**
* Test method for <a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=378800">bug 378800</a>: [epub] Remove
* "ocf" prefix from elements in container.xml
*
* @throws Exception
*/
@Test
public final void test_Bug378800() throws Exception {
EPUB epub = new EPUB();
Publication oebps = new OPSPublication();
oebps.addItem(new File("testdata/plain-page.xhtml"));
epub.add(oebps);
epub.pack(epubFile, epubFolder);
File metaFolder = new File(epubFolder.getAbsolutePath() + File.separator + "META-INF"); //$NON-NLS-1$
File containerFile = new File(metaFolder.getAbsolutePath() + File.separator + "container.xml"); //$NON-NLS-1$
BufferedReader br = new BufferedReader(new FileReader(containerFile));
String in = null;
boolean ok = false;
while ((in = br.readLine()) != null) {
// as opposed to "<ocf:container "
if (in.startsWith("<container ")) {
ok = true;
}
}
br.close();
assertEquals(true, ok);
}
}