Ticket #16567: 16567.initial_extensions.patch

File 16567.initial_extensions.patch, 16.6 KB (added by taylor.smock, 5 years ago)

Initial extensions replacing JOSMTestRules#preferences and JOSMTestRules#assumeRevision (Override should probably be dropped from filenames)

  • test/unit/org/openstreetmap/josm/testutils/JOSMTestRules.java

     
    6060import org.openstreetmap.josm.io.OsmTransferCanceledException;
    6161import org.openstreetmap.josm.spi.preferences.Config;
    6262import org.openstreetmap.josm.spi.preferences.Setting;
     63import org.openstreetmap.josm.testutils.annotations.UseJosmHome;
     64import org.openstreetmap.josm.testutils.annotations.UsePreferences;
    6365import org.openstreetmap.josm.testutils.mockers.EDTAssertionMocker;
    6466import org.openstreetmap.josm.testutils.mockers.WindowlessMapViewStateMocker;
    6567import org.openstreetmap.josm.testutils.mockers.WindowlessNavigatableComponentMocker;
     
    134136    /**
    135137     * Enable the use of default preferences.
    136138     * @return this instance, for easy chaining
     139     * @deprecated Use {@link UsePreferences} instead.
    137140     */
     141    @Deprecated
    138142    public JOSMTestRules preferences() {
    139143        josmHome();
    140144        usePreferences = true;
     
    144148    /**
    145149     * Set JOSM home to a valid, empty directory.
    146150     * @return this instance, for easy chaining
     151     * @deprecated Use {@link UseJosmHome} instead.
    147152     */
     153    @Deprecated
    148154    private JOSMTestRules josmHome() {
    149155        josmHome = new TemporaryFolder();
    150156        return this;
     
    172178     * Mock this test's assumed JOSM version (as reported by {@link Version}).
    173179     * @param revisionProperties mock contents of JOSM's {@code REVISION} properties file
    174180     * @return this instance, for easy chaining
     181     * @deprecated Use {@link OverrideAssumeRevision} instead.
    175182     */
     183    @Deprecated
    176184    public JOSMTestRules assumeRevision(final String revisionProperties) {
    177185        this.assumeRevisionString = revisionProperties;
    178186        return this;
     
    397405        return this;
    398406    }
    399407
    400     private static class MockVersion extends Version {
    401         MockVersion(final String propertiesString) {
     408    /*
     409     * Mock the JOSM version. This should only be used in JOSM Core test extensions.
     410     */
     411    public static class MockVersion extends Version {
     412        public MockVersion(final String propertiesString) {
    402413            super.initFromRevisionInfo(
    403414                new ByteArrayInputStream(propertiesString.getBytes(StandardCharsets.UTF_8))
    404415            );
     
    409420    public Statement apply(Statement base, Description description) {
    410421        // First process any Override* annotations for per-test overrides.
    411422        // The following only work because "option" methods modify JOSMTestRules in-place
    412         final OverrideAssumeRevision overrideAssumeRevision = description.getAnnotation(OverrideAssumeRevision.class);
     423        OverrideAssumeRevision overrideAssumeRevision = description.getAnnotation(OverrideAssumeRevision.class);
    413424        if (overrideAssumeRevision != null) {
    414425            this.assumeRevision(overrideAssumeRevision.value());
    415426        }
     
    790801    /**
    791802     * Override this test's assumed JOSM version (as reported by {@link Version}).
    792803     * @see JOSMTestRules#assumeRevision(String)
     804     * @deprecated Use {@link org.openstreetmap.josm.testutils.annotations.OverrideAssumeRevision}
     805     *             when using JUnit 5 Extensions.
    793806     */
    794807    @Documented
    795808    @Retention(RetentionPolicy.RUNTIME)
    796809    @Target(ElementType.METHOD)
    797     public @interface OverrideAssumeRevision {
     810    @Deprecated
     811    public @interface OverrideAssumeRevision  {
    798812        /**
    799813         * Returns overridden assumed JOSM version.
    800814         * @return overridden assumed JOSM version
  • test/unit/org/openstreetmap/josm/testutils/annotations/BasicPreferences.java

     
     1// License: GPL. For details, see LICENSE file.
     2package org.openstreetmap.josm.testutils.annotations;
     3
     4import java.lang.annotation.Documented;
     5import java.lang.annotation.ElementType;
     6import java.lang.annotation.Retention;
     7import java.lang.annotation.RetentionPolicy;
     8import java.lang.annotation.Target;
     9
     10import org.junit.jupiter.api.extension.ExtendWith;
     11import org.openstreetmap.josm.testutils.JOSMTestRules;
     12import org.openstreetmap.josm.testutils.extensions.BasicPreferencesExtension;
     13
     14/**
     15 * Allow tests to use JOSM preferences (see {@link JOSMTestRules#preferences()})
     16 * @author Taylor Smock
     17 */
     18@Documented
     19@Retention(RetentionPolicy.RUNTIME)
     20@Target({ElementType.METHOD, ElementType.TYPE})
     21@ExtendWith(BasicPreferencesExtension.class)
     22public @interface BasicPreferences {
     23}
  • test/unit/org/openstreetmap/josm/testutils/annotations/OverrideAssumeRevision.java

     
     1// License: GPL. For details, see LICENSE file.
     2package org.openstreetmap.josm.testutils.annotations;
     3
     4import java.lang.annotation.Documented;
     5import  java.lang.annotation.ElementType;
     6import java.lang.annotation.Retention;
     7import  java.lang.annotation.RetentionPolicy;
     8import java.lang.annotation.Target;
     9
     10import org.openstreetmap.josm.data.Version;
     11import org.openstreetmap.josm.testutils.JOSMTestRules;
     12
     13
     14/**
     15 * Override this test's assumed JOSM version (as reported by {@link Version}).
     16 * @see JOSMTestRules#assumeRevision(String)
     17 */
     18@Documented
     19@Retention(RetentionPolicy.RUNTIME)
     20@Target({ElementType.METHOD, ElementType.TYPE})
     21public @interface OverrideAssumeRevision {
     22    /**
     23     * Returns overridden assumed JOSM version.
     24     * @return overridden assumed JOSM version
     25     */
     26    String value();
     27}
  • test/unit/org/openstreetmap/josm/testutils/annotations/UseJosmHome.java

     
     1// License: GPL. For details, see LICENSE file.
     2package org.openstreetmap.josm.testutils.annotations;
     3
     4import java.lang.annotation.Documented;
     5import java.lang.annotation.ElementType;
     6import java.lang.annotation.Retention;
     7import java.lang.annotation.RetentionPolicy;
     8import java.lang.annotation.Target;
     9
     10import org.junit.jupiter.api.extension.ExtendWith;
     11import org.openstreetmap.josm.testutils.JOSMTestRules;
     12import org.openstreetmap.josm.testutils.extensions.UseJosmHomeExtension;
     13
     14/**
     15 * Use the JOSM home directory. See {@link JOSMTestRules}.
     16 * Typically only used by {@link UsePreferences}.
     17 *
     18 * @author Taylor Smock
     19 *
     20 */
     21@Documented
     22@Retention(RetentionPolicy.RUNTIME)
     23@Target({ElementType.METHOD, ElementType.TYPE})
     24@ExtendWith(UseJosmHomeExtension.class)
     25public @interface UseJosmHome {
     26}
  • test/unit/org/openstreetmap/josm/testutils/annotations/UsePreferences.java

     
     1// License: GPL. For details, see LICENSE file.
     2package org.openstreetmap.josm.testutils.annotations;
     3
     4import java.lang.annotation.Documented;
     5import java.lang.annotation.ElementType;
     6import java.lang.annotation.Retention;
     7import java.lang.annotation.RetentionPolicy;
     8import java.lang.annotation.Target;
     9
     10import org.junit.jupiter.api.extension.ExtendWith;
     11import org.openstreetmap.josm.testutils.JOSMTestRules;
     12import org.openstreetmap.josm.testutils.extensions.UsePreferencesExtension;
     13
     14/**
     15 * Allow tests to use JOSM preferences (see {@link JOSMTestRules#preferences()})
     16 * @see BasicPreferences (often enough for simple tests).
     17 *
     18 * @author Taylor Smock
     19 */
     20@Documented
     21@Retention(RetentionPolicy.RUNTIME)
     22@Target({ElementType.METHOD, ElementType.TYPE})
     23@UseJosmHome
     24@BasicPreferences
     25@ExtendWith(UsePreferencesExtension.class)
     26public @interface UsePreferences {
     27
     28}
  • test/unit/org/openstreetmap/josm/testutils/extensions/BasicPreferencesExtension.java

     
     1// License: GPL. For details, see LICENSE file.
     2package org.openstreetmap.josm.testutils.extensions;
     3
     4import org.junit.jupiter.api.extension.BeforeAllCallback;
     5import org.junit.jupiter.api.extension.ExtensionContext;
     6import org.junit.jupiter.api.extension.ExtensionContext.Namespace;
     7import org.openstreetmap.josm.data.Preferences;
     8import org.openstreetmap.josm.data.preferences.JosmBaseDirectories;
     9import org.openstreetmap.josm.data.preferences.JosmUrls;
     10import org.openstreetmap.josm.spi.preferences.Config;
     11import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
     12import org.openstreetmap.josm.testutils.annotations.UsePreferences;
     13
     14/**
     15 * Initialize basic preferences. This is often more than enough for basic tests. Use {@link BasicPreferences}.
     16 * @see UsePreferences if {@link BasicPreferences} does not work.
     17 * @author Taylor Smock
     18 *
     19 */
     20public class BasicPreferencesExtension implements BeforeAllCallback {
     21
     22    @Override
     23    public void beforeAll(ExtensionContext context) throws Exception {
     24        Preferences pref = Preferences.main();
     25        Config.setPreferencesInstance(pref);
     26        Config.setBaseDirectoriesProvider(JosmBaseDirectories.getInstance());
     27        Config.setUrlsProvider(JosmUrls.getInstance());
     28        context.getStore(Namespace.create(BasicPreferencesExtension.class)).put("preferences", pref);
     29    }
     30
     31}
  • test/unit/org/openstreetmap/josm/testutils/extensions/OverrideAssumeRevisionExtension.java

     
     1// License: GPL. For details, see LICENSE file.
     2package org.openstreetmap.josm.testutils.extensions;
     3
     4import java.util.Optional;
     5
     6import org.junit.jupiter.api.extension.AfterEachCallback;
     7import org.junit.jupiter.api.extension.BeforeEachCallback;
     8import org.junit.jupiter.api.extension.ExtensionContext;
     9import org.junit.jupiter.api.extension.ExtensionContext.Namespace;
     10import org.junit.jupiter.api.extension.ExtensionContext.Store;
     11import org.junit.platform.commons.support.AnnotationSupport;
     12import org.openstreetmap.josm.TestUtils;
     13import org.openstreetmap.josm.data.Version;
     14import org.openstreetmap.josm.testutils.JOSMTestRules;
     15import org.openstreetmap.josm.testutils.annotations.OverrideAssumeRevision;
     16
     17/**
     18 * Override the JOSM revision information. Use {@link OverrideAssumeRevision} instead of directly using this extension.
     19 * @author Taylor Smock
     20 *
     21 */
     22public class OverrideAssumeRevisionExtension implements BeforeEachCallback, AfterEachCallback {
     23
     24    @Override
     25    public void afterEach(ExtensionContext context) throws Exception {
     26        Store store = context.getStore(Namespace.create(OverrideAssumeRevisionExtension.class));
     27        String originalVersion = store.getOrDefault(store, String.class, null);
     28        if (originalVersion != null) {
     29            TestUtils.setPrivateStaticField(Version.class, "instance", originalVersion);
     30        }
     31    }
     32
     33    @Override
     34    public void beforeEach(ExtensionContext context) throws Exception {
     35        Optional<OverrideAssumeRevision> annotation = AnnotationSupport.findAnnotation(context.getElement(), OverrideAssumeRevision.class);
     36        if (annotation.isPresent()) {
     37            Store store = context.getStore(Namespace.create(OverrideAssumeRevisionExtension.class));
     38            store.put("originalVersion", Version.getInstance());
     39            final Version replacementVersion = new JOSMTestRules.MockVersion(annotation.get().value());
     40            TestUtils.setPrivateStaticField(Version.class, "instance", replacementVersion);
     41        }
     42    }
     43}
  • test/unit/org/openstreetmap/josm/testutils/extensions/UseJosmHomeExtension.java

     
     1// License: GPL. For details, see LICENSE file.
     2package org.openstreetmap.josm.testutils.extensions;
     3
     4import java.io.File;
     5import java.io.IOException;
     6import java.nio.file.FileVisitResult;
     7import java.nio.file.Files;
     8import java.nio.file.Path;
     9import java.nio.file.SimpleFileVisitor;
     10import java.nio.file.attribute.BasicFileAttributes;
     11
     12import org.junit.jupiter.api.extension.AfterAllCallback;
     13import org.junit.jupiter.api.extension.BeforeAllCallback;
     14import org.junit.jupiter.api.extension.ExtensionContext;
     15import org.openstreetmap.josm.data.preferences.JosmBaseDirectories;
     16import org.openstreetmap.josm.testutils.annotations.UseJosmHome;
     17
     18/**
     19 * Create a JOSM home directory. Prefer using {@link UseJosmHome}.
     20 * @author Taylor Smock
     21 */
     22public class UseJosmHomeExtension implements BeforeAllCallback, AfterAllCallback {
     23
     24    @Override
     25    public void afterAll(ExtensionContext context) throws Exception {
     26        Path tempDir = Files.createTempDirectory(context.getUniqueId());
     27        Files.walkFileTree(tempDir, new SimpleFileVisitor<Path>() {
     28            @Override
     29            public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {
     30                Files.delete(dir);
     31                return FileVisitResult.CONTINUE;
     32            }
     33
     34            @Override
     35            public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
     36                Files.delete(file);
     37                return FileVisitResult.CONTINUE;
     38            }
     39        });
     40    }
     41
     42    @Override
     43    public void beforeAll(ExtensionContext context) throws Exception {
     44        Path tempDir = Files.createTempDirectory(context.getUniqueId());
     45        File home = tempDir.toFile();
     46        System.setProperty("josm.home", home.getAbsolutePath());
     47        JosmBaseDirectories.getInstance().clearMemos();
     48    }
     49
     50}
  • test/unit/org/openstreetmap/josm/testutils/extensions/UsePreferencesExtension.java

     
     1// License: GPL. For details, see LICENSE file.
     2package org.openstreetmap.josm.testutils.extensions;
     3
     4import java.util.Map;
     5
     6import org.junit.jupiter.api.extension.BeforeEachCallback;
     7import org.junit.jupiter.api.extension.ExtensionContext;
     8import org.junit.jupiter.api.extension.ExtensionContext.Namespace;
     9import org.openstreetmap.josm.TestUtils;
     10import org.openstreetmap.josm.data.Preferences;
     11import org.openstreetmap.josm.spi.preferences.Config;
     12import org.openstreetmap.josm.spi.preferences.Setting;
     13import org.openstreetmap.josm.testutils.annotations.UsePreferences;
     14/**
     15 * Initialize preferences. Prefer {@link UsePreferences}.
     16 * @author Taylor Smock
     17 *
     18 */
     19public class UsePreferencesExtension implements BeforeEachCallback {
     20    @Override
     21    public void beforeEach(ExtensionContext context) throws Exception {
     22        Preferences pref = context.getStore(Namespace.create(BasicPreferencesExtension.class)).get("preferences", Preferences.class);
     23        @SuppressWarnings("unchecked")
     24        final Map<String, Setting<?>> defaultsMap = (Map<String, Setting<?>>) TestUtils.getPrivateField(pref, "defaultsMap");
     25        defaultsMap.clear();
     26        pref.resetToInitialState();
     27        pref.enableSaveOnPut(false);
     28        // No pref init -> that would only create the preferences file.
     29        // We force the use of a wrong API server, just in case anyone attempts an upload
     30        Config.getPref().put("osm-server.url", "http://invalid");
     31    }
     32
     33}