/*******************************************************************************
* Copyright (c) MOBAC developers
*
* 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/>.
******************************************************************************/
package unittests;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.security.SecureRandom;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.swing.UIManager;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;
import junit.framework.TestCase;
import junit.framework.TestResult;
import mobac.exceptions.AtlasTestException;
import mobac.program.AtlasThread;
import mobac.program.Logging;
import mobac.program.ProgramInfo;
import mobac.program.atlascreators.AtlasCreator;
import mobac.program.interfaces.AtlasInterface;
import mobac.program.model.Atlas;
import mobac.program.model.Profile;
import mobac.program.model.TileImageType;
import mobac.program.tilestore.TileStore;
import mobac.tools.testtileserver.TestTileServer;
import mobac.tools.testtileserver.servlets.JpgTileGeneratorServlet;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import unittests.helper.TestMapSourcesManager;
/**
* Base {@link TestCase} used for testing a specific {@link AtlasCreator} implementation and/or downloading of a Atlas.
*/
public abstract class AbstractAtlasCreatorTestCase extends TestCase {
protected final Logger log;
protected final File testAtlasDir;
protected final SecureRandom rnd;
protected static final TestTileServer TEST_TILE_SERVER;
protected static final TestMapSourcesManager TEST_TILE_SERVER_MANAGER;
static {
Logging.configureConsoleLogging(Level.TRACE,Logging.ADVANCED_LAYOUT);
ProgramInfo.initialize();
//Logger.getLogger("mobac").setLevel(Level.INFO);
TEST_TILE_SERVER = new TestTileServer(18888);
// TEST_TILE_SERVER.setTileServlet(new PngFileTileServlet(0));
TEST_TILE_SERVER.setTileServlet(new JpgTileGeneratorServlet(90));
TEST_TILE_SERVER.start();
TEST_TILE_SERVER_MANAGER = new TestMapSourcesManager(TEST_TILE_SERVER.getPort(), TileImageType.JPG);
}
public AbstractAtlasCreatorTestCase() {
super();
log = Logger.getLogger(this.getClass());
log.setLevel(Level.DEBUG);
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (Exception e) {
}
TileStore.initialize();
testAtlasDir = new File("target/test-atlases");
rnd = new SecureRandom();
}
@Override
protected void runTest() throws Throwable {
log.info("running test \"" + getName() + "\"");
super.runTest();
}
protected void createAtlas(String profileName, Class<? extends AtlasCreator> atlasCreatorClass)
throws InstantiationException, IllegalAccessException, JAXBException, AtlasTestException,
InterruptedException, IOException {
AtlasCreator atlasCreator = atlasCreatorClass.newInstance();
createAtlas(profileName, atlasCreator);
}
protected void createAtlas(String profileName, AtlasCreator atlasCreator) throws JAXBException, AtlasTestException,
InterruptedException, IOException {
String profileFile = "profiles/" + Profile.getProfileFileName(profileName);
InputStream in = ClassLoader.getSystemResourceAsStream(profileFile);
assertNotNull(in);
AtlasInterface atlas = loadAtlas(in);
createAtlas(atlas, atlasCreator);
}
protected AtlasInterface loadAtlas(String profileName) throws JAXBException {
String profileFile = "profiles/" + Profile.getProfileFileName(profileName);
InputStream in = ClassLoader.getSystemResourceAsStream(profileFile);
assertNotNull(in);
return loadAtlas(in);
}
protected AtlasInterface loadAtlas(InputStream in) throws JAXBException {
JAXBContext context = JAXBContext.newInstance(Atlas.class);
Unmarshaller um = context.createUnmarshaller();
return (AtlasInterface) um.unmarshal(in);
}
/**
*
* @param atlas
* @param atlasCreator
* @return directory in which the atlas has been created
* @throws AtlasTestException
* @throws InterruptedException
* @throws IOException
*/
protected File createAtlas(AtlasInterface atlas, AtlasCreator atlasCreator) throws AtlasTestException,
InterruptedException, IOException {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd_HHmmss_SSSS");
File customAtlasDir = new File(testAtlasDir, atlasCreator.getClass().getSimpleName() + "_" + atlas.getName()
+ "_" + sdf.format(new Date()));
createAtlas(atlas, atlasCreator, customAtlasDir);
return customAtlasDir;
}
protected void createAtlas(AtlasInterface atlas, AtlasCreator atlasCreator, File customAtlasDir)
throws AtlasTestException, InterruptedException, IOException {
log.debug("Creating atlas " + atlas.getName() + " using " + atlasCreator.getClass().getSimpleName() + " to \""
+ customAtlasDir + "\"");
AtlasThread atlasThread = new AtlasThread(atlas, atlasCreator);
atlasThread.setCustomAtlasDir(customAtlasDir);
atlasThread.start();
atlasThread.join();
}
@Override
public TestResult run() {
TestResult result = super.run();
return result;
}
}