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

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

findbugs - fix/suppress most of warnings reported in unit tests + enable low confidence warnings for core

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