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

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

add unit test timeout to avoid hanging Jenkins

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