package fr.gael.dhus.datastore.scanner; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.List; import org.apache.commons.io.FileUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.mockftpserver.fake.FakeFtpServer; import org.mockftpserver.fake.UserAccount; import org.mockftpserver.fake.filesystem.FileEntry; import org.mockftpserver.fake.filesystem.FileSystem; import org.mockftpserver.fake.filesystem.UnixFakeFileSystem; import org.testng.Assert; import org.testng.annotations.AfterClass; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; import com.google.common.collect.ImmutableList; import fr.gael.dhus.datastore.scanner.Scanner; import fr.gael.dhus.datastore.scanner.ScannerFactory; import fr.gael.drbx.cortex.DrbCortexItemClass; public class ScannerFactoryTest { private static Log logger = LogFactory.getLog (ScannerFactoryTest.class); String [] classes_strings=new String [] { "http://www.gael.fr/test#product1", "http://www.gael.fr/test#product2", }; List<DrbCortexItemClass>classes; FakeFtpServer fakeFtpServer; File tmpDir; @BeforeClass protected void startftp() throws Exception { fakeFtpServer = new FakeFtpServer(); fakeFtpServer.setServerControlPort(8089); // use any free port FileSystem fileSystem = new UnixFakeFileSystem(); fileSystem.add(new FileEntry("/data/s1-level-1-calibration.xsd", "<schema/>")); fileSystem.add(new FileEntry("/data/s1-object-types.xsd", "<schema/>")); fileSystem.add(new FileEntry("/data/GOM_EXT_2PNPDE20070312_232536_000000542056_00202_26308_1271.N1", "GOMOS DATA!")); fileSystem.add(new FileEntry ("/data/S1A_IW_SLC__1SDV_20141003T054235_20141003T054304_002661_002F66_D5C8.SAFE/manifest.safe", "<XFDU/>")); fileSystem.add(new FileEntry ("/data/S1A_EW_GRDH_1SSH_20120101T022934_20120101T022945_001770_000001_AF02.SAFE/manifest.safe", "<XFDU/>")); fileSystem.add(new FileEntry("/data/manifest.safe", "<XFDU/>")); fakeFtpServer.setFileSystem(fileSystem); UserAccount userAccount = new UserAccount("user", "password", "/"); fakeFtpServer.addUserAccount(userAccount); fakeFtpServer.start(); } @BeforeClass public void before () throws IOException { classes = new ArrayList<DrbCortexItemClass>(); for (String cl: classes_strings) { try { classes.add(DrbCortexItemClass.getCortexItemClassByName(cl)); } catch (NullPointerException e) { logger.error ("ScannerFactoryTest Initialization error: " + "unable to find class \"" + cl + "\" in default model."); } } tmpDir = File.createTempFile("scanner", ".test"); String path = tmpDir.getPath(); tmpDir.delete(); tmpDir = new File(path); tmpDir.mkdirs(); // empty XML files makes drb producing many error logs on standard output. File file = new File(tmpDir, "s1-level-1-calibration.test"); FileUtils.touch(file); file = new File(tmpDir, "s1-object-types.titi"); FileUtils.touch(file); file = new File(tmpDir, "GOM_EXT_2PNPDE20070312_232536_000000542056_00202_26308_1271.N1"); FileUtils.touch(file); file = new File(tmpDir, "S1A_IW_SLC__1SDV_20141003T054235_20141003T054304_002661_002F66_D5C8.SAFE"); file.mkdir(); file = new File(tmpDir, "S1A_EW_GRDH_1SSH_20120101T022934_20120101T022945_001770_000001_AF02.SAFE"); file.mkdir(); file = new File(file, "manifest.safe"); FileUtils.touch(file); file = new File(tmpDir, "manifest.safe"); FileUtils.touch(file); } @Test public void runFileScanner() throws InterruptedException { ScannerFactory sf = new ScannerFactory (); Scanner scanner = sf.getScanner (tmpDir.getPath()); scanner.setSupportedClasses(classes); scanner.getScanList().simulate(false); scanner.scan(); Assert.assertTrue (scanner.getScanList().size()>0, "No item found."); // Expected result is 2: only S1[AB]_ pattern signature is supported. Assert.assertEquals (scanner.getScanList().size(), 2, "Wrong number of items found."); } @Test (groups="slow") public void runFtpScanner() throws InterruptedException { ScannerFactory sf = new ScannerFactory (); Scanner scanner = sf.getScanner ("ftp://localhost:8089/data", "user", "password", null); // scanner.setSupportedClasses(classes); // Scan all the items... scanner.setSupportedClasses(ImmutableList.of (DrbCortexItemClass .getCortexItemClassByName ("http://www.gael.fr/drb#item"))); scanner.getScanList().simulate(false); scanner.scan(); Assert.assertTrue (scanner.getScanList().size()>0, "No item found."); } @Test public void getScannerSupport () { ScannerFactory sf = new ScannerFactory (); String[]supported_classes = sf.getDefaultCortexSupport (); // http://www.gael.fr/test#product1 and http://www.gael.fr/test#product2 // plus the ones defined by DHuS: http://www.gael.fr/drb#tgz, // http://www.gael.fr/drb#gzip, http://www.gael.fr/drb#zip, // http://www.gael.fr/drb#tar. // Scanner support is automatically computed according to the // upcoming ontologies. by default scanner at least contains // http://www.gael.fr/drb#zip, so support list shall never be empty. Assert.assertTrue (supported_classes.length>1, "Missing supports"); } @AfterClass public void after () { FileUtils.deleteQuietly(tmpDir); } @AfterClass public void stopftp() { fakeFtpServer.stop (); } }