// License: GPL. For details, see LICENSE file. package org.openstreetmap.josm; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import java.io.File; import java.io.IOException; import java.nio.file.Paths; import java.security.GeneralSecurityException; import java.text.MessageFormat; import java.util.Locale; import java.util.TimeZone; import org.openstreetmap.josm.data.projection.Projections; import org.openstreetmap.josm.gui.MainApplication; import org.openstreetmap.josm.gui.layer.LayerManagerTest.TestLayer; import org.openstreetmap.josm.gui.preferences.ToolbarPreferences; import org.openstreetmap.josm.gui.util.GuiHelper; import org.openstreetmap.josm.io.CertificateAmendment; import org.openstreetmap.josm.io.OsmApi; import org.openstreetmap.josm.tools.I18n; import org.openstreetmap.josm.tools.Logging; /** * Fixture to define a proper and safe environment before running tests. */ public class JOSMFixture { /** * Returns a new test fixture initialized to "unit" home. * @return A new test fixture for unit tests */ public static JOSMFixture createUnitTestFixture() { return new JOSMFixture("test/config/unit-josm.home"); } /** * Returns a new test fixture initialized to "functional" home. * @return A new test fixture for functional tests */ public static JOSMFixture createFunctionalTestFixture() { return new JOSMFixture("test/config/functional-josm.home"); } /** * Returns a new test fixture initialized to "performance" home. * @return A new test fixture for performance tests */ public static JOSMFixture createPerformanceTestFixture() { return new JOSMFixture("test/config/performance-josm.home"); } private final String josmHome; /** * Constructs a new text fixture initialized to a given josm home. * @param josmHome The user home where preferences are to be read/written */ public JOSMFixture(String josmHome) { this.josmHome = josmHome; } /** * Initializes the test fixture, without GUI. */ public void init() { init(false); } /** * Initializes the test fixture, with or without GUI. * @param createGui if {@code true} creates main GUI components */ public void init(boolean createGui) { // check josm.home // if (josmHome == null) { fail(MessageFormat.format("property ''{0}'' not set in test environment", "josm.home")); } else { File f = new File(josmHome); if (!f.exists() || !f.canRead()) { fail(MessageFormat.format( // CHECKSTYLE.OFF: LineLength "property ''{0}'' points to ''{1}'' which is either not existing ({2}) or not readable ({3}). Current directory is ''{4}''.", // CHECKSTYLE.ON: LineLength "josm.home", josmHome, f.exists(), f.canRead(), Paths.get("").toAbsolutePath())); } } System.setProperty("josm.home", josmHome); TimeZone.setDefault(TimeZone.getTimeZone("UTC")); Main.pref.resetToInitialState(); Main.pref.enableSaveOnPut(false); I18n.init(); // initialize the plaform hook, and Main.determinePlatformHook(); // call the really early hook before we anything else Main.platform.preStartupHook(); Logging.setLogLevel(Logging.LEVEL_INFO); Main.pref.init(false); String url = Main.pref.get("osm-server.url"); if (url == null || url.isEmpty() || isProductionApiUrl(url)) { Main.pref.put("osm-server.url", "http://api06.dev.openstreetmap.org/api"); } I18n.set(Main.pref.get("language", "en")); try { CertificateAmendment.addMissingCertificates(); } catch (IOException | GeneralSecurityException ex) { throw new RuntimeException(ex); } // init projection Main.setProjection(Projections.getProjectionByCode("EPSG:3857")); // Mercator // make sure we don't upload to or test against production url = OsmApi.getOsmApi().getBaseUrl().toLowerCase(Locale.ENGLISH).trim(); if (isProductionApiUrl(url)) { fail(MessageFormat.format("configured server url ''{0}'' seems to be a productive url, aborting.", url)); } if (createGui) { GuiHelper.runInEDTAndWaitWithException(new Runnable() { @Override public void run() { setupGUI(); } }); } } private static boolean isProductionApiUrl(String url) { return url.startsWith("http://www.openstreetmap.org") || url.startsWith("http://api.openstreetmap.org") || url.startsWith("https://www.openstreetmap.org") || url.startsWith("https://api.openstreetmap.org"); } private void setupGUI() { Main.getLayerManager().resetState(); assertTrue(Main.getLayerManager().getLayers().isEmpty()); assertNull(Main.getLayerManager().getEditLayer()); assertNull(Main.getLayerManager().getActiveLayer()); if (Main.toolbar == null) { Main.toolbar = new ToolbarPreferences(); } if (Main.main == null) { new MainApplication().initialize(); } else { Main.mainPanel.reAddListeners(); } // Add a test layer to the layer manager to get the MapFrame Main.getLayerManager().addLayer(new TestLayer()); } }