source: josm/trunk/test/functional/org/openstreetmap/josm/io/MultiFetchServerObjectReaderTest.java@ 17276

Last change on this file since 17276 was 17276, checked in by Don-vip, 3 years ago

see #16567 - fix obvious test errors + upgrade tests dependencies

  • Property svn:eol-style set to native
File size: 13.4 KB
Line 
1// License: GPL. For details, see LICENSE file.
2package org.openstreetmap.josm.io;
3
4import static org.junit.jupiter.api.Assertions.assertEquals;
5import static org.junit.jupiter.api.Assertions.assertFalse;
6import static org.junit.jupiter.api.Assertions.assertNotNull;
7import static org.junit.jupiter.api.Assertions.assertTrue;
8import static org.junit.jupiter.api.Assumptions.assumeTrue;
9
10import java.io.File;
11import java.io.FileInputStream;
12import java.io.FileNotFoundException;
13import java.io.FileOutputStream;
14import java.io.IOException;
15import java.io.OutputStreamWriter;
16import java.io.PrintWriter;
17import java.nio.charset.StandardCharsets;
18import java.security.SecureRandom;
19import java.text.MessageFormat;
20import java.util.ArrayList;
21import java.util.Arrays;
22import java.util.Locale;
23import java.util.Random;
24import java.util.TreeSet;
25import java.util.concurrent.TimeUnit;
26import java.util.logging.Logger;
27
28import org.junit.jupiter.api.BeforeAll;
29import org.junit.jupiter.api.BeforeEach;
30import org.junit.jupiter.api.Test;
31import org.junit.jupiter.api.Timeout;
32import org.junit.jupiter.api.extension.RegisterExtension;
33import org.openstreetmap.josm.JOSMFixture;
34import org.openstreetmap.josm.TestUtils;
35import org.openstreetmap.josm.data.coor.LatLon;
36import org.openstreetmap.josm.data.osm.Changeset;
37import org.openstreetmap.josm.data.osm.DataSet;
38import org.openstreetmap.josm.data.osm.Node;
39import org.openstreetmap.josm.data.osm.OsmPrimitive;
40import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
41import org.openstreetmap.josm.data.osm.Relation;
42import org.openstreetmap.josm.data.osm.RelationMember;
43import org.openstreetmap.josm.data.osm.Way;
44import org.openstreetmap.josm.gui.progress.NullProgressMonitor;
45import org.openstreetmap.josm.spi.preferences.Config;
46import org.openstreetmap.josm.testutils.JOSMTestRules;
47
48import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
49
50/**
51 * Unit tests of {@link MultiFetchServerObjectReader}.
52 */
53@SuppressFBWarnings(value = "CRLF_INJECTION_LOGS")
54@Timeout(value = 60, unit = TimeUnit.SECONDS)
55class MultiFetchServerObjectReaderTest {
56 private static final Logger logger = Logger.getLogger(MultiFetchServerObjectReader.class.getName());
57
58 /**
59 * Setup test.
60 */
61 @RegisterExtension
62 @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
63 public JOSMTestRules test = new JOSMTestRules().preferences();
64
65 /**
66 * builds a large data set to be used later for testing MULTI FETCH on the server
67 *
68 * @return a large data set
69 */
70 protected static DataSet buildTestDataSet() {
71 DataSet ds = new DataSet();
72 ds.setVersion("0.6");
73 Random rand = new SecureRandom();
74
75 int numNodes = 1000;
76 int numWays = 1000;
77 int numRelations = 1000;
78
79 ArrayList<Node> nodes = new ArrayList<>();
80 ArrayList<Way> ways = new ArrayList<>();
81
82 // create a set of nodes
83 //
84 for (int i = 0; i < numNodes; i++) {
85 Node n = new Node();
86 n.setCoor(new LatLon(-36.6, 47.6));
87 n.put("name", "node-"+i);
88 ds.addPrimitive(n);
89 nodes.add(n);
90 }
91
92 // create a set of ways, each with a random number of nodes
93 //
94 for (int i = 0; i < numWays; i++) {
95 Way w = new Way();
96 int numNodesInWay = 2 + (int) Math.round(rand.nextDouble() * 5);
97 int start = (int) Math.round(rand.nextDouble() * numNodes);
98 for (int j = 0; j < numNodesInWay; j++) {
99 int idx = (start + j) % numNodes;
100 Node n = nodes.get(idx);
101 w.addNode(n);
102 }
103 w.put("name", "way-"+i);
104 ds.addPrimitive(w);
105 ways.add(w);
106 }
107
108 // create a set of relations each with a random number of nodes, and ways
109 //
110 for (int i = 0; i < numRelations; i++) {
111 Relation r = new Relation();
112 r.put("name", "relation-" +i);
113 int numNodesInRelation = (int) Math.round(rand.nextDouble() * 10);
114 int start = (int) Math.round(rand.nextDouble() * numNodes);
115 for (int j = 0; j < numNodesInRelation; j++) {
116 int idx = (start + j) % 500;
117 Node n = nodes.get(idx);
118 r.addMember(new RelationMember("role-" + j, n));
119 }
120 int numWaysInRelation = (int) Math.round(rand.nextDouble() * 10);
121 start = (int) Math.round(rand.nextDouble() * numWays);
122 for (int j = 0; j < numWaysInRelation; j++) {
123 int idx = (start + j) % 500;
124 Way w = ways.get(idx);
125 r.addMember(new RelationMember("role-" + j, w));
126 }
127 ds.addPrimitive(r);
128 }
129
130 return ds;
131 }
132
133 private static DataSet testDataSet;
134
135 /**
136 * creates the dataset on the server.
137 *
138 * @param ds the data set
139 * @throws OsmTransferException if something goes wrong
140 */
141 public static void createDataSetOnServer(DataSet ds) throws OsmTransferException {
142 logger.info("creating data set on the server ...");
143 ArrayList<OsmPrimitive> primitives = new ArrayList<>();
144 primitives.addAll(testDataSet.getNodes());
145 primitives.addAll(testDataSet.getWays());
146 primitives.addAll(testDataSet.getRelations());
147
148 OsmServerWriter writer = new OsmServerWriter();
149 Changeset cs = new Changeset();
150 writer.uploadOsm(new UploadStrategySpecification().setStrategy(UploadStrategy.SINGLE_REQUEST_STRATEGY),
151 primitives, cs, NullProgressMonitor.INSTANCE);
152 OsmApi.getOsmApi().closeChangeset(cs, NullProgressMonitor.INSTANCE);
153 }
154
155 /**
156 * Setup test.
157 * @throws Exception if an error occurs
158 */
159 @BeforeAll
160 public static void init() throws Exception {
161 if (!TestUtils.areCredentialsProvided()) {
162 logger.severe("OSM DEV API credentials not provided. Please define them with -Dosm.username and -Dosm.password");
163 return;
164 }
165 logger.info("initializing ...");
166 JOSMFixture.createFunctionalTestFixture().init();
167
168 Config.getPref().put("osm-server.auth-method", "basic");
169
170 // don't use atomic upload, the test API server can't cope with large diff uploads
171 Config.getPref().putBoolean("osm-server.atomic-upload", false);
172
173 File dataSetCacheOutputFile = new File(System.getProperty("java.io.tmpdir"),
174 MultiFetchServerObjectReaderTest.class.getName() + ".dataset");
175
176 String p = System.getProperties().getProperty("useCachedDataset");
177 if (p != null && Boolean.parseBoolean(p.trim().toLowerCase(Locale.ENGLISH))) {
178 logger.info(MessageFormat.format("property ''{0}'' set, using cached dataset", "useCachedDataset"));
179 return;
180 }
181
182 logger.info(MessageFormat.format(
183 "property ''{0}'' not set to true, creating test dataset on the server. property is ''{1}''", "useCachedDataset", p));
184
185 // build and upload the test data set
186 logger.info("creating test data set ....");
187 testDataSet = buildTestDataSet();
188 logger.info("uploading test data set ...");
189 createDataSetOnServer(testDataSet);
190
191 try (
192 PrintWriter pw = new PrintWriter(
193 new OutputStreamWriter(new FileOutputStream(dataSetCacheOutputFile), StandardCharsets.UTF_8)
194 )) {
195 logger.info(MessageFormat.format("caching test data set in ''{0}'' ...", dataSetCacheOutputFile.toString()));
196 try (OsmWriter w = new OsmWriter(pw, false, testDataSet.getVersion())) {
197 w.header();
198 w.writeDataSources(testDataSet);
199 w.writeContent(testDataSet);
200 w.footer();
201 }
202 }
203 }
204
205 private DataSet ds;
206
207 /**
208 * Setup test.
209 * @throws IOException if any I/O error occurs
210 * @throws IllegalDataException if an error was found while parsing the OSM data
211 * @throws FileNotFoundException if the dataset file cannot be found
212 */
213 @BeforeEach
214 public void setUp() throws IOException, IllegalDataException, FileNotFoundException {
215 if (!TestUtils.areCredentialsProvided()) {
216 return;
217 }
218 File f = new File(System.getProperty("java.io.tmpdir"), MultiFetchServerObjectReaderTest.class.getName() + ".dataset");
219 logger.info(MessageFormat.format("reading cached dataset ''{0}''", f.toString()));
220 ds = new DataSet();
221 try (FileInputStream fis = new FileInputStream(f)) {
222 ds = OsmReader.parseDataSet(fis, NullProgressMonitor.INSTANCE);
223 }
224 }
225
226 /**
227 * Test to multi-get 10 nodes.
228 * @throws OsmTransferException if an error occurs
229 */
230 @Test
231 void testMultiGet10Nodes() throws OsmTransferException {
232 assumeTrue(TestUtils.areCredentialsProvided());
233 MultiFetchServerObjectReader reader = new MultiFetchServerObjectReader();
234 ArrayList<Node> nodes = new ArrayList<>(ds.getNodes());
235 for (int i = 0; i < 10; i++) {
236 reader.append(nodes.get(i));
237 }
238 DataSet out = reader.parseOsm(NullProgressMonitor.INSTANCE);
239 assertEquals(10, out.getNodes().size());
240 for (Node n1:out.getNodes()) {
241 Node n2 = (Node) ds.getPrimitiveById(n1);
242 assertNotNull(n2);
243 assertEquals(n2.get("name"), n2.get("name"));
244 }
245 assertTrue(reader.getMissingPrimitives().isEmpty());
246 }
247
248 /**
249 * Test to multi-get 10 ways.
250 * @throws OsmTransferException if an error occurs
251 */
252 @Test
253 void testMultiGet10Ways() throws OsmTransferException {
254 assumeTrue(TestUtils.areCredentialsProvided());
255 MultiFetchServerObjectReader reader = new MultiFetchServerObjectReader();
256 ArrayList<Way> ways = new ArrayList<>(ds.getWays());
257 for (int i = 0; i < 10; i++) {
258 reader.append(ways.get(i));
259 }
260 DataSet out = reader.parseOsm(NullProgressMonitor.INSTANCE);
261 assertEquals(10, out.getWays().size());
262 for (Way w1: out.getWays()) {
263 Way w2 = (Way) ds.getPrimitiveById(w1);
264 assertNotNull(w2);
265 assertEquals(w2.getNodesCount(), w1.getNodesCount());
266 assertEquals(w2.get("name"), w1.get("name"));
267 }
268 assertTrue(reader.getMissingPrimitives().isEmpty());
269 }
270
271 /**
272 * Test to multi-get 10 relations.
273 * @throws OsmTransferException if an error occurs
274 */
275 @Test
276 void testMultiGet10Relations() throws OsmTransferException {
277 assumeTrue(TestUtils.areCredentialsProvided());
278 MultiFetchServerObjectReader reader = new MultiFetchServerObjectReader();
279 ArrayList<Relation> relations = new ArrayList<>(ds.getRelations());
280 for (int i = 0; i < 10; i++) {
281 reader.append(relations.get(i));
282 }
283 DataSet out = reader.parseOsm(NullProgressMonitor.INSTANCE);
284 assertEquals(10, out.getRelations().size());
285 for (Relation r1: out.getRelations()) {
286 Relation r2 = (Relation) ds.getPrimitiveById(r1);
287 assertNotNull(r2);
288 assertEquals(r2.getMembersCount(), r1.getMembersCount());
289 assertEquals(r2.get("name"), r2.get("name"));
290 }
291 assertTrue(reader.getMissingPrimitives().isEmpty());
292 }
293
294 /**
295 * Test to multi-get 800 nodes.
296 * @throws OsmTransferException if an error occurs
297 */
298 @Test
299 void testMultiGet800Nodes() throws OsmTransferException {
300 assumeTrue(TestUtils.areCredentialsProvided());
301 MultiFetchServerObjectReader reader = new MultiFetchServerObjectReader();
302 ArrayList<Node> nodes = new ArrayList<>(ds.getNodes());
303 for (int i = 0; i < 812; i++) {
304 reader.append(nodes.get(i));
305 }
306 DataSet out = reader.parseOsm(NullProgressMonitor.INSTANCE);
307 assertEquals(812, out.getNodes().size());
308 for (Node n1:out.getNodes()) {
309 Node n2 = (Node) ds.getPrimitiveById(n1);
310 assertNotNull(n2);
311 assertEquals(n2.get("name"), n2.get("name"));
312 }
313 assertTrue(reader.getMissingPrimitives().isEmpty());
314 }
315
316 /**
317 * Test to multi-get non-existing node.
318 * @throws OsmTransferException if an error occurs
319 */
320 @Test
321 void testMultiGetWithNonExistingNode() throws OsmTransferException {
322 assumeTrue(TestUtils.areCredentialsProvided());
323 MultiFetchServerObjectReader reader = new MultiFetchServerObjectReader();
324 ArrayList<Node> nodes = new ArrayList<>(ds.getNodes());
325 for (int i = 0; i < 10; i++) {
326 reader.append(nodes.get(i));
327 }
328 Node n = new Node(9999999);
329 reader.append(n); // doesn't exist
330 DataSet out = reader.parseOsm(NullProgressMonitor.INSTANCE);
331 assertEquals(10, out.getNodes().size());
332 for (Node n1:out.getNodes()) {
333 Node n2 = (Node) ds.getPrimitiveById(n1);
334 assertNotNull(n2);
335 assertEquals(n2.get("name"), n2.get("name"));
336 }
337 assertFalse(reader.getMissingPrimitives().isEmpty());
338 assertEquals(1, reader.getMissingPrimitives().size());
339 assertEquals(9999999, reader.getMissingPrimitives().iterator().next().getUniqueId());
340 }
341
342 /**
343 * Test {@link MultiFetchServerObjectReader#buildRequestString}
344 */
345 @Test
346 void testBuildRequestString() {
347 String requestString = new MultiFetchServerObjectReader()
348 .buildRequestString(OsmPrimitiveType.WAY, new TreeSet<>(Arrays.asList(130L, 123L, 126L)));
349 assertEquals("ways?ways=123,126,130", requestString);
350 }
351}
Note: See TracBrowser for help on using the repository browser.