// License: GPL. For details, see LICENSE file.
package org.openstreetmap.josm.gui.preferences.map;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.Set;
import org.junit.BeforeClass;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.Timeout;
import org.openstreetmap.josm.JOSMFixture;
import org.openstreetmap.josm.Main;
import org.openstreetmap.josm.gui.preferences.SourceEditor.ExtendedSourceEntry;
import org.openstreetmap.josm.gui.tagging.presets.TaggingPreset;
import org.openstreetmap.josm.gui.tagging.presets.TaggingPresetReader;
import org.openstreetmap.josm.tools.ImageProvider;
import org.xml.sax.SAXException;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
/**
* Integration tests of {@link TaggingPresetPreference} class.
*/
public class TaggingPresetPreferenceTestIT {
/**
* Global timeout applied to all test methods.
*/
@Rule
@SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
public Timeout globalTimeout = Timeout.seconds(10*60);
/**
* Setup test.
*/
@BeforeClass
public static void setUpBeforeClass() {
JOSMFixture.createUnitTestFixture().init();
}
/**
* Test that available tagging presets are valid.
* @throws Exception in case of error
*/
@Test
public void testValidityOfAvailablePresets() throws Exception {
ImageProvider.clearCache();
Collection<ExtendedSourceEntry> sources = new TaggingPresetPreference.TaggingPresetSourceEditor()
.loadAndGetAvailableSources();
assertFalse(sources.isEmpty());
// Double traditional timeouts to avoid random problems
Main.pref.putInteger("socket.timeout.connect", 30);
Main.pref.putInteger("socket.timeout.read", 60);
Collection<Throwable> allErrors = new ArrayList<>();
Set<String> allMessages = new HashSet<>();
for (ExtendedSourceEntry source : sources) {
System.out.println(source.url);
try {
testPresets(allMessages, source);
} catch (IOException e) {
try {
Main.warn(e);
// try again in case of temporary network error
testPresets(allMessages, source);
} catch (SAXException | IOException e1) {
e.printStackTrace();
// ignore frequent network errors with www.freietonne.de causing too much Jenkins failures
if (!source.url.contains("www.freietonne.de")) {
allErrors.add(e1);
}
System.out.println(" => KO");
}
} catch (SAXException | IllegalArgumentException e) {
e.printStackTrace();
if (!source.url.contains("yopaseopor/")) {
// ignore https://raw.githubusercontent.com/yopaseopor/traffic_signs_preset_JOSM cause too much errors
allErrors.add(e);
}
System.out.println(" => KO");
}
}
ImageProvider.clearCache();
assertTrue(allErrors.toString(), allErrors.isEmpty());
assertTrue(allMessages.toString(), allMessages.isEmpty());
}
private static void testPresets(Set<String> allMessages, ExtendedSourceEntry source) throws SAXException, IOException {
Collection<TaggingPreset> presets = TaggingPresetReader.readAll(source.url, true);
assertFalse(presets.isEmpty());
Collection<String> errorsAndWarnings = Main.getLastErrorAndWarnings();
boolean error = false;
for (String message : errorsAndWarnings) {
if (message.contains(TaggingPreset.PRESET_ICON_ERROR_MSG_PREFIX)) {
error = true;
// ignore https://github.com/yopaseopor/traffic_signs_preset_JOSM because of far too frequent missing icons errors
if (!source.url.contains("yopaseopor/traffic_signs")) {
allMessages.add(message);
}
}
}
System.out.println(error ? " => KO" : " => OK");
if (error) {
Main.clearLastErrorAndWarnings();
}
}
}