/* * #%L * OME Bio-Formats manual and automated test suite. * %% * Copyright (C) 2006 - 2015 Open Microscopy Environment: * - Board of Regents of the University of Wisconsin-Madison * - Glencoe Software, Inc. * - University of Dundee * %% * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as * published by the Free Software Foundation, either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * <http://www.gnu.org/licenses/gpl-2.0.html>. * #L% */ package loci.tests.testng; import java.io.File; import java.util.ArrayList; import java.util.List; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.testng.annotations.Factory; /** * Factory for scanning a directory structure and generating instances of * {@link FormatWriterTest} based on the image files found. */ public class FormatWriterTestFactory { // -- Constants -- private static final Logger LOGGER = LoggerFactory.getLogger(FormatWriterTestFactory.class); // -- TestNG factory methods -- @Factory public Object[] createInstances() { List files = new ArrayList(); // parse explicit filename, if any final String nameProp = "testng.filename"; String filename = System.getProperty(nameProp); if (filename != null && filename.equals("${" + nameProp + "}")) { filename = null; } if (filename != null && !new File(filename).exists()) { LOGGER.error("Invalid filename: {}", filename); return new Object[0]; } String baseDir = null; if (filename == null) { // parse base directory final String baseDirProp = "testng.directory"; baseDir = System.getProperty(baseDirProp); if (!new File(baseDir).isDirectory()) { if (baseDir == null || baseDir.equals("${" + baseDirProp + "}")) { LOGGER.error("No base directory specified."); } else LOGGER.error("Invalid base directory: {}", baseDir); LOGGER.error("Please specify a directory containing files to test:"); LOGGER.error(" ant -D{}=\"/path/to/data\" test-all", baseDirProp); return new Object[0]; } FormatWriterTest.configTree = new ConfigurationTree(baseDir); LOGGER.info("testng.directory = {}", baseDir); } // parse multiplier final String multProp = "testng.multiplier"; String mult = System.getProperty(multProp); float multiplier = 1; if (mult != null && !mult.equals("${" + multProp + "}")) { try { multiplier = Float.parseFloat(mult); } catch (NumberFormatException exc) { LOGGER.warn("Invalid multiplier: {}", mult); } } LOGGER.info("testng.multiplier = {}", multiplier); final String toplevelConfigProp = "testng.toplevel-config"; String toplevelConfig = System.getProperty(toplevelConfigProp); // detect maximum heap size long maxMemory = Runtime.getRuntime().maxMemory() >> 20; LOGGER.info("Maximum heap size = {} MB", maxMemory); // display local information LOGGER.info("user.language = {}", System.getProperty("user.language")); LOGGER.info("user.country = {}", System.getProperty("user.country")); if (filename == null) { // scan for files System.out.println("Scanning for files..."); long start = System.currentTimeMillis(); TestTools.getFiles(baseDir, files, FormatWriterTest.configTree, toplevelConfig); long end = System.currentTimeMillis(); double time = (end - start) / 1000.0; LOGGER.info(TestTools.DIVIDER); LOGGER.info("Total files: {}", files.size()); long avg = end - start; if (files.size() > 0) avg /= files.size(); LOGGER.info("Scan time: {} s ({} ms/file)", time, avg); LOGGER.info(TestTools.DIVIDER); } else { files.add(filename); } // create test class instances System.out.println("Building list of tests..."); Object[] tests = new Object[files.size()]; for (int i=0; i<tests.length; i++) { String id = (String) files.get(i); tests[i] = new FormatWriterTest(id); } if (tests.length == 1) System.out.println("Ready to test " + files.get(0)); else System.out.println("Ready to test " + tests.length + " files"); return tests; } }