source: josm/trunk/test/functional/org/openstreetmap/josm/io/OsmServerBackreferenceReaderTest.java@ 2986

Last change on this file since 2986 was 2600, checked in by Gubaer, 14 years ago

Updates of test cases
New: JOSM Fixture - can be used in unit and functional tests

File size: 19.7 KB
Line 
1// License: GPL. For details, see LICENSE file.
2package org.openstreetmap.josm.io;
3
4import static org.junit.Assert.assertEquals;
5import static org.junit.Assert.assertNotNull;
6import static org.junit.Assert.fail;
7
8import java.io.File;
9import java.io.FileInputStream;
10import java.io.FileWriter;
11import java.io.IOException;
12import java.io.PrintWriter;
13import java.text.MessageFormat;
14import java.util.ArrayList;
15import java.util.HashSet;
16import java.util.Properties;
17import java.util.Set;
18import java.util.logging.Level;
19import java.util.logging.Logger;
20
21import org.junit.Before;
22import org.junit.BeforeClass;
23import org.junit.Test;
24import org.openstreetmap.josm.Main;
25import org.openstreetmap.josm.data.coor.LatLon;
26import org.openstreetmap.josm.data.osm.Changeset;
27import org.openstreetmap.josm.data.osm.DataSet;
28import org.openstreetmap.josm.data.osm.Node;
29import org.openstreetmap.josm.data.osm.OsmPrimitive;
30import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
31import org.openstreetmap.josm.data.osm.Relation;
32import org.openstreetmap.josm.data.osm.RelationMember;
33import org.openstreetmap.josm.data.osm.Way;
34import org.openstreetmap.josm.data.projection.Mercator;
35import org.openstreetmap.josm.gui.io.UploadStrategy;
36import org.openstreetmap.josm.gui.io.UploadStrategySpecification;
37import org.openstreetmap.josm.gui.progress.NullProgressMonitor;
38
39public class OsmServerBackreferenceReaderTest {
40 static private final Logger logger = Logger.getLogger(OsmServerBackreferenceReader.class.getName());
41
42 protected static Node lookupNode(DataSet ds, int i) {
43 for (Node n : ds.getNodes()) {
44 if (("node-" + i).equals(n.get("name"))) return n;
45 }
46 return null;
47 }
48
49
50 protected static Way lookupWay(DataSet ds, int i) {
51 for (Way w : ds.getWays()) {
52 if (("way-" + i).equals(w.get("name"))) return w;
53 }
54 return null;
55 }
56
57 protected static Relation lookupRelation(DataSet ds, int i) {
58 for (Relation r : ds.getRelations()) {
59 if (("relation-" + i).equals(r.get("name"))) return r;
60 }
61 return null;
62 }
63
64 protected static void populateTestDataSetWithNodes(DataSet ds) {
65 for (int i=0;i<100;i++) {
66 Node n = new Node();
67 n.setCoor(new LatLon(-36.6,47.6));
68 n.put("name", "node-"+i);
69 ds.addPrimitive(n);
70 }
71 }
72
73 protected static void populateTestDataSetWithWays(DataSet ds) {
74 for (int i=0;i<20;i++) {
75 Way w = new Way();
76 for (int j = 0; j < 10;j++) {
77 w.addNode(lookupNode(ds, i+j));
78 }
79 w.put("name", "way-"+i);
80 ds.addPrimitive(w);
81 }
82 }
83
84 protected static void populateTestDataSetWithRelations(DataSet ds) {
85 for (int i=0;i<10;i++) {
86 Relation r = new Relation();
87 r.put("name", "relation-" +i);
88 for (int j =0; j < 10; j++) {
89 RelationMember member = new RelationMember("node-" + j, lookupNode(ds, i + j));
90 r.addMember(member);
91 }
92 for (int j =0; j < 5; j++) {
93 RelationMember member = new RelationMember("way-" + j, lookupWay(ds, i + j));
94 r.addMember(member);
95 }
96 if (i > 5) {
97 for (int j =0; j < 3; j++) {
98 RelationMember member = new RelationMember("relation-" + j, lookupRelation(ds, j));
99 logger.info(MessageFormat.format("adding relation {0} to relation {1}", j, i));
100 r.addMember(member);
101 }
102 }
103 ds.addPrimitive(r);
104 }
105 }
106
107
108 protected static DataSet buildTestDataSet() {
109 DataSet ds = new DataSet();
110 ds.setVersion("0.6");
111
112 populateTestDataSetWithNodes(ds);
113 populateTestDataSetWithWays(ds);
114 populateTestDataSetWithRelations(ds);
115 return ds;
116 }
117
118 /**
119 * creates the dataset on the server.
120 *
121 * @param ds the data set
122 * @throws OsmTransferException
123 */
124 static public void createDataSetOnServer(DataSet ds) throws OsmTransferException {
125 logger.info("creating data set on the server ...");
126 ArrayList<OsmPrimitive> primitives = new ArrayList<OsmPrimitive>();
127 primitives.addAll(ds.getNodes());
128 primitives.addAll(ds.getWays());
129 primitives.addAll(ds.getRelations());
130 OsmServerWriter writer = new OsmServerWriter();
131 Changeset cs = new Changeset();
132 writer.uploadOsm(new UploadStrategySpecification().setStrategy(UploadStrategy.SINGLE_REQUEST_STRATEGY), primitives, cs, NullProgressMonitor.INSTANCE);
133 OsmApi.getOsmApi().closeChangeset(cs, NullProgressMonitor.INSTANCE);
134 }
135
136 static Properties testProperties;
137 static DataSet testDataSet;
138
139 @BeforeClass
140 public static void init() throws OsmTransferException {
141 logger.info("initializing ...");
142 testProperties = new Properties();
143
144 // load properties
145 //
146 try {
147 testProperties.load(MultiFetchServerObjectReaderTest.class.getResourceAsStream("/test-functional-env.properties"));
148 } catch(Exception e){
149 logger.log(Level.SEVERE, MessageFormat.format("failed to load property file ''{0}''", "test-functional-env.properties"));
150 fail(MessageFormat.format("failed to load property file ''{0}''", "test-functional-env.properties"));
151 }
152
153 // check josm.home
154 //
155 String josmHome = testProperties.getProperty("josm.home");
156 if (josmHome == null) {
157 fail(MessageFormat.format("property ''{0}'' not set in test environment", "josm.home"));
158 } else {
159 File f = new File(josmHome);
160 if (! f.exists() || ! f.canRead()) {
161 fail(MessageFormat.format("property ''{0}'' points to ''{1}'' which is either not existing or not readable", "josm.home", josmHome));
162 }
163 }
164
165 // check temp output dir
166 //
167 String tempOutputDir = testProperties.getProperty("test.functional.tempdir");
168 if (tempOutputDir == null) {
169 fail(MessageFormat.format("property ''{0}'' not set in test environment", "test.functional.tempdir"));
170 } else {
171 File f = new File(tempOutputDir);
172 if (! f.exists() || ! f.isDirectory() || ! f.canWrite()) {
173 fail(MessageFormat.format("property ''{0}'' points to ''{1}'' which is either not existing, not a directory, or not writeable", "test.functional.tempdir", tempOutputDir));
174 }
175 }
176
177
178 // init preferences
179 //
180 System.setProperty("josm.home", josmHome);
181 Main.pref.init(false);
182 // don't use atomic upload, the test API server can't cope with large diff uploads
183 //
184 Main.pref.put("osm-server.atomic-upload", false);
185 Main.proj = new Mercator();
186
187 File dataSetCacheOutputFile = new File(tempOutputDir, MultiFetchServerObjectReaderTest.class.getName() + ".dataset");
188
189 // make sure we don't upload to production
190 //
191 String url = OsmApi.getOsmApi().getBaseUrl().toLowerCase().trim();
192 if (url.startsWith("http://www.openstreetmap.org")
193 || url.startsWith("http://api.openstreetmap.org")) {
194 fail(MessageFormat.format("configured url ''{0}'' seems to be a productive url, aborting.", url));
195 }
196
197
198 String p = System.getProperties().getProperty("useCachedDataset");
199 if (p != null && Boolean.parseBoolean(p.trim().toLowerCase())) {
200 logger.info(MessageFormat.format("property ''{0}'' set, using cached dataset", "useCachedDataset"));
201 return;
202 }
203
204 logger.info(MessageFormat.format("property ''{0}'' not set to true, creating test dataset on the server. property is ''{1}''", "useCachedDataset", p));
205
206 // build and upload the test data set
207 //
208 logger.info("creating test data set ....");
209 testDataSet = buildTestDataSet();
210 logger.info("uploading test data set ...");
211 createDataSetOnServer(testDataSet);
212
213 PrintWriter pw = null;
214 try {
215 pw = new PrintWriter(
216 new FileWriter(dataSetCacheOutputFile)
217 );
218 } catch(IOException e) {
219 fail(MessageFormat.format("failed to open file ''{0}'' for writing", dataSetCacheOutputFile.toString()));
220 }
221 logger.info(MessageFormat.format("caching test data set in ''{0}'' ...", dataSetCacheOutputFile.toString()));
222 OsmWriter w = new OsmWriter(pw, false, testDataSet.getVersion());
223 w.header();
224 w.writeDataSources(testDataSet);
225 w.writeContent(testDataSet);
226 w.footer();
227 w.close();
228 pw.close();
229 }
230
231 private DataSet ds;
232
233 @Before
234 public void setUp() throws IOException, IllegalDataException {
235 File f = new File(testProperties.getProperty("test.functional.tempdir"), MultiFetchServerObjectReaderTest.class.getName() + ".dataset");
236 logger.info(MessageFormat.format("reading cached dataset ''{0}''", f.toString()));
237 ds = new DataSet();
238 FileInputStream fis = new FileInputStream(f);
239 ds = OsmReader.parseDataSet(fis, NullProgressMonitor.INSTANCE);
240 fis.close();
241 }
242
243 @Test
244 public void testBackrefrenceForNode() throws OsmTransferException {
245 Node n = lookupNode(ds, 0);
246 assertNotNull(n);
247 Way w = lookupWay(ds, 0);
248 assertNotNull(w);
249
250 OsmServerBackreferenceReader reader = new OsmServerBackreferenceReader(n);
251 reader.setReadFull(false);
252 DataSet referers = reader.parseOsm(NullProgressMonitor.INSTANCE);
253 assertEquals(10, referers.getNodes().size());
254 assertEquals(1, referers.getWays().size());
255 assertEquals(0, referers.getRelations().size());
256 for (Way way : referers.getWays()) {
257 assertEquals(w.getId(), way.getId());
258 assertEquals(false, way.isIncomplete());
259 }
260 }
261
262 @Test
263 public void testBackrefrenceForNode_Full() throws OsmTransferException {
264 Node n = lookupNode(ds, 0);
265 assertNotNull(n);
266 Way w = lookupWay(ds, 0);
267 assertNotNull(w);
268
269 OsmServerBackreferenceReader reader = new OsmServerBackreferenceReader(n);
270 reader.setReadFull(true);
271 DataSet referers = reader.parseOsm(NullProgressMonitor.INSTANCE);
272 assertEquals(10, referers.getNodes().size());
273 assertEquals(1, referers.getWays().size());
274 assertEquals(0, referers.getRelations().size());
275 for (Way way : referers.getWays()) {
276 assertEquals(w.getId(), way.getId());
277 assertEquals(false, way.isIncomplete());
278 assertEquals(10, w.getNodesCount());
279 }
280 }
281
282 @Test
283 public void testBackrefrenceForWay() throws OsmTransferException {
284 Way w = lookupWay(ds, 1);
285 assertNotNull(w);
286 // way with name "way-1" is referred to by two relations
287 //
288
289 OsmServerBackreferenceReader reader = new OsmServerBackreferenceReader(w);
290 reader.setReadFull(false);
291 DataSet referers = reader.parseOsm(NullProgressMonitor.INSTANCE);
292 assertEquals(0, referers.getNodes().size()); // no nodes loaded
293 assertEquals(6, referers.getWays().size()); // 6 ways referred by two relations
294 for (Way w1 : referers.getWays()) {
295 assertEquals(true, w1.isIncomplete());
296 }
297 assertEquals(2, referers.getRelations().size()); // two relations referring to w
298
299 Relation r = lookupRelation(referers, 0);
300 assertNotNull(r);
301 assertEquals(false, r.isIncomplete());
302 r = lookupRelation(referers, 1);
303 assertEquals(false, r.isIncomplete());
304 }
305
306 @Test
307 public void testBackrefrenceForWay_Full() throws OsmTransferException {
308 Way w = lookupWay(ds, 1);
309 assertNotNull(w);
310 // way with name "way-1" is referred to by two relations
311 //
312
313 OsmServerBackreferenceReader reader = new OsmServerBackreferenceReader(w);
314 reader.setReadFull(true);
315 DataSet referers = reader.parseOsm(NullProgressMonitor.INSTANCE);
316 assertEquals(6, referers.getWays().size()); // 6 ways referred by two relations
317 for (Way w1 : referers.getWays()) {
318 assertEquals(false, w1.isIncomplete());
319 }
320 assertEquals(2, referers.getRelations().size()); // two relations referring to
321 Set<Long> expectedNodeIds = new HashSet<Long>();
322 for (Way way : referers.getWays()) {
323 Way orig = (Way) ds.getPrimitiveById(way);
324 for (Node n : orig.getNodes()) {
325 expectedNodeIds.add(n.getId());
326 }
327 }
328 assertEquals(expectedNodeIds.size(), referers.getNodes().size());
329 for (Node n : referers.getNodes()) {
330 assertEquals(true, expectedNodeIds.contains(n.getId()));
331 }
332
333 Relation r = lookupRelation(referers, 0);
334 assertNotNull(r);
335 assertEquals(false, r.isIncomplete());
336 r = lookupRelation(referers, 1);
337 assertEquals(false, r.isIncomplete());
338 }
339
340 @Test
341 public void testBackrefrenceForRelation() throws OsmTransferException {
342 Relation r = lookupRelation(ds, 1);
343 assertNotNull(r);
344 // way with name "relation-1" is referred to by four relations:
345 // relation-6, relation-7, relation-8, relation-9
346 //
347
348 OsmServerBackreferenceReader reader = new OsmServerBackreferenceReader(r);
349 reader.setReadFull(false);
350 DataSet referers = reader.parseOsm(NullProgressMonitor.INSTANCE);
351
352 Set<Long> referringRelationsIds = new HashSet<Long>();
353 r = lookupRelation(referers, 6);
354 assertNotNull(r);
355 assertEquals(false, r.isIncomplete());
356 referringRelationsIds.add(r.getId());
357 r = lookupRelation(referers, 7);
358 assertNotNull(r);
359 assertEquals(false, r.isIncomplete());
360 referringRelationsIds.add(r.getId());
361 r = lookupRelation(referers, 8);
362 assertNotNull(r);
363 assertEquals(false, r.isIncomplete());
364 referringRelationsIds.add(r.getId());
365 r = lookupRelation(referers, 9);
366 assertNotNull(r);
367 assertEquals(false, r.isIncomplete());
368 referringRelationsIds.add(r.getId());
369
370 for (Relation r1 : referers.getRelations()) {
371 if (!referringRelationsIds.contains(r1.getId())) {
372 assertEquals(true, r1.isIncomplete());
373 }
374 }
375
376 // make sure we read all ways referred to by parent relations. These
377 // ways are incomplete after reading.
378 //
379 Set<Long> expectedWayIds = new HashSet<Long>();
380 for (RelationMember m : lookupRelation(ds, 6).getMembers()) {
381 if (m.isWay()) {
382 expectedWayIds.add(m.getMember().getId());
383 }
384 }
385 for (RelationMember m : lookupRelation(ds, 7).getMembers()) {
386 if (m.isWay()) {
387 expectedWayIds.add(m.getMember().getId());
388 }
389 }
390 for (RelationMember m : lookupRelation(ds, 8).getMembers()) {
391 if (m.isWay()) {
392 expectedWayIds.add(m.getMember().getId());
393 }
394 }
395 for (RelationMember m : lookupRelation(ds, 9).getMembers()) {
396 if (m.isWay()) {
397 expectedWayIds.add(m.getMember().getId());
398 }
399 }
400
401 assertEquals(expectedWayIds.size(), referers.getWays().size());
402 for (Way w1 : referers.getWays()) {
403 assertEquals(true, expectedWayIds.contains(w1.getId()));
404 assertEquals(true, w1.isIncomplete());
405 }
406
407 // make sure we didn't read any nodes
408 //
409 assertEquals(0, referers.getNodes().size());
410 }
411
412 protected Set<Long> getNodeIdsInWay(Way way) {
413 HashSet<Long> ret = new HashSet<Long>();
414 if (way == null)return ret;
415 for (Node n: way.getNodes()) {
416 ret.add(n.getId());
417 }
418 return ret;
419 }
420
421 protected Set<Long> getNodeIdsInRelation(Relation r) {
422 HashSet<Long> ret = new HashSet<Long>();
423 if (r == null) return ret;
424 for (RelationMember m: r.getMembers()) {
425 if (m.isNode()) {
426 ret.add(m.getMember().getId());
427 } else if (m.isWay()) {
428 ret.addAll(getNodeIdsInWay(m.getWay()));
429 } else if (m.isRelation()) {
430 ret.addAll(getNodeIdsInRelation(m.getRelation()));
431 }
432 }
433 return ret;
434 }
435
436 @Test
437 public void testBackrefrenceForRelation_Full() throws OsmTransferException {
438 Relation r = lookupRelation(ds, 1);
439 assertNotNull(r);
440 // way with name "relation-1" is referred to by four relations:
441 // relation-6, relation-7, relation-8, relation-9
442 //
443
444 OsmServerBackreferenceReader reader = new OsmServerBackreferenceReader(r);
445 reader.setReadFull(true);
446 DataSet referers = reader.parseOsm(NullProgressMonitor.INSTANCE);
447
448 Set<Long> referringRelationsIds = new HashSet<Long>();
449 r = lookupRelation(referers, 6);
450 assertNotNull(r);
451 assertEquals(false, r.isIncomplete());
452 referringRelationsIds.add(r.getId());
453 r = lookupRelation(referers, 7);
454 assertNotNull(r);
455 assertEquals(false, r.isIncomplete());
456 referringRelationsIds.add(r.getId());
457 r = lookupRelation(referers, 8);
458 assertNotNull(r);
459 assertEquals(false, r.isIncomplete());
460 referringRelationsIds.add(r.getId());
461 r = lookupRelation(referers, 9);
462 assertNotNull(r);
463 assertEquals(false, r.isIncomplete());
464 referringRelationsIds.add(r.getId());
465
466 // all relations are fully loaded
467 //
468 for (Relation r1 : referers.getRelations()) {
469 assertEquals(false, r1.isIncomplete());
470 }
471
472 // make sure we read all ways referred to by parent relations. These
473 // ways are completely read after reading the relations
474 //
475 Set<Long> expectedWayIds = new HashSet<Long>();
476 for (RelationMember m : lookupRelation(ds, 6).getMembers()) {
477 if (m.isWay()) {
478 expectedWayIds.add(m.getMember().getId());
479 }
480 }
481 for (RelationMember m : lookupRelation(ds, 7).getMembers()) {
482 if (m.isWay()) {
483 expectedWayIds.add(m.getMember().getId());
484 }
485 }
486 for (RelationMember m : lookupRelation(ds, 8).getMembers()) {
487 if (m.isWay()) {
488 expectedWayIds.add(m.getMember().getId());
489 }
490 }
491 for (RelationMember m : lookupRelation(ds, 9).getMembers()) {
492 if (m.isWay()) {
493 expectedWayIds.add(m.getMember().getId());
494 }
495 }
496 for (long id : expectedWayIds) {
497 Way w = (Way) referers.getPrimitiveById(id, OsmPrimitiveType.WAY);
498 assertNotNull(w);
499 assertEquals(false, w.isIncomplete());
500 }
501
502 Set<Long> expectedNodeIds = new HashSet<Long>();
503 for (int i = 6; i < 10; i++) {
504 Relation r1 = lookupRelation(ds, i);
505 expectedNodeIds.addAll(getNodeIdsInRelation(r1));
506 }
507
508 assertEquals(expectedNodeIds.size(), referers.getNodes().size());
509 for (Node n : referers.getNodes()) {
510 assertEquals(true, expectedNodeIds.contains(n.getId()));
511 }
512 }
513}
Note: See TracBrowser for help on using the repository browser.