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

Last change on this file since 2498 was 2498, checked in by jttt, 14 years ago

Removed unnecessary setting of OsmPrimitive.incomplete

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