/*
* #%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;
}
}