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

Last change on this file since 7040 was 7040, checked in by Don-vip, 10 years ago

tests/build update:

  • update Jacoco to version 0.7.0
  • compile performance tests even if not run by ant task
  • do not create empty package-info.class files in javac task
  • move RemoteControl test to unit tests to get coverage information
  • fix NPEs seen in tests in headless mode
  • proper test failures when properties files can not be loaded


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