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

Last change on this file since 2199 was 2199, checked in by Gubaer, 16 years ago

Updated test cases

File size: 13.7 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.Changeset;
28import org.openstreetmap.josm.data.osm.DataSet;
29import org.openstreetmap.josm.data.osm.Node;
30import org.openstreetmap.josm.data.osm.OsmPrimitive;
31import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
32import org.openstreetmap.josm.data.osm.Relation;
33import org.openstreetmap.josm.data.osm.RelationMember;
34import org.openstreetmap.josm.data.osm.Way;
35import org.openstreetmap.josm.data.projection.Mercator;
36import org.openstreetmap.josm.gui.progress.NullProgressMonitor;
37import org.xml.sax.SAXException;
38
39public class MultiFetchServerObjectReaderTest {
40 private static Logger logger = Logger.getLogger(MultiFetchServerObjectReader.class.getName());
41
42 /**
43 * builds a large data set to be used later for testing MULTI FETCH on the server
44 *
45 * @return a large data set
46 */
47 protected static DataSet buildTestDataSet() {
48 DataSet ds = new DataSet();
49 ds.version = "0.6";
50
51 int numNodes = 1000;
52 int numWays = 1000;
53 int numRelations = 1000;
54
55 ArrayList<Node> nodes = new ArrayList<Node>();
56 ArrayList<Way> ways = new ArrayList<Way>();
57
58 // create a set of nodes
59 //
60 for (int i=0; i< numNodes; i++) {
61 Node n = new Node(0);
62 n.setCoor(new LatLon(-36.6,47.6));
63 n.put("name", "node-"+i);
64 n.incomplete = false;
65 ds.addPrimitive(n);
66 nodes.add(n);
67 }
68
69 // create a set of ways, each with a random number of
70 // nodes
71 //
72 for (int i=0; i< numWays; i++) {
73 Way w = new Way(0);
74 w.incomplete = false;
75 int numNodesInWay = 2 + (int)Math.round(Math.random() * 5);
76 int start = (int)Math.round(Math.random() * numNodes);
77 for (int j = 0; j < numNodesInWay;j++) {
78 int idx = (start + j) % numNodes;
79 Node n = nodes.get(idx);
80 w.addNode(n);
81 }
82 w.put("name", "way-"+i);
83 ds.addPrimitive(w);
84 ways.add(w);
85 }
86
87 // create a set of relations each with a random number of nodes,
88 // and ways
89 //
90 for (int i=0; i< numRelations; i++) {
91 Relation r = new Relation(0);
92 r.incomplete = false;
93 r.put("name", "relation-" +i);
94 int numNodesInRelation = (int)Math.round(Math.random() * 10);
95 int start = (int)Math.round(Math.random() * numNodes);
96 for (int j = 0; j < numNodesInRelation;j++) {
97 int idx = (start + j) % 500;
98 Node n = nodes.get(idx);
99 r.addMember(new RelationMember("role-" + j, n));
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 r.addMember(new RelationMember("role-" + j, w));
107 }
108 ds.addPrimitive(r);
109 }
110
111 return ds;
112 }
113
114 static public DataSet testDataSet;
115 static public Properties testProperties;
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(testDataSet.nodes);
127 primitives.addAll(testDataSet.ways);
128 primitives.addAll(testDataSet.relations);
129
130 OsmServerWriter writer = new OsmServerWriter();
131 Changeset cs = new Changeset();
132 writer.uploadOsm("0.6", primitives,cs,NullProgressMonitor.INSTANCE);
133 OsmApi.getOsmApi().closeChangeset(cs, NullProgressMonitor.INSTANCE);
134 }
135
136 @BeforeClass
137 public static void init() throws OsmTransferException, InterruptedException{
138 logger.info("initializing ...");
139 testProperties = new Properties();
140
141 // load properties
142 //
143 try {
144 testProperties.load(MultiFetchServerObjectReaderTest.class.getResourceAsStream("/test-functional-env.properties"));
145 } catch(Exception e){
146 logger.log(Level.SEVERE, MessageFormat.format("failed to load property file ''{0}''", "test-functional-env.properties"));
147 fail(MessageFormat.format("failed to load property file ''{0}''", "test-functional-env.properties"));
148 }
149
150 // check josm.home
151 //
152 String josmHome = testProperties.getProperty("josm.home");
153 if (josmHome == null) {
154 fail(MessageFormat.format("property ''{0}'' not set in test environment", "josm.home"));
155 } else {
156 File f = new File(josmHome);
157 if (! f.exists() || ! f.canRead()) {
158 fail(MessageFormat.format("property ''{0}'' points to ''{1}'' which is either not existing or not readable", "josm.home", josmHome));
159 }
160 }
161
162 // check temp output dir
163 //
164 String tempOutputDir = testProperties.getProperty("test.functional.tempdir");
165 if (tempOutputDir == null) {
166 fail(MessageFormat.format("property ''{0}'' not set in test environment", "test.functional.tempdir"));
167 } else {
168 File f = new File(tempOutputDir);
169 if (! f.exists() || ! f.isDirectory() || ! f.canWrite()) {
170 fail(MessageFormat.format("property ''{0}'' points to ''{1}'' which is either not existing, not a directory, or not writeable", "test.functional.tempdir", tempOutputDir));
171 }
172 }
173
174
175 // init preferences
176 //
177 System.setProperty("josm.home", josmHome);
178 Main.pref.init(false);
179 // don't use atomic upload, the test API server can't cope with large diff uploads
180 //
181 Main.pref.put("osm-server.atomic-upload", false);
182 Main.proj = new Mercator();
183
184 File dataSetCacheOutputFile = new File(tempOutputDir, MultiFetchServerObjectReaderTest.class.getName() + ".dataset");
185
186 // make sure we don't upload to production
187 //
188 String url = OsmApi.getOsmApi().getBaseUrl().toLowerCase().trim();
189 if (url.startsWith("http://www.openstreetmap.org")
190 || url.startsWith("http://api.openstreetmap.org")) {
191 fail(MessageFormat.format("configured url ''{0}'' seems to be a productive url, aborting.", url));
192 }
193
194
195 String p = System.getProperties().getProperty("useCachedDataset");
196 if (p != null && Boolean.parseBoolean(p.trim().toLowerCase())) {
197 logger.info(MessageFormat.format("property ''{0}'' set, using cached dataset", "useCachedDataset"));
198 return;
199 }
200
201 logger.info(MessageFormat.format("property ''{0}'' not set to true, creating test dataset on the server. property is ''{1}''", "useCachedDataset", p));
202
203 // build and upload the test data set
204 //
205 logger.info("creating test data set ....");
206 testDataSet = buildTestDataSet();
207 logger.info("uploading test data set ...");
208 createDataSetOnServer(testDataSet);
209
210 PrintWriter pw = null;
211 try {
212 pw = new PrintWriter(
213 new FileWriter(dataSetCacheOutputFile)
214 );
215 } catch(IOException e) {
216 fail(MessageFormat.format("failed to open file ''{0}'' for writing", dataSetCacheOutputFile.toString()));
217 }
218 logger.info(MessageFormat.format("caching test data set in ''{0}'' ...", dataSetCacheOutputFile.toString()));
219 OsmWriter w = new OsmWriter(pw, false, testDataSet.version);
220 w.header();
221 w.writeDataSources(testDataSet);
222 w.writeContent(testDataSet);
223 w.footer();
224 w.close();
225 pw.close();
226 }
227
228 private DataSet ds;
229
230
231 @Before
232 public void setUp() throws IOException, IllegalDataException {
233 File f = new File(testProperties.getProperty("test.functional.tempdir"), MultiFetchServerObjectReaderTest.class.getName() + ".dataset");
234 logger.info(MessageFormat.format("reading cached dataset ''{0}''", f.toString()));
235 ds = new DataSet();
236 FileInputStream fis = new FileInputStream(f);
237 ds = OsmReader.parseDataSet(fis, NullProgressMonitor.INSTANCE);
238 fis.close();
239 }
240
241 @Test
242 public void testMultiGet10Nodes() throws OsmTransferException {
243 MultiFetchServerObjectReader reader = new MultiFetchServerObjectReader();
244 ArrayList<Node> nodes = new ArrayList<Node>(ds.nodes);
245 for (int i =0; i< 10; i++) {
246 reader.append(nodes.get(i));
247 }
248 DataSet out = reader.parseOsm(NullProgressMonitor.INSTANCE);
249 assertEquals(10, out.nodes.size());
250 Iterator<Node> it = out.nodes.iterator();
251 while(it.hasNext()) {
252 Node n1 = it.next();
253 Node n2 = (Node)ds.getPrimitiveById(n1.getId(), OsmPrimitiveType.NODE);
254 assertNotNull(n2);
255 assertEquals(n2.get("name"),n2.get("name"));
256 }
257 assertTrue(reader.getMissingPrimitives().isEmpty());
258 }
259
260 @Test
261 public void testMultiGet10Ways() throws OsmTransferException {
262 MultiFetchServerObjectReader reader = new MultiFetchServerObjectReader();
263 ArrayList<Way> ways= new ArrayList<Way>(ds.ways);
264 for (int i =0; i< 10; i++) {
265 reader.append(ways.get(i));
266 }
267 DataSet out = reader.parseOsm(NullProgressMonitor.INSTANCE);
268 assertEquals(10, out.ways.size());
269 Iterator<Way> it = out.ways.iterator();
270 while(it.hasNext()) {
271 Way w1 = it.next();
272 Way w2 = (Way)ds.getPrimitiveById(w1.getId(), OsmPrimitiveType.WAY);
273 assertNotNull(w2);
274 assertEquals(w2.getNodesCount(), w1.getNodesCount());
275 assertEquals(w2.get("name"),w1.get("name"));
276 }
277 assertTrue(reader.getMissingPrimitives().isEmpty());
278 }
279
280 @Test
281 public void testMultiGet10Relations() throws OsmTransferException {
282 MultiFetchServerObjectReader reader = new MultiFetchServerObjectReader();
283 ArrayList<Relation> relations= new ArrayList<Relation>(ds.relations);
284 for (int i =0; i< 10; i++) {
285 reader.append(relations.get(i));
286 }
287 DataSet out = reader.parseOsm(NullProgressMonitor.INSTANCE);
288 assertEquals(10, out.relations.size());
289 Iterator<Relation> it = out.relations.iterator();
290 while(it.hasNext()) {
291 Relation r1 = it.next();
292 Relation r2 = (Relation)ds.getPrimitiveById(r1.getId(), OsmPrimitiveType.RELATION);
293 assertNotNull(r2);
294 assertEquals(r2.getMembersCount(), r1.getMembersCount());
295 assertEquals(r2.get("name"),r2.get("name"));
296 }
297 assertTrue(reader.getMissingPrimitives().isEmpty());
298 }
299
300 @Test
301 public void testMultiGet800Nodes() throws OsmTransferException {
302 MultiFetchServerObjectReader reader = new MultiFetchServerObjectReader();
303 ArrayList<Node> nodes = new ArrayList<Node>(ds.nodes);
304 for (int i =0; i< 812; i++) {
305 reader.append(nodes.get(i));
306 }
307 DataSet out = reader.parseOsm(NullProgressMonitor.INSTANCE);
308 assertEquals(812, out.nodes.size());
309 Iterator<Node> it = out.nodes.iterator();
310 while(it.hasNext()) {
311 Node n1 = it.next();
312 Node n2 = (Node)ds.getPrimitiveById(n1.getId(), OsmPrimitiveType.NODE);
313 assertNotNull(n2);
314 assertEquals(n2.get("name"),n2.get("name"));
315 }
316 assertTrue(reader.getMissingPrimitives().isEmpty());
317 }
318
319 @Test
320 public void multiGetWithNonExistingNode() throws OsmTransferException {
321 MultiFetchServerObjectReader reader = new MultiFetchServerObjectReader();
322 ArrayList<Node> nodes = new ArrayList<Node>(ds.nodes);
323 for (int i =0; i< 10; i++) {
324 reader.append(nodes.get(i));
325 }
326 Node n = new Node(9999999);
327 reader.append(n); // doesn't exist
328 DataSet out = reader.parseOsm(NullProgressMonitor.INSTANCE);
329 assertEquals(10, out.nodes.size());
330 Iterator<Node> it = out.nodes.iterator();
331 while(it.hasNext()) {
332 Node n1 = it.next();
333 Node n2 = (Node)ds.getPrimitiveById(n1.getId(), OsmPrimitiveType.NODE);
334 assertNotNull(n2);
335 assertEquals(n2.get("name"),n2.get("name"));
336 }
337 assertFalse(reader.getMissingPrimitives().isEmpty());
338 assertEquals(1, reader.getMissingPrimitives().size());
339 assertEquals(9999999, (long)reader.getMissingPrimitives().iterator().next());
340 }
341}
Note: See TracBrowser for help on using the repository browser.