/******************************************************************************* * 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 mapsources; import java.awt.Point; import java.net.HttpURLConnection; import junit.framework.TestCase; import mobac.mapsources.AbstractHttpMapSource; import mobac.program.download.TileDownLoader; import mobac.program.interfaces.HttpMapSource; import mobac.program.interfaces.MapSpace; import mobac.program.interfaces.MapSource.LoadMethod; import mobac.program.model.EastNorthCoordinate; import mobac.program.model.Settings; import mobac.tools.Cities; import mobac.utilities.Utilities; public class MapSourceTestCase extends TestCase { private final HttpMapSource mapSource; private final EastNorthCoordinate testCoordinate; public MapSourceTestCase(Class<? extends HttpMapSource> mapSourceClass) throws InstantiationException, IllegalAccessException { this(mapSourceClass.newInstance()); } public MapSourceTestCase(HttpMapSource mapSource) { this(mapSource, Cities.getTestCoordinate(mapSource, Cities.BERLIN)); } public MapSourceTestCase(HttpMapSource mapSource, EastNorthCoordinate testCoordinate) { super(mapSource.getName()); this.mapSource = mapSource; this.testCoordinate = testCoordinate; } public void runMapSourceTest() throws Exception { runTest(); } @Override protected void runTest() throws Exception { int zoom = mapSource.getMaxZoom(); MapSpace mapSpace = mapSource.getMapSpace(); //int tilex = mapSpace.cLonToX(testCoordinate.lon, zoom) / mapSpace.getTileSize(); //int tiley = mapSpace.cLatToY(testCoordinate.lat, zoom) / mapSpace.getTileSize(); Point p = mapSpace.cLonLatToXY(testCoordinate.lon, testCoordinate.lat, zoom); int tilex = p.x / mapSpace.getTileSize(); int tiley = p.y / mapSpace.getTileSize(); if (mapSource instanceof AbstractHttpMapSource) try { mapSource.getTileData(-1, 0, 0, LoadMethod.SOURCE); } catch (Exception e) { } HttpURLConnection c = mapSource.getTileUrlConnection(zoom, tilex, tiley); c.setReadTimeout(10000); c.addRequestProperty("User-agent", Settings.getInstance().getUserAgent()); c.setRequestProperty("Accept", TileDownLoader.ACCEPT); c.connect(); try { // if (c.getResponseCode() == 302) { // log.debug(c.getResponseMessage()); // } if (c.getResponseCode() != 200) { throw new MapSourceTestFailedException(mapSource, c); } byte[] imageData = Utilities.getInputBytes(c.getInputStream()); if (imageData.length == 0) throw new MapSourceTestFailedException(mapSource, "Image data empty", c); if (Utilities.getImageType(imageData) == null) { throw new MapSourceTestFailedException(mapSource, "Image data of unknown format", c); } switch (mapSource.getTileUpdate()) { case ETag: case IfNoneMatch: if (c.getHeaderField("ETag") == null) { throw new MapSourceTestFailedException(mapSource, "No ETag present but map sources uses " + mapSource.getTileUpdate() + "\n", c); } break; case LastModified: if (c.getHeaderField("Last-Modified") == null) throw new MapSourceTestFailedException(mapSource, "No Last-Modified entry present but map sources uses " + mapSource.getTileUpdate() + "\n", c); break; } } finally { c.disconnect(); } } }