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

Last change on this file since 1814 was 1814, checked in by Gubaer, 15 years ago

removed dependencies to Main.ds, removed Main.ds
removed AddVisitor, NameVisitor, DeleteVisitor - unnecessary double dispatching for these simple cases

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.assertFalse;
6import static org.junit.Assert.assertNotNull;
7import static org.junit.Assert.assertTrue;
8import static org.junit.Assert.fail;
9
10import java.io.File;
11import java.io.FileInputStream;
12import java.io.FileWriter;
13import java.io.IOException;
14import java.io.PrintWriter;
15import java.text.MessageFormat;
16import java.util.ArrayList;
17import java.util.Iterator;
18import java.util.Properties;
19import java.util.logging.Level;
20import java.util.logging.Logger;
21
22import org.junit.Before;
23import org.junit.BeforeClass;
24import org.junit.Test;
25import org.openstreetmap.josm.Main;
26import org.openstreetmap.josm.data.coor.LatLon;
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.Relation;
31import org.openstreetmap.josm.data.osm.RelationMember;
32import org.openstreetmap.josm.data.osm.Way;
33import org.openstreetmap.josm.data.projection.Mercator;
34import org.openstreetmap.josm.gui.progress.NullProgressMonitor;
35import org.openstreetmap.josm.gui.progress.PleaseWaitProgressMonitor;
36import org.xml.sax.SAXException;
37
38public class MultiFetchServerObjectReaderTest {
39 private static Logger logger = Logger.getLogger(MultiFetchServerObjectReader.class.getName());
40
41 /**
42 * builds a large data set to be used later for testing MULTI FETCH on the server
43 *
44 * @return a large data set
45 */
46 protected static DataSet buildTestDataSet() {
47 DataSet ds = new DataSet();
48 ds.version = "0.6";
49
50 int numNodes = 1000;
51 int numWays = 1000;
52 int numRelations = 1000;
53
54 ArrayList<Node> nodes = new ArrayList<Node>();
55 ArrayList<Way> ways = new ArrayList<Way>();
56
57 // create a set of nodes
58 //
59 for (int i=0; i< numNodes; i++) {
60 Node n = new Node(0);
61 n.setCoor(new LatLon(-36.6,47.6));
62 n.put("name", "node-"+i);
63 n.incomplete = false;
64 ds.addPrimitive(n);
65 nodes.add(n);
66 }
67
68 // create a set of ways, each with a random number of
69 // nodes
70 //
71 for (int i=0; i< numWays; i++) {
72 Way w = new Way(0);
73 w.incomplete = false;
74 int numNodesInWay = 2 + (int)Math.round(Math.random() * 5);
75 int start = (int)Math.round(Math.random() * numNodes);
76 for (int j = 0; j < numNodesInWay;j++) {
77 int idx = (start + j) % numNodes;
78 Node n = nodes.get(idx);
79 w.nodes.add(n);
80 }
81 w.put("name", "way-"+i);
82 ds.addPrimitive(w);
83 ways.add(w);
84 }
85
86 // create a set of relations each with a random number of nodes,
87 // and ways
88 //
89 for (int i=0; i< numRelations; i++) {
90 Relation r = new Relation(0);
91 r.incomplete = false;
92 r.put("name", "relation-" +i);
93 int numNodesInRelation = (int)Math.round(Math.random() * 10);
94 int start = (int)Math.round(Math.random() * numNodes);
95 for (int j = 0; j < numNodesInRelation;j++) {
96 int idx = (start + j) % 500;
97 Node n = nodes.get(idx);
98 RelationMember member = new RelationMember();
99 member.member = n;
100 member.role = "role-" + j;
101 r.members.add(member);
102 }
103 int numWaysInRelation = (int)Math.round(Math.random() * 10);
104 start = (int)Math.round(Math.random() * numWays);
105 for (int j = 0; j < numWaysInRelation;j++) {
106 int idx = (start + j) % 500;
107 Way w = ways.get(idx);
108 RelationMember member = new RelationMember();
109 member.member = w;
110 member.role = "role-" + j;
111 r.members.add(member);
112 }
113 ds.addPrimitive(r);
114 }
115
116 return ds;
117 }
118
119 static public DataSet testDataSet;
120 static public Properties testProperties;
121
122 /**
123 * creates the dataset on the server.
124 *
125 * @param ds the data set
126 * @throws OsmTransferException
127 */
128 static public void createDataSetOnServer(DataSet ds) throws OsmTransferException {
129 logger.info("creating data set on the server ...");
130 ArrayList<OsmPrimitive> primitives = new ArrayList<OsmPrimitive>();
131 primitives.addAll(testDataSet.nodes);
132 primitives.addAll(testDataSet.ways);
133 primitives.addAll(testDataSet.relations);
134
135 OsmServerWriter writer = new OsmServerWriter();
136 writer.uploadOsm("0.6", primitives, NullProgressMonitor.INSTANCE);
137 }
138
139 @BeforeClass
140 public static void init() throws OsmTransferException, InterruptedException{
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.version);
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
234 @Before
235 public void setUp() throws IOException, SAXException {
236 File f = new File(testProperties.getProperty("test.functional.tempdir"), MultiFetchServerObjectReaderTest.class.getName() + ".dataset");
237 logger.info(MessageFormat.format("reading cached dataset ''{0}''", f.toString()));
238 ds = new DataSet();
239 FileInputStream fis = new FileInputStream(f);
240 ds = OsmReader.parseDataSet(fis, NullProgressMonitor.INSTANCE);
241 fis.close();
242 }
243
244 @Test
245 public void testMultiGet10Nodes() throws OsmTransferException {
246 MultiFetchServerObjectReader reader = new MultiFetchServerObjectReader();
247 ArrayList<Node> nodes = new ArrayList<Node>(ds.nodes);
248 for (int i =0; i< 10; i++) {
249 reader.append(nodes.get(i));
250 }
251 DataSet out = reader.parseOsm(NullProgressMonitor.INSTANCE);
252 assertEquals(10, out.nodes.size());
253 Iterator<Node> it = out.nodes.iterator();
254 while(it.hasNext()) {
255 Node n1 = it.next();
256 Node n2 = (Node)ds.getPrimitiveById(n1.id);
257 assertNotNull(n2);
258 assertEquals(n2.get("name"),n2.get("name"));
259 }
260 assertTrue(reader.getMissingPrimitives().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(NullProgressMonitor.INSTANCE);
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 }
282
283 @Test
284 public void testMultiGet10Relations() throws OsmTransferException {
285 MultiFetchServerObjectReader reader = new MultiFetchServerObjectReader();
286 ArrayList<Relation> relations= new ArrayList<Relation>(ds.relations);
287 for (int i =0; i< 10; i++) {
288 reader.append(relations.get(i));
289 }
290 DataSet out = reader.parseOsm(NullProgressMonitor.INSTANCE);
291 assertEquals(10, out.relations.size());
292 Iterator<Relation> it = out.relations.iterator();
293 while(it.hasNext()) {
294 Relation r1 = it.next();
295 Relation r2 = (Relation)ds.getPrimitiveById(r1.id);
296 assertNotNull(r2);
297 assertEquals(r2.members.size(), r1.members.size());
298 assertEquals(r2.get("name"),r2.get("name"));
299 }
300 assertTrue(reader.getMissingPrimitives().isEmpty());
301 }
302
303 @Test
304 public void testMultiGet800Nodes() throws OsmTransferException {
305 MultiFetchServerObjectReader reader = new MultiFetchServerObjectReader();
306 ArrayList<Node> nodes = new ArrayList<Node>(ds.nodes);
307 for (int i =0; i< 812; i++) {
308 reader.append(nodes.get(i));
309 }
310 DataSet out = reader.parseOsm(NullProgressMonitor.INSTANCE);
311 assertEquals(812, out.nodes.size());
312 Iterator<Node> it = out.nodes.iterator();
313 while(it.hasNext()) {
314 Node n1 = it.next();
315 Node n2 = (Node)ds.getPrimitiveById(n1.id);
316 assertNotNull(n2);
317 assertEquals(n2.get("name"),n2.get("name"));
318 }
319 assertTrue(reader.getMissingPrimitives().isEmpty());
320 }
321
322 @Test
323 public void multiGetWithNonExistingNode() throws OsmTransferException {
324 MultiFetchServerObjectReader reader = new MultiFetchServerObjectReader();
325 ArrayList<Node> nodes = new ArrayList<Node>(ds.nodes);
326 for (int i =0; i< 10; i++) {
327 reader.append(nodes.get(i));
328 }
329 Node n = new Node(9999999);
330 reader.append(n); // doesn't exist
331 DataSet out = reader.parseOsm(NullProgressMonitor.INSTANCE);
332 assertEquals(10, out.nodes.size());
333 Iterator<Node> it = out.nodes.iterator();
334 while(it.hasNext()) {
335 Node n1 = it.next();
336 Node n2 = (Node)ds.getPrimitiveById(n1.id);
337 assertNotNull(n2);
338 assertEquals(n2.get("name"),n2.get("name"));
339 }
340 assertFalse(reader.getMissingPrimitives().isEmpty());
341 assertEquals(1, reader.getMissingPrimitives().size());
342 assertEquals(9999999, reader.getMissingPrimitives().iterator().next());
343 }
344}
Note: See TracBrowser for help on using the repository browser.