package org.basex.build; import static org.junit.Assert.*; import org.basex.*; import org.basex.core.*; import org.basex.core.cmd.*; import org.basex.io.*; import org.basex.util.*; import org.junit.*; import org.junit.Test; /** * Tests adding files/folders/zip files/urls to collections. * * @author BaseX Team 2005-17, BSD License * @author Michael Seiferle */ public final class AddDeleteTest extends SandboxTest { /** Test file. */ private static final String DIR = "src/test/resources/"; /** Test file. */ private static final String FILE = DIR + "input.xml"; /** Test file. */ private static final String CORRUPT = DIR + "corrupt.xml"; /** Test folder. */ private static final String FLDR = DIR + "dir"; /** Test ZIP file. */ private static final String ZIPFILE = DIR + "xml.zip"; /** Test GZIP file. */ private static final String GZIPFILE = DIR + "xml.gz"; /** Test XML fragment. */ private static final String XMLFRAG = "<xml a='blu'><foo /></xml>"; /** Temporary XML file. */ private static final String TEMP = Prop.TMP + NAME + IO.XMLSUFFIX; /** Number of XML files for folder. */ private static final int NFLDR; static { int fc = 0; for(final IOFile c : new IOFile(FLDR).children()) { if(c.name().endsWith(IO.XMLSUFFIX)) ++fc; } NFLDR = fc; } /** * Creates a database. */ @Before public void setUp() { execute(new CreateDB(NAME)); } /** * Drops the database. */ @After public void tearDown() { execute(new DropDB(NAME)); } /** * <p>Adds an XML fragment to the database.</p><ol> * <li> with name and w/o target</li> * <li> with name and target set</li> * <li> w/o name and target set</li></ol> */ @Test public void addXMLString() { execute(new Add("index.xml", XMLFRAG)); assertEquals(1, docs()); execute(new Add("a/b/c/index2.xml", XMLFRAG)); assertEquals(2, docs()); execute(new Add("a/d/c", XMLFRAG)); assertEquals(3, docs()); } /** * Adds a single file to the database. */ @Test public void addFile() { execute(new Add(null, FILE)); assertEquals(1, docs()); } /** * Adds a zip file. */ @Test public void addZip() { execute(new Add("target", ZIPFILE)); assertEquals(4, docs()); // do not add archives try { set(MainOptions.ADDARCHIVES, false); execute(new Add("", ZIPFILE)); assertEquals(4, docs()); } finally { set(MainOptions.ADDARCHIVES, true); } // prefix database path with name of archive try { set(MainOptions.ARCHIVENAME, true); execute(new Add("", ZIPFILE)); assertEquals(4, context.data().resources.docs("xml.zip/").size()); execute(new Add("", GZIPFILE)); assertEquals(1, context.data().resources.docs("xml.gz/").size()); } finally { set(MainOptions.ARCHIVENAME, false); } } /** * Adds/deletes a GZIP file. */ @Test public void addGzip() { execute(new Add("", GZIPFILE)); execute(new Add("bar", GZIPFILE)); execute(new Delete("bar")); assertEquals(1, docs()); } /** * Adds a folder. The contained a zip file is added as well. */ @Test public void addFolder() { execute(new Add("", FLDR)); assertEquals(NFLDR, docs()); } /** * Adds/deletes with target. */ @Test public void deletePath() { execute(new Add("foo/pub", FLDR)); assertEquals(NFLDR, docs()); execute(new Delete("foo")); assertEquals(0, docs()); execute(new Add("/foo///bar////", FILE)); execute(new Add("foobar", FLDR)); execute(new Delete("foo")); assertEquals(NFLDR, docs()); } /** * Adds/deletes a file/folder. */ @Test public void addFoldersDeleteFiles() { execute(new Add("folder", FLDR)); execute(new Add("", FILE)); execute(new Delete("input.xml")); execute(new Delete("folder/input.xml")); assertEquals(NFLDR - 1, docs()); } /** * Adds/deletes with target. */ @Test public void createDeleteAdd() { execute(new CreateDB(NAME, "<a/>")); execute(new Delete("/")); assertEquals(0, docs()); final StringBuilder sb = new StringBuilder(); for(int i = 0; i < 256; i++) sb.append("<a").append(i).append("/>"); execute(new Add("x", "<x>" + sb + "</x>")); assertEquals(1, docs()); assertEquals("1", query("count(//x)")); assertEquals("0", query("count(//a)")); } /** * Adds a non-existent file. * @throws BaseXException database exception */ @Test(expected = BaseXException.class) public void addFileFail() throws BaseXException { new Add("", FILE + "/doesnotexist").execute(context); } /** * Adds a broken input file to the database and checks if the file can be * deleted afterwards. */ @Test public void addCorrupt() { final IOFile io = new IOFile(TEMP); write(io, "<x"); try { new Add("", io.path()).execute(context); fail("Broken file was added to the database."); } catch(final BaseXException ignored) { } assertTrue(io.delete()); } /** * Creates a database from a broken input. * @throws BaseXException database exception */ @Test(expected = BaseXException.class) public void createCorrupt() throws BaseXException { new CreateDB(NAME, "<x").execute(context); } /** * Creates a database from a broken input file. * @throws BaseXException database exception */ @Test(expected = BaseXException.class) public void createCorruptFromFile() throws BaseXException { final IOFile io = new IOFile(TEMP); write(io, "<x"); new CreateDB(NAME, io.path()).execute(context); } /** * Skips a corrupt file. */ @Test public void skipCorrupt() { final IOFile io = new IOFile(TEMP); write(io, "<x"); try { set(MainOptions.SKIPCORRUPT, true); assertEquals(0, docs()); execute(new Add("x", "<x")); execute(new Add("x", CORRUPT)); assertEquals(0, docs()); } finally { set(MainOptions.SKIPCORRUPT, false); } try { new Add("", "<x").execute(context); fail("Broken file was added to the database."); } catch(final BaseXException ignored) { } } /** * Returns the number of documents in the current database. * @return number of documents */ private static int docs() { return context.data().resources.docs("").size(); } }