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

Last change on this file since 12850 was 12850, checked in by bastiK, 7 years ago

see #15229 - use Config in functional tests

  • Property svn:eol-style set to native
File size: 12.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;
8
9import java.io.File;
10import java.io.FileInputStream;
11import java.io.FileNotFoundException;
12import java.io.FileOutputStream;
13import java.io.IOException;
14import java.io.OutputStreamWriter;
15import java.io.PrintWriter;
16import java.nio.charset.StandardCharsets;
17import java.security.SecureRandom;
18import java.text.MessageFormat;
19import java.util.ArrayList;
20import java.util.Locale;
21import java.util.Random;
22import java.util.logging.Logger;
23
24import org.junit.Before;
25import org.junit.BeforeClass;
26import org.junit.Rule;
27import org.junit.Test;
28import org.junit.rules.Timeout;
29import org.openstreetmap.josm.JOSMFixture;
30import org.openstreetmap.josm.data.coor.LatLon;
31import org.openstreetmap.josm.data.osm.Changeset;
32import org.openstreetmap.josm.data.osm.DataSet;
33import org.openstreetmap.josm.data.osm.Node;
34import org.openstreetmap.josm.data.osm.OsmPrimitive;
35import org.openstreetmap.josm.data.osm.Relation;
36import org.openstreetmap.josm.data.osm.RelationMember;
37import org.openstreetmap.josm.data.osm.Way;
38import org.openstreetmap.josm.gui.progress.NullProgressMonitor;
39import org.openstreetmap.josm.spi.preferences.Config;
40
41import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
42
43/**
44 * Unit tests of {@link MultiFetchServerObjectReader}.
45 */
46@SuppressFBWarnings(value = "CRLF_INJECTION_LOGS")
47public class MultiFetchServerObjectReaderTest {
48 private static Logger logger = Logger.getLogger(MultiFetchServerObjectReader.class.getName());
49
50 /**
51 * Global timeout applied to all test methods.
52 */
53 @Rule
54 public Timeout globalTimeout = Timeout.seconds(60);
55
56 /**
57 * builds a large data set to be used later for testing MULTI FETCH on the server
58 *
59 * @return a large data set
60 */
61 protected static DataSet buildTestDataSet() {
62 DataSet ds = new DataSet();
63 ds.setVersion("0.6");
64 Random rand = new SecureRandom();
65
66 int numNodes = 1000;
67 int numWays = 1000;
68 int numRelations = 1000;
69
70 ArrayList<Node> nodes = new ArrayList<>();
71 ArrayList<Way> ways = new ArrayList<>();
72
73 // create a set of nodes
74 //
75 for (int i = 0; i < numNodes; i++) {
76 Node n = new Node();
77 n.setCoor(new LatLon(-36.6, 47.6));
78 n.put("name", "node-"+i);
79 ds.addPrimitive(n);
80 nodes.add(n);
81 }
82
83 // create a set of ways, each with a random number of nodes
84 //
85 for (int i = 0; i < numWays; i++) {
86 Way w = new Way();
87 int numNodesInWay = 2 + (int) Math.round(rand.nextDouble() * 5);
88 int start = (int) Math.round(rand.nextDouble() * numNodes);
89 for (int j = 0; j < numNodesInWay; j++) {
90 int idx = (start + j) % numNodes;
91 Node n = nodes.get(idx);
92 w.addNode(n);
93 }
94 w.put("name", "way-"+i);
95 ds.addPrimitive(w);
96 ways.add(w);
97 }
98
99 // create a set of relations each with a random number of nodes, and ways
100 //
101 for (int i = 0; i < numRelations; i++) {
102 Relation r = new Relation();
103 r.put("name", "relation-" +i);
104 int numNodesInRelation = (int) Math.round(rand.nextDouble() * 10);
105 int start = (int) Math.round(rand.nextDouble() * numNodes);
106 for (int j = 0; j < numNodesInRelation; j++) {
107 int idx = (start + j) % 500;
108 Node n = nodes.get(idx);
109 r.addMember(new RelationMember("role-" + j, n));
110 }
111 int numWaysInRelation = (int) Math.round(rand.nextDouble() * 10);
112 start = (int) Math.round(rand.nextDouble() * numWays);
113 for (int j = 0; j < numWaysInRelation; j++) {
114 int idx = (start + j) % 500;
115 Way w = ways.get(idx);
116 r.addMember(new RelationMember("role-" + j, w));
117 }
118 ds.addPrimitive(r);
119 }
120
121 return ds;
122 }
123
124 private static DataSet testDataSet;
125
126 /**
127 * creates the dataset on the server.
128 *
129 * @param ds the data set
130 * @throws OsmTransferException if something goes wrong
131 */
132 public static void createDataSetOnServer(DataSet ds) throws OsmTransferException {
133 logger.info("creating data set on the server ...");
134 ArrayList<OsmPrimitive> primitives = new ArrayList<>();
135 primitives.addAll(testDataSet.getNodes());
136 primitives.addAll(testDataSet.getWays());
137 primitives.addAll(testDataSet.getRelations());
138
139 OsmServerWriter writer = new OsmServerWriter();
140 Changeset cs = new Changeset();
141 writer.uploadOsm(new UploadStrategySpecification().setStrategy(UploadStrategy.SINGLE_REQUEST_STRATEGY),
142 primitives, cs, NullProgressMonitor.INSTANCE);
143 OsmApi.getOsmApi().closeChangeset(cs, NullProgressMonitor.INSTANCE);
144 }
145
146 /**
147 * Setup test.
148 * @throws Exception if an error occurs
149 */
150 @BeforeClass
151 public static void init() throws Exception {
152 logger.info("initializing ...");
153 JOSMFixture.createFunctionalTestFixture().init();
154
155 Config.getPref().put("osm-server.auth-method", "basic");
156
157 // don't use atomic upload, the test API server can't cope with large diff uploads
158 Config.getPref().putBoolean("osm-server.atomic-upload", false);
159
160 File dataSetCacheOutputFile = new File(System.getProperty("java.io.tmpdir"),
161 MultiFetchServerObjectReaderTest.class.getName() + ".dataset");
162
163 String p = System.getProperties().getProperty("useCachedDataset");
164 if (p != null && Boolean.parseBoolean(p.trim().toLowerCase(Locale.ENGLISH))) {
165 logger.info(MessageFormat.format("property ''{0}'' set, using cached dataset", "useCachedDataset"));
166 return;
167 }
168
169 logger.info(MessageFormat.format(
170 "property ''{0}'' not set to true, creating test dataset on the server. property is ''{1}''", "useCachedDataset", p));
171
172 // build and upload the test data set
173 logger.info("creating test data set ....");
174 testDataSet = buildTestDataSet();
175 logger.info("uploading test data set ...");
176 createDataSetOnServer(testDataSet);
177
178 try (
179 PrintWriter pw = new PrintWriter(
180 new OutputStreamWriter(new FileOutputStream(dataSetCacheOutputFile), StandardCharsets.UTF_8)
181 )) {
182 logger.info(MessageFormat.format("caching test data set in ''{0}'' ...", dataSetCacheOutputFile.toString()));
183 try (OsmWriter w = new OsmWriter(pw, false, testDataSet.getVersion())) {
184 w.header();
185 w.writeDataSources(testDataSet);
186 w.writeContent(testDataSet);
187 w.footer();
188 }
189 }
190 }
191
192 private DataSet ds;
193
194 /**
195 * Setup test.
196 * @throws IOException if any I/O error occurs
197 * @throws IllegalDataException if an error was found while parsing the OSM data
198 * @throws FileNotFoundException if the dataset file cannot be found
199 */
200 @Before
201 public void setUp() throws IOException, IllegalDataException, FileNotFoundException {
202 File f = new File(System.getProperty("java.io.tmpdir"), MultiFetchServerObjectReaderTest.class.getName() + ".dataset");
203 logger.info(MessageFormat.format("reading cached dataset ''{0}''", f.toString()));
204 ds = new DataSet();
205 try (FileInputStream fis = new FileInputStream(f)) {
206 ds = OsmReader.parseDataSet(fis, NullProgressMonitor.INSTANCE);
207 }
208 }
209
210 /**
211 * Test to multi-get 10 nodes.
212 * @throws OsmTransferException if an error occurs
213 */
214 @Test
215 public void testMultiGet10Nodes() throws OsmTransferException {
216 MultiFetchServerObjectReader reader = new MultiFetchServerObjectReader();
217 ArrayList<Node> nodes = new ArrayList<>(ds.getNodes());
218 for (int i = 0; i < 10; i++) {
219 reader.append(nodes.get(i));
220 }
221 DataSet out = reader.parseOsm(NullProgressMonitor.INSTANCE);
222 assertEquals(10, out.getNodes().size());
223 for (Node n1:out.getNodes()) {
224 Node n2 = (Node) ds.getPrimitiveById(n1);
225 assertNotNull(n2);
226 assertEquals(n2.get("name"), n2.get("name"));
227 }
228 assertTrue(reader.getMissingPrimitives().isEmpty());
229 }
230
231 /**
232 * Test to multi-get 10 ways.
233 * @throws OsmTransferException if an error occurs
234 */
235 @Test
236 public void testMultiGet10Ways() throws OsmTransferException {
237 MultiFetchServerObjectReader reader = new MultiFetchServerObjectReader();
238 ArrayList<Way> ways = new ArrayList<>(ds.getWays());
239 for (int i = 0; i < 10; i++) {
240 reader.append(ways.get(i));
241 }
242 DataSet out = reader.parseOsm(NullProgressMonitor.INSTANCE);
243 assertEquals(10, out.getWays().size());
244 for (Way w1: out.getWays()) {
245 Way w2 = (Way) ds.getPrimitiveById(w1);
246 assertNotNull(w2);
247 assertEquals(w2.getNodesCount(), w1.getNodesCount());
248 assertEquals(w2.get("name"), w1.get("name"));
249 }
250 assertTrue(reader.getMissingPrimitives().isEmpty());
251 }
252
253 /**
254 * Test to multi-get 10 relations.
255 * @throws OsmTransferException if an error occurs
256 */
257 @Test
258 public void testMultiGet10Relations() throws OsmTransferException {
259 MultiFetchServerObjectReader reader = new MultiFetchServerObjectReader();
260 ArrayList<Relation> relations = new ArrayList<>(ds.getRelations());
261 for (int i = 0; i < 10; i++) {
262 reader.append(relations.get(i));
263 }
264 DataSet out = reader.parseOsm(NullProgressMonitor.INSTANCE);
265 assertEquals(10, out.getRelations().size());
266 for (Relation r1: out.getRelations()) {
267 Relation r2 = (Relation) ds.getPrimitiveById(r1);
268 assertNotNull(r2);
269 assertEquals(r2.getMembersCount(), r1.getMembersCount());
270 assertEquals(r2.get("name"), r2.get("name"));
271 }
272 assertTrue(reader.getMissingPrimitives().isEmpty());
273 }
274
275 /**
276 * Test to multi-get 800 nodes.
277 * @throws OsmTransferException if an error occurs
278 */
279 @Test
280 public void testMultiGet800Nodes() throws OsmTransferException {
281 MultiFetchServerObjectReader reader = new MultiFetchServerObjectReader();
282 ArrayList<Node> nodes = new ArrayList<>(ds.getNodes());
283 for (int i = 0; i < 812; i++) {
284 reader.append(nodes.get(i));
285 }
286 DataSet out = reader.parseOsm(NullProgressMonitor.INSTANCE);
287 assertEquals(812, out.getNodes().size());
288 for (Node n1:out.getNodes()) {
289 Node n2 = (Node) ds.getPrimitiveById(n1);
290 assertNotNull(n2);
291 assertEquals(n2.get("name"), n2.get("name"));
292 }
293 assertTrue(reader.getMissingPrimitives().isEmpty());
294 }
295
296 /**
297 * Test to multi-get non-existing node.
298 * @throws OsmTransferException if an error occurs
299 */
300 @Test
301 public void testMultiGetWithNonExistingNode() throws OsmTransferException {
302 MultiFetchServerObjectReader reader = new MultiFetchServerObjectReader();
303 ArrayList<Node> nodes = new ArrayList<>(ds.getNodes());
304 for (int i = 0; i < 10; i++) {
305 reader.append(nodes.get(i));
306 }
307 Node n = new Node(9999999);
308 reader.append(n); // doesn't exist
309 DataSet out = reader.parseOsm(NullProgressMonitor.INSTANCE);
310 assertEquals(10, out.getNodes().size());
311 for (Node n1:out.getNodes()) {
312 Node n2 = (Node) ds.getPrimitiveById(n1);
313 assertNotNull(n2);
314 assertEquals(n2.get("name"), n2.get("name"));
315 }
316 assertFalse(reader.getMissingPrimitives().isEmpty());
317 assertEquals(1, reader.getMissingPrimitives().size());
318 assertEquals(9999999, reader.getMissingPrimitives().iterator().next().getUniqueId());
319 }
320}
Note: See TracBrowser for help on using the repository browser.