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

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

fixed #3684: Add "chunked" upload mode
Removed support for API "0.5" when uploading (there are still 0.5-files around, but I'm not aware of any 0.5-servers)

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