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

Last change on this file since 1898 was 1898, checked in by jttt, 15 years ago

Way refactoring - rewritten another parts of code to the new nodes api

File size: 13.5 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.xml.sax.SAXException;
36
37public class MultiFetchServerObjectReaderTest {
38 private static Logger logger = Logger.getLogger(MultiFetchServerObjectReader.class.getName());
39
40 /**
41 * builds a large data set to be used later for testing MULTI FETCH on the server
42 *
43 * @return a large data set
44 */
45 protected static DataSet buildTestDataSet() {
46 DataSet ds = new DataSet();
47 ds.version = "0.6";
48
49 int numNodes = 1000;
50 int numWays = 1000;
51 int numRelations = 1000;
52
53 ArrayList<Node> nodes = new ArrayList<Node>();
54 ArrayList<Way> ways = new ArrayList<Way>();
55
56 // create a set of nodes
57 //
58 for (int i=0; i< numNodes; i++) {
59 Node n = new Node(0);
60 n.setCoor(new LatLon(-36.6,47.6));
61 n.put("name", "node-"+i);
62 n.incomplete = false;
63 ds.addPrimitive(n);
64 nodes.add(n);
65 }
66
67 // create a set of ways, each with a random number of
68 // nodes
69 //
70 for (int i=0; i< numWays; i++) {
71 Way w = new Way(0);
72 w.incomplete = false;
73 int numNodesInWay = 2 + (int)Math.round(Math.random() * 5);
74 int start = (int)Math.round(Math.random() * numNodes);
75 for (int j = 0; j < numNodesInWay;j++) {
76 int idx = (start + j) % numNodes;
77 Node n = nodes.get(idx);
78 w.nodes.add(n);
79 }
80 w.put("name", "way-"+i);
81 ds.addPrimitive(w);
82 ways.add(w);
83 }
84
85 // create a set of relations each with a random number of nodes,
86 // and ways
87 //
88 for (int i=0; i< numRelations; i++) {
89 Relation r = new Relation(0);
90 r.incomplete = false;
91 r.put("name", "relation-" +i);
92 int numNodesInRelation = (int)Math.round(Math.random() * 10);
93 int start = (int)Math.round(Math.random() * numNodes);
94 for (int j = 0; j < numNodesInRelation;j++) {
95 int idx = (start + j) % 500;
96 Node n = nodes.get(idx);
97 RelationMember member = new RelationMember();
98 member.member = n;
99 member.role = "role-" + j;
100 r.members.add(member);
101 }
102 int numWaysInRelation = (int)Math.round(Math.random() * 10);
103 start = (int)Math.round(Math.random() * numWays);
104 for (int j = 0; j < numWaysInRelation;j++) {
105 int idx = (start + j) % 500;
106 Way w = ways.get(idx);
107 RelationMember member = new RelationMember();
108 member.member = w;
109 member.role = "role-" + j;
110 r.members.add(member);
111 }
112 ds.addPrimitive(r);
113 }
114
115 return ds;
116 }
117
118 static public DataSet testDataSet;
119 static public Properties testProperties;
120
121 /**
122 * creates the dataset on the server.
123 *
124 * @param ds the data set
125 * @throws OsmTransferException
126 */
127 static public void createDataSetOnServer(DataSet ds) throws OsmTransferException {
128 logger.info("creating data set on the server ...");
129 ArrayList<OsmPrimitive> primitives = new ArrayList<OsmPrimitive>();
130 primitives.addAll(testDataSet.nodes);
131 primitives.addAll(testDataSet.ways);
132 primitives.addAll(testDataSet.relations);
133
134 OsmServerWriter writer = new OsmServerWriter();
135 writer.uploadOsm("0.6", primitives, NullProgressMonitor.INSTANCE);
136 }
137
138 @BeforeClass
139 public static void init() throws OsmTransferException, InterruptedException{
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.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, NullProgressMonitor.INSTANCE);
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(NullProgressMonitor.INSTANCE);
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 }
261
262 @Test
263 public void testMultiGet10Ways() throws OsmTransferException {
264 MultiFetchServerObjectReader reader = new MultiFetchServerObjectReader();
265 ArrayList<Way> ways= new ArrayList<Way>(ds.ways);
266 for (int i =0; i< 10; i++) {
267 reader.append(ways.get(i));
268 }
269 DataSet out = reader.parseOsm(NullProgressMonitor.INSTANCE);
270 assertEquals(10, out.ways.size());
271 Iterator<Way> it = out.ways.iterator();
272 while(it.hasNext()) {
273 Way w1 = it.next();
274 Way w2 = (Way)ds.getPrimitiveById(w1.id);
275 assertNotNull(w2);
276 assertEquals(w2.getNodesCount(), w1.getNodesCount());
277 assertEquals(w2.get("name"),w1.get("name"));
278 }
279 assertTrue(reader.getMissingPrimitives().isEmpty());
280 }
281
282 @Test
283 public void testMultiGet10Relations() throws OsmTransferException {
284 MultiFetchServerObjectReader reader = new MultiFetchServerObjectReader();
285 ArrayList<Relation> relations= new ArrayList<Relation>(ds.relations);
286 for (int i =0; i< 10; i++) {
287 reader.append(relations.get(i));
288 }
289 DataSet out = reader.parseOsm(NullProgressMonitor.INSTANCE);
290 assertEquals(10, out.relations.size());
291 Iterator<Relation> it = out.relations.iterator();
292 while(it.hasNext()) {
293 Relation r1 = it.next();
294 Relation r2 = (Relation)ds.getPrimitiveById(r1.id);
295 assertNotNull(r2);
296 assertEquals(r2.members.size(), r1.members.size());
297 assertEquals(r2.get("name"),r2.get("name"));
298 }
299 assertTrue(reader.getMissingPrimitives().isEmpty());
300 }
301
302 @Test
303 public void testMultiGet800Nodes() throws OsmTransferException {
304 MultiFetchServerObjectReader reader = new MultiFetchServerObjectReader();
305 ArrayList<Node> nodes = new ArrayList<Node>(ds.nodes);
306 for (int i =0; i< 812; i++) {
307 reader.append(nodes.get(i));
308 }
309 DataSet out = reader.parseOsm(NullProgressMonitor.INSTANCE);
310 assertEquals(812, out.nodes.size());
311 Iterator<Node> it = out.nodes.iterator();
312 while(it.hasNext()) {
313 Node n1 = it.next();
314 Node n2 = (Node)ds.getPrimitiveById(n1.id);
315 assertNotNull(n2);
316 assertEquals(n2.get("name"),n2.get("name"));
317 }
318 assertTrue(reader.getMissingPrimitives().isEmpty());
319 }
320
321 @Test
322 public void multiGetWithNonExistingNode() throws OsmTransferException {
323 MultiFetchServerObjectReader reader = new MultiFetchServerObjectReader();
324 ArrayList<Node> nodes = new ArrayList<Node>(ds.nodes);
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.nodes.size());
332 Iterator<Node> it = out.nodes.iterator();
333 while(it.hasNext()) {
334 Node n1 = it.next();
335 Node n2 = (Node)ds.getPrimitiveById(n1.id);
336 assertNotNull(n2);
337 assertEquals(n2.get("name"),n2.get("name"));
338 }
339 assertFalse(reader.getMissingPrimitives().isEmpty());
340 assertEquals(1, reader.getMissingPrimitives().size());
341 assertEquals(9999999, (long)reader.getMissingPrimitives().iterator().next());
342 }
343}
Note: See TracBrowser for help on using the repository browser.