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

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

javadoc fixes

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