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

Last change on this file since 1796 was 1796, checked in by framm, 15 years ago
  • comment out "getSkippedWays" references in MultiFetch test, did not compile
File size: 13.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;
7import static org.junit.Assert.*;
8
9import java.io.File;
10import java.io.FileInputStream;
11import java.io.FileWriter;
12import java.io.IOException;
13import java.io.PrintWriter;
14import java.text.MessageFormat;
15import java.util.ArrayList;
16import java.util.Iterator;
17import java.util.Properties;
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.DataSet;
27import org.openstreetmap.josm.data.osm.Node;
28import org.openstreetmap.josm.data.osm.OsmPrimitive;
29import org.openstreetmap.josm.data.osm.Relation;
30import org.openstreetmap.josm.data.osm.RelationMember;
31import org.openstreetmap.josm.data.osm.Way;
32import org.openstreetmap.josm.data.projection.Mercator;
33import org.openstreetmap.josm.gui.PleaseWaitDialog;
34import org.xml.sax.SAXException;
35
36public class MultiFetchServerObjectReaderTest {
37 private static Logger logger = Logger.getLogger(MultiFetchServerObjectReader.class.getName());
38
39 /**
40 * builds a large data set to be used later for testing MULTI FETCH on the server
41 *
42 * @return a large data set
43 */
44 protected static DataSet buildTestDataSet() {
45 DataSet ds = new DataSet();
46 ds.version = "0.6";
47
48 int numNodes = 1000;
49 int numWays = 1000;
50 int numRelations = 1000;
51
52 ArrayList<Node> nodes = new ArrayList<Node>();
53 ArrayList<Way> ways = new ArrayList<Way>();
54
55 // create a set of nodes
56 //
57 for (int i=0; i< numNodes; i++) {
58 Node n = new Node(0);
59 n.setCoor(new LatLon(-36.6,47.6));
60 n.put("name", "node-"+i);
61 n.incomplete = false;
62 ds.addPrimitive(n);
63 nodes.add(n);
64 }
65
66 // create a set of ways, each with a random number of
67 // nodes
68 //
69 for (int i=0; i< numWays; i++) {
70 Way w = new Way(0);
71 w.incomplete = false;
72 int numNodesInWay = 2 + (int)Math.round(Math.random() * 5);
73 int start = (int)Math.round(Math.random() * numNodes);
74 for (int j = 0; j < numNodesInWay;j++) {
75 int idx = (start + j) % numNodes;
76 Node n = nodes.get(idx);
77 w.nodes.add(n);
78 }
79 w.put("name", "way-"+i);
80 ds.addPrimitive(w);
81 ways.add(w);
82 }
83
84 // create a set of relations each with a random number of nodes,
85 // and ways
86 //
87 for (int i=0; i< numRelations; i++) {
88 Relation r = new Relation(0);
89 r.incomplete = false;
90 r.put("name", "relation-" +i);
91 int numNodesInRelation = (int)Math.round(Math.random() * 10);
92 int start = (int)Math.round(Math.random() * numNodes);
93 for (int j = 0; j < numNodesInRelation;j++) {
94 int idx = (start + j) % 500;
95 Node n = nodes.get(idx);
96 RelationMember member = new RelationMember();
97 member.member = n;
98 member.role = "role-" + j;
99 r.members.add(member);
100 }
101 int numWaysInRelation = (int)Math.round(Math.random() * 10);
102 start = (int)Math.round(Math.random() * numWays);
103 for (int j = 0; j < numWaysInRelation;j++) {
104 int idx = (start + j) % 500;
105 Way w = ways.get(idx);
106 RelationMember member = new RelationMember();
107 member.member = w;
108 member.role = "role-" + j;
109 r.members.add(member);
110 }
111 ds.addPrimitive(r);
112 }
113
114 return ds;
115 }
116
117 static public DataSet testDataSet;
118 static public Properties testProperties;
119
120 /**
121 * creates the dataset on the server.
122 *
123 * @param ds the data set
124 * @throws OsmTransferException
125 */
126 static public void createDataSetOnServer(DataSet ds) throws OsmTransferException {
127 logger.info("creating data set on the server ...");
128 ArrayList<OsmPrimitive> primitives = new ArrayList<OsmPrimitive>();
129 primitives.addAll(testDataSet.nodes);
130 primitives.addAll(testDataSet.ways);
131 primitives.addAll(testDataSet.relations);
132
133 OsmServerWriter writer = new OsmServerWriter();
134 writer.uploadOsm("0.6", primitives);
135 }
136
137 @BeforeClass
138 public static void init() throws OsmTransferException, InterruptedException{
139 logger.info("initializing ...");
140 testProperties = new Properties();
141
142 // load properties
143 //
144 try {
145 testProperties.load(MultiFetchServerObjectReaderTest.class.getResourceAsStream("/test-functional-env.properties"));
146 } catch(Exception e){
147 logger.log(Level.SEVERE, MessageFormat.format("failed to load property file ''{0}''", "test-functional-env.properties"));
148 fail(MessageFormat.format("failed to load property file ''{0}''", "test-functional-env.properties"));
149 }
150
151 // check josm.home
152 //
153 String josmHome = testProperties.getProperty("josm.home");
154 if (josmHome == null) {
155 fail(MessageFormat.format("property ''{0}'' not set in test environment", "josm.home"));
156 } else {
157 File f = new File(josmHome);
158 if (! f.exists() || ! f.canRead()) {
159 fail(MessageFormat.format("property ''{0}'' points to ''{1}'' which is either not existing or not readable", "josm.home", josmHome));
160 }
161 }
162
163 // check temp output dir
164 //
165 String tempOutputDir = testProperties.getProperty("test.functional.tempdir");
166 if (tempOutputDir == null) {
167 fail(MessageFormat.format("property ''{0}'' not set in test environment", "test.functional.tempdir"));
168 } else {
169 File f = new File(tempOutputDir);
170 if (! f.exists() || ! f.isDirectory() || ! f.canWrite()) {
171 fail(MessageFormat.format("property ''{0}'' points to ''{1}'' which is either not existing, not a directory, or not writeable", "test.functional.tempdir", tempOutputDir));
172 }
173 }
174
175
176 // init preferences
177 //
178 System.setProperty("josm.home", josmHome);
179 Main.pleaseWaitDlg = new PleaseWaitDialog(null);
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.version);
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
233 @Before
234 public void setUp() throws IOException, SAXException {
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, Main.pleaseWaitDlg);
240 fis.close();
241 }
242
243 @Test
244 public void testMultiGet10Nodes() throws OsmTransferException {
245 MultiFetchServerObjectReader reader = new MultiFetchServerObjectReader();
246 ArrayList<Node> nodes = new ArrayList<Node>(ds.nodes);
247 for (int i =0; i< 10; i++) {
248 reader.append(nodes.get(i));
249 }
250 DataSet out = reader.parseOsm();
251 assertEquals(10, out.nodes.size());
252 Iterator<Node> it = out.nodes.iterator();
253 while(it.hasNext()) {
254 Node n1 = it.next();
255 Node n2 = (Node)ds.getPrimitiveById(n1.id);
256 assertNotNull(n2);
257 assertEquals(n2.get("name"),n2.get("name"));
258 }
259 assertTrue(reader.getMissingPrimitives().isEmpty());
260 //assertTrue(reader.getSkippedWays().isEmpty());
261 }
262
263 @Test
264 public void testMultiGet10Ways() throws OsmTransferException {
265 MultiFetchServerObjectReader reader = new MultiFetchServerObjectReader();
266 ArrayList<Way> ways= new ArrayList<Way>(ds.ways);
267 for (int i =0; i< 10; i++) {
268 reader.append(ways.get(i));
269 }
270 DataSet out = reader.parseOsm();
271 assertEquals(10, out.ways.size());
272 Iterator<Way> it = out.ways.iterator();
273 while(it.hasNext()) {
274 Way w1 = it.next();
275 Way w2 = (Way)ds.getPrimitiveById(w1.id);
276 assertNotNull(w2);
277 assertEquals(w2.nodes.size(), w1.nodes.size());
278 assertEquals(w2.get("name"),w1.get("name"));
279 }
280 assertTrue(reader.getMissingPrimitives().isEmpty());
281 //assertTrue(reader.getSkippedWays().isEmpty());
282
283 }
284
285 @Test
286 public void testMultiGet10Relations() throws OsmTransferException {
287 MultiFetchServerObjectReader reader = new MultiFetchServerObjectReader();
288 ArrayList<Relation> relations= new ArrayList<Relation>(ds.relations);
289 for (int i =0; i< 10; i++) {
290 reader.append(relations.get(i));
291 }
292 DataSet out = reader.parseOsm();
293 assertEquals(10, out.relations.size());
294 Iterator<Relation> it = out.relations.iterator();
295 while(it.hasNext()) {
296 Relation r1 = it.next();
297 Relation r2 = (Relation)ds.getPrimitiveById(r1.id);
298 assertNotNull(r2);
299 assertEquals(r2.members.size(), r1.members.size());
300 assertEquals(r2.get("name"),r2.get("name"));
301 }
302 assertTrue(reader.getMissingPrimitives().isEmpty());
303 //assertTrue(reader.getSkippedWays().isEmpty());
304
305 }
306
307 @Test
308 public void testMultiGet800Nodes() throws OsmTransferException {
309 MultiFetchServerObjectReader reader = new MultiFetchServerObjectReader();
310 ArrayList<Node> nodes = new ArrayList<Node>(ds.nodes);
311 for (int i =0; i< 812; i++) {
312 reader.append(nodes.get(i));
313 }
314 DataSet out = reader.parseOsm();
315 assertEquals(812, out.nodes.size());
316 Iterator<Node> it = out.nodes.iterator();
317 while(it.hasNext()) {
318 Node n1 = it.next();
319 Node n2 = (Node)ds.getPrimitiveById(n1.id);
320 assertNotNull(n2);
321 assertEquals(n2.get("name"),n2.get("name"));
322 }
323 assertTrue(reader.getMissingPrimitives().isEmpty());
324 //assertTrue(reader.getSkippedWays().isEmpty());
325
326
327 }
328
329 @Test
330 public void multiGetWithNonExistingNode() throws OsmTransferException {
331 MultiFetchServerObjectReader reader = new MultiFetchServerObjectReader();
332 ArrayList<Node> nodes = new ArrayList<Node>(ds.nodes);
333 for (int i =0; i< 10; i++) {
334 reader.append(nodes.get(i));
335 }
336 Node n = new Node(9999999);
337 reader.append(n); // doesn't exist
338 DataSet out = reader.parseOsm();
339 assertEquals(10, out.nodes.size());
340 Iterator<Node> it = out.nodes.iterator();
341 while(it.hasNext()) {
342 Node n1 = it.next();
343 Node n2 = (Node)ds.getPrimitiveById(n1.id);
344 assertNotNull(n2);
345 assertEquals(n2.get("name"),n2.get("name"));
346 }
347 assertFalse(reader.getMissingPrimitives().isEmpty());
348 assertEquals(1, reader.getMissingPrimitives().size());
349 assertEquals(9999999, reader.getMissingPrimitives().iterator().next());
350 //assertTrue(reader.getSkippedWays().isEmpty());
351 }
352}
Note: See TracBrowser for help on using the repository browser.