package net.krazyweb.starmodmanager.test; import static org.hamcrest.CoreMatchers.hasItem; import static org.junit.Assert.assertThat; import java.io.BufferedReader; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.RandomAccessFile; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.ArrayList; import java.util.List; import net.krazyweb.helpers.FileHelper; import net.krazyweb.starmodmanager.data.LocalizerFactory; import net.krazyweb.starmodmanager.data.Mod; import net.sf.sevenzipjbinding.ISevenZipInArchive; import net.sf.sevenzipjbinding.SevenZip; import net.sf.sevenzipjbinding.SevenZipException; import net.sf.sevenzipjbinding.impl.RandomAccessFileInStream; import net.sf.sevenzipjbinding.simple.ISimpleInArchive; import net.sf.sevenzipjbinding.simple.ISimpleInArchiveItem; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.junit.After; import org.junit.Before; import org.junit.Test; public class TestMod { private static final Logger log = LogManager.getLogger(TestMod.class); private class ModArchiveTest { private String archiveFile; private List<String> filesInArchive = new ArrayList<>(); private List<String> filesInManifest = new ArrayList<>(); } private static final Path TEST_MOD_FOLDER = Paths.get("testmods"); private String[] modsToTest = new String[] { "testmod1.", "testmod2.", //"testmod3.", //This is JTE_Farming, which is so poorly packed at the moment, I don't know how to support it. "testmod4.", "testmod5.", "testmod6.", "testmod7.", "testmod8." }; @Before public void createModArchives() throws IOException { System.setProperty("consolelevel", "DEBUG"); System.setProperty("filelevel", "OFF"); if (Files.notExists(TEST_MOD_FOLDER)) { Files.createDirectory(TEST_MOD_FOLDER); } if (Files.notExists(new TestSettingsFactory().getInstance().getPropertyPath("modsdir"))) { Files.createDirectory(new TestSettingsFactory().getInstance().getPropertyPath("modsdir")); } for (String mod : modsToTest) { FileOutputStream output = new FileOutputStream(TEST_MOD_FOLDER + "/" + mod + "zip"); InputStream input = TestMod.class.getClassLoader().getResourceAsStream(mod + "zip"); byte[] data = new byte[1024]; int dataRead = 0; while ((dataRead = input.read(data)) != -1) { output.write(data, 0, dataRead); } output.close(); } } @Test public void testArchiveParsing() throws IOException { for (String modFile : modsToTest) { Mod.load(TEST_MOD_FOLDER.resolve(modFile + "zip"), 0, new TestSettingsFactory(), new TestDatabaseFactory(), new LocalizerFactory()); } List<ModArchiveTest> mods = new ArrayList<>(); for (String modFile : modsToTest) { BufferedReader reader = new BufferedReader(new InputStreamReader(TestMod.class.getClassLoader().getResourceAsStream(modFile + "manifest"))); String line; ModArchiveTest currentMod = null; while ((line = reader.readLine()) != null) { if (line.endsWith(".zip")) { currentMod = new ModArchiveTest(); mods.add(currentMod); currentMod.archiveFile = line; RandomAccessFile randomAccessFile = null; ISevenZipInArchive inArchive = null; try { randomAccessFile = new RandomAccessFile(new TestSettingsFactory().getInstance().getPropertyPath("modsdir").resolve(Paths.get(currentMod.archiveFile)).toString(), "r"); inArchive = SevenZip.openInArchive(null, // autodetect archive type new RandomAccessFileInStream(randomAccessFile)); // Getting simple interface of the archive inArchive ISimpleInArchive simpleInArchive = inArchive.getSimpleInterface(); for (ISimpleInArchiveItem item : simpleInArchive.getArchiveItems()) { if (!item.isFolder()) { currentMod.filesInArchive.add(item.getPath().replaceAll("\\\\", "/")); } } } catch (Exception e) { System.err.println("Error occurs: " + e); System.exit(1); } finally { if (inArchive != null) { try { inArchive.close(); } catch (SevenZipException e) { System.err.println("Error closing archive: " + e); } } if (randomAccessFile != null) { try { randomAccessFile.close(); } catch (IOException e) { System.err.println("Error closing file: " + e); } } } } else { currentMod.filesInManifest.add(line); } } } for (ModArchiveTest mod : mods) { log.debug("{} - {} -- {}", mod.archiveFile, mod.filesInArchive.size(), mod.filesInManifest.size()); /*List<String> output = new ArrayList<>(mod.filesInManifest); output.removeAll(mod.filesInArchive); log.debug("Difference: {}", output);*/ /*for (String file : mod.filesInArchive) { log.debug("Archive: {}", file); } for (String file : mod.filesInManifest) { log.debug("Manifest: {}", file); }*/ assert(mod.filesInArchive.size() == mod.filesInManifest.size()); for (String file : mod.filesInManifest) { assertThat(mod.filesInArchive, hasItem(file)); } } } @After public void cleanupResources() throws IOException { FileHelper.deleteFile(TEST_MOD_FOLDER); FileHelper.deleteFile(new TestSettingsFactory().getInstance().getPropertyPath("modsdir")); } }