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

Last change on this file since 2396 was 2396, checked in by Gubaer, 14 years ago

Made nodes, ways, and relations in DataSet private. Plugin updates to be checked in shortly.
Also added setter/getter for DataSet version.

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