Ticket #21476: 21476.patch

File 21476.patch, 5.9 KB (added by taylor.smock, 4 years ago)

Fix and add non-regression test for IllegalStateException in ChangesetQuery.forCurrentUser when the current user is anonymous

  • src/org/openstreetmap/josm/data/osm/ChangesetCache.java

    diff --git a/src/org/openstreetmap/josm/data/osm/ChangesetCache.java b/src/org/openstreetmap/josm/data/osm/ChangesetCache.java
    index 74840c6298..14b349b165 100644
    a b package org.openstreetmap.josm.data.osm;  
    33
    44import java.util.ArrayList;
    55import java.util.Collection;
     6import java.util.Collections;
    67import java.util.HashMap;
    78import java.util.HashSet;
    89import java.util.List;
    public final class ChangesetCache implements PreferenceChangedListener {  
    273274        synchronized (this) {
    274275            reader = new OsmServerChangesetReader();
    275276        }
    276         List<Changeset> server = reader.queryChangesets(ChangesetQuery.forCurrentUser().beingOpen(true), null);
     277        List<Changeset> server = UserIdentityManager.getInstance().isAnonymous() ? Collections.emptyList() : reader.queryChangesets(ChangesetQuery.forCurrentUser().beingOpen(true), null);
    277278        Logging.info("{0} open changesets on server", server.size());
    278279
    279280        DefaultChangesetCacheEvent e = new DefaultChangesetCacheEvent(this);
  • src/org/openstreetmap/josm/io/UploadStrategy.java

    diff --git a/src/org/openstreetmap/josm/io/UploadStrategy.java b/src/org/openstreetmap/josm/io/UploadStrategy.java
    index f1e0d2e5e4..f675c150f7 100644
    a b public enum UploadStrategy {  
    9292     * @param strategy the strategy to save
    9393     */
    9494    public static void saveToPreferences(UploadStrategy strategy) {
    95         Config.getPref().put("osm-server.upload-strategy", strategy.getPreferenceValue());
     95        Config.getPref().put("osm-server.upload-strategy", strategy != null ? strategy.getPreferenceValue() : null);
    9696    }
    9797}
  • new file test/unit/org/openstreetmap/josm/actions/UploadActionTest.java

    diff --git a/test/unit/org/openstreetmap/josm/actions/UploadActionTest.java b/test/unit/org/openstreetmap/josm/actions/UploadActionTest.java
    new file mode 100644
    index 0000000000..d30e23868f
    - +  
     1package org.openstreetmap.josm.actions;
     2
     3import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
     4import static org.junit.jupiter.api.Assertions.assertTrue;
     5import static org.junit.jupiter.api.Assertions.fail;
     6
     7import java.awt.GraphicsEnvironment;
     8import java.util.Collections;
     9import java.util.concurrent.TimeUnit;
     10
     11import org.junit.jupiter.api.Test;
     12import org.junit.jupiter.api.extension.RegisterExtension;
     13import org.openstreetmap.josm.TestUtils;
     14import org.openstreetmap.josm.command.AddPrimitivesCommand;
     15import org.openstreetmap.josm.data.UserIdentityManager;
     16import org.openstreetmap.josm.data.coor.LatLon;
     17import org.openstreetmap.josm.data.osm.DataSet;
     18import org.openstreetmap.josm.data.osm.Node;
     19import org.openstreetmap.josm.gui.MainApplication;
     20import org.openstreetmap.josm.gui.io.UploadDialog;
     21import org.openstreetmap.josm.gui.layer.OsmDataLayer;
     22import org.openstreetmap.josm.gui.util.GuiHelper;
     23import org.openstreetmap.josm.testutils.JOSMTestRules;
     24import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
     25import org.openstreetmap.josm.testutils.mockers.WindowMocker;
     26import org.openstreetmap.josm.tools.Logging;
     27
     28import mockit.Invocation;
     29import mockit.Mock;
     30import mockit.MockUp;
     31
     32/**
     33 * Test class for {@link UploadAction}
     34 * @author Taylor Smock
     35 */
     36@BasicPreferences
     37class UploadActionTest {
     38    // Only needed for layer cleanup. And user identity cleanup. And ensuring that data isn't accidentally uploaded.
     39    @RegisterExtension
     40    JOSMTestRules josmTestRules = new JOSMTestRules().main().projection().fakeAPI();
     41
     42    /**
     43     * Non-regression test for JOSM #21476.
     44     */
     45    @Test
     46    void testNonRegression21476() {
     47        TestUtils.assumeWorkingJMockit();
     48        Logging.clearLastErrorAndWarnings();
     49        new WindowMocker();
     50        new UploadDialogMock();
     51        // Set up the preconditions. This test acts more like an integration test, in so far as it also tests
     52        // unrelated code.
     53        UserIdentityManager.getInstance().setAnonymous();
     54        final DataSet testData = new DataSet();
     55        MainApplication.getLayerManager().addLayer(new OsmDataLayer(testData, "testNonRegression21476", null));
     56        final Node toAdd = new Node(new LatLon(20, 20));
     57        toAdd.put("shop", "butcher");
     58        final AddPrimitivesCommand command = new AddPrimitivesCommand(Collections.singletonList(toAdd.save()), testData);
     59        command.executeCommand();
     60        final UploadAction uploadAction = new UploadAction();
     61        uploadAction.updateEnabledState();
     62        assertTrue(uploadAction.isEnabled());
     63        // Perform the actual "test" -- we don't want it to throw an exception
     64        assertDoesNotThrow(() -> uploadAction.actionPerformed(null));
     65        // Sync threads
     66        GuiHelper.runInEDT(() -> {/* sync edt */});
     67        try {
     68            MainApplication.worker.submit(() -> {/* sync worker */}).get(1, TimeUnit.SECONDS);
     69            assertTrue(Logging.getLastErrorAndWarnings().isEmpty());
     70        } catch (Exception exception) {
     71            fail(exception);
     72        } finally {
     73            Logging.clearLastErrorAndWarnings();
     74        }
     75    }
     76
     77    private static class UploadDialogMock extends MockUp<UploadDialog> {
     78        @Mock
     79        public void pack(final Invocation invocation) {
     80            if (!GraphicsEnvironment.isHeadless()) {
     81                invocation.proceed();
     82            }
     83        }
     84
     85        @Mock
     86        public void setVisible(final Invocation invocation, final boolean visible) {
     87            if (!GraphicsEnvironment.isHeadless()) {
     88                invocation.proceed(visible);
     89            }
     90        }
     91
     92        @Mock
     93        public final boolean isCanceled(final Invocation invocation) {
     94            if (!GraphicsEnvironment.isHeadless()) {
     95                return invocation.proceed();
     96            }
     97            return true;
     98        }
     99    }
     100}