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

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

Make parameterless RelationMember constructor deprecated

File size: 13.3 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.addNode(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 r.members.add(new RelationMember("role-" + j, n));
98 }
99 int numWaysInRelation = (int)Math.round(Math.random() * 10);
100 start = (int)Math.round(Math.random() * numWays);
101 for (int j = 0; j < numWaysInRelation;j++) {
102 int idx = (start + j) % 500;
103 Way w = ways.get(idx);
104 r.members.add(new RelationMember("role-" + j, w));
105 }
106 ds.addPrimitive(r);
107 }
108
109 return ds;
110 }
111
112 static public DataSet testDataSet;
113 static public Properties testProperties;
114
115 /**
116 * creates the dataset on the server.
117 *
118 * @param ds the data set
119 * @throws OsmTransferException
120 */
121 static public void createDataSetOnServer(DataSet ds) throws OsmTransferException {
122 logger.info("creating data set on the server ...");
123 ArrayList<OsmPrimitive> primitives = new ArrayList<OsmPrimitive>();
124 primitives.addAll(testDataSet.nodes);
125 primitives.addAll(testDataSet.ways);
126 primitives.addAll(testDataSet.relations);
127
128 OsmServerWriter writer = new OsmServerWriter();
129 writer.uploadOsm("0.6", primitives, NullProgressMonitor.INSTANCE);
130 }
131
132 @BeforeClass
133 public static void init() throws OsmTransferException, InterruptedException{
134 logger.info("initializing ...");
135 testProperties = new Properties();
136
137 // load properties
138 //
139 try {
140 testProperties.load(MultiFetchServerObjectReaderTest.class.getResourceAsStream("/test-functional-env.properties"));
141 } catch(Exception e){
142 logger.log(Level.SEVERE, MessageFormat.format("failed to load property file ''{0}''", "test-functional-env.properties"));
143 fail(MessageFormat.format("failed to load property file ''{0}''", "test-functional-env.properties"));
144 }
145
146 // check josm.home
147 //
148 String josmHome = testProperties.getProperty("josm.home");
149 if (josmHome == null) {
150 fail(MessageFormat.format("property ''{0}'' not set in test environment", "josm.home"));
151 } else {
152 File f = new File(josmHome);
153 if (! f.exists() || ! f.canRead()) {
154 fail(MessageFormat.format("property ''{0}'' points to ''{1}'' which is either not existing or not readable", "josm.home", josmHome));
155 }
156 }
157
158 // check temp output dir
159 //
160 String tempOutputDir = testProperties.getProperty("test.functional.tempdir");
161 if (tempOutputDir == null) {
162 fail(MessageFormat.format("property ''{0}'' not set in test environment", "test.functional.tempdir"));
163 } else {
164 File f = new File(tempOutputDir);
165 if (! f.exists() || ! f.isDirectory() || ! f.canWrite()) {
166 fail(MessageFormat.format("property ''{0}'' points to ''{1}'' which is either not existing, not a directory, or not writeable", "test.functional.tempdir", tempOutputDir));
167 }
168 }
169
170
171 // init preferences
172 //
173 System.setProperty("josm.home", josmHome);
174 Main.pref.init(false);
175 // don't use atomic upload, the test API server can't cope with large diff uploads
176 //
177 Main.pref.put("osm-server.atomic-upload", false);
178 Main.proj = new Mercator();
179
180 File dataSetCacheOutputFile = new File(tempOutputDir, MultiFetchServerObjectReaderTest.class.getName() + ".dataset");
181
182 // make sure we don't upload to production
183 //
184 String url = OsmApi.getOsmApi().getBaseUrl().toLowerCase().trim();
185 if (url.startsWith("http://www.openstreetmap.org")
186 || url.startsWith("http://api.openstreetmap.org")) {
187 fail(MessageFormat.format("configured url ''{0}'' seems to be a productive url, aborting.", url));
188 }
189
190
191 String p = System.getProperties().getProperty("useCachedDataset");
192 if (p != null && Boolean.parseBoolean(p.trim().toLowerCase())) {
193 logger.info(MessageFormat.format("property ''{0}'' set, using cached dataset", "useCachedDataset"));
194 return;
195 }
196
197 logger.info(MessageFormat.format("property ''{0}'' not set to true, creating test dataset on the server. property is ''{1}''", "useCachedDataset", p));
198
199 // build and upload the test data set
200 //
201 logger.info("creating test data set ....");
202 testDataSet = buildTestDataSet();
203 logger.info("uploading test data set ...");
204 createDataSetOnServer(testDataSet);
205
206 PrintWriter pw = null;
207 try {
208 pw = new PrintWriter(
209 new FileWriter(dataSetCacheOutputFile)
210 );
211 } catch(IOException e) {
212 fail(MessageFormat.format("failed to open file ''{0}'' for writing", dataSetCacheOutputFile.toString()));
213 }
214 logger.info(MessageFormat.format("caching test data set in ''{0}'' ...", dataSetCacheOutputFile.toString()));
215 OsmWriter w = new OsmWriter(pw, false, testDataSet.version);
216 w.header();
217 w.writeDataSources(testDataSet);
218 w.writeContent(testDataSet);
219 w.footer();
220 w.close();
221 pw.close();
222 }
223
224 private DataSet ds;
225
226
227 @Before
228 public void setUp() throws IOException, SAXException {
229 File f = new File(testProperties.getProperty("test.functional.tempdir"), MultiFetchServerObjectReaderTest.class.getName() + ".dataset");
230 logger.info(MessageFormat.format("reading cached dataset ''{0}''", f.toString()));
231 ds = new DataSet();
232 FileInputStream fis = new FileInputStream(f);
233 ds = OsmReader.parseDataSet(fis, NullProgressMonitor.INSTANCE);
234 fis.close();
235 }
236
237 @Test
238 public void testMultiGet10Nodes() throws OsmTransferException {
239 MultiFetchServerObjectReader reader = new MultiFetchServerObjectReader();
240 ArrayList<Node> nodes = new ArrayList<Node>(ds.nodes);
241 for (int i =0; i< 10; i++) {
242 reader.append(nodes.get(i));
243 }
244 DataSet out = reader.parseOsm(NullProgressMonitor.INSTANCE);
245 assertEquals(10, out.nodes.size());
246 Iterator<Node> it = out.nodes.iterator();
247 while(it.hasNext()) {
248 Node n1 = it.next();
249 Node n2 = (Node)ds.getPrimitiveById(n1.id);
250 assertNotNull(n2);
251 assertEquals(n2.get("name"),n2.get("name"));
252 }
253 assertTrue(reader.getMissingPrimitives().isEmpty());
254 }
255
256 @Test
257 public void testMultiGet10Ways() throws OsmTransferException {
258 MultiFetchServerObjectReader reader = new MultiFetchServerObjectReader();
259 ArrayList<Way> ways= new ArrayList<Way>(ds.ways);
260 for (int i =0; i< 10; i++) {
261 reader.append(ways.get(i));
262 }
263 DataSet out = reader.parseOsm(NullProgressMonitor.INSTANCE);
264 assertEquals(10, out.ways.size());
265 Iterator<Way> it = out.ways.iterator();
266 while(it.hasNext()) {
267 Way w1 = it.next();
268 Way w2 = (Way)ds.getPrimitiveById(w1.id);
269 assertNotNull(w2);
270 assertEquals(w2.getNodesCount(), w1.getNodesCount());
271 assertEquals(w2.get("name"),w1.get("name"));
272 }
273 assertTrue(reader.getMissingPrimitives().isEmpty());
274 }
275
276 @Test
277 public void testMultiGet10Relations() throws OsmTransferException {
278 MultiFetchServerObjectReader reader = new MultiFetchServerObjectReader();
279 ArrayList<Relation> relations= new ArrayList<Relation>(ds.relations);
280 for (int i =0; i< 10; i++) {
281 reader.append(relations.get(i));
282 }
283 DataSet out = reader.parseOsm(NullProgressMonitor.INSTANCE);
284 assertEquals(10, out.relations.size());
285 Iterator<Relation> it = out.relations.iterator();
286 while(it.hasNext()) {
287 Relation r1 = it.next();
288 Relation r2 = (Relation)ds.getPrimitiveById(r1.id);
289 assertNotNull(r2);
290 assertEquals(r2.members.size(), r1.members.size());
291 assertEquals(r2.get("name"),r2.get("name"));
292 }
293 assertTrue(reader.getMissingPrimitives().isEmpty());
294 }
295
296 @Test
297 public void testMultiGet800Nodes() throws OsmTransferException {
298 MultiFetchServerObjectReader reader = new MultiFetchServerObjectReader();
299 ArrayList<Node> nodes = new ArrayList<Node>(ds.nodes);
300 for (int i =0; i< 812; i++) {
301 reader.append(nodes.get(i));
302 }
303 DataSet out = reader.parseOsm(NullProgressMonitor.INSTANCE);
304 assertEquals(812, out.nodes.size());
305 Iterator<Node> it = out.nodes.iterator();
306 while(it.hasNext()) {
307 Node n1 = it.next();
308 Node n2 = (Node)ds.getPrimitiveById(n1.id);
309 assertNotNull(n2);
310 assertEquals(n2.get("name"),n2.get("name"));
311 }
312 assertTrue(reader.getMissingPrimitives().isEmpty());
313 }
314
315 @Test
316 public void multiGetWithNonExistingNode() throws OsmTransferException {
317 MultiFetchServerObjectReader reader = new MultiFetchServerObjectReader();
318 ArrayList<Node> nodes = new ArrayList<Node>(ds.nodes);
319 for (int i =0; i< 10; i++) {
320 reader.append(nodes.get(i));
321 }
322 Node n = new Node(9999999);
323 reader.append(n); // doesn't exist
324 DataSet out = reader.parseOsm(NullProgressMonitor.INSTANCE);
325 assertEquals(10, out.nodes.size());
326 Iterator<Node> it = out.nodes.iterator();
327 while(it.hasNext()) {
328 Node n1 = it.next();
329 Node n2 = (Node)ds.getPrimitiveById(n1.id);
330 assertNotNull(n2);
331 assertEquals(n2.get("name"),n2.get("name"));
332 }
333 assertFalse(reader.getMissingPrimitives().isEmpty());
334 assertEquals(1, reader.getMissingPrimitives().size());
335 assertEquals(9999999, (long)reader.getMissingPrimitives().iterator().next());
336 }
337}
Note: See TracBrowser for help on using the repository browser.