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

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

Replace Dataset.nodes with getNodes(), etc

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.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.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.version);
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.