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

Last change on this file since 2578 was 2578, checked in by jttt, 14 years ago

Encalupse OsmPrimitive.incomplete

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