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

Last change on this file since 7937 was 7937, checked in by bastiK, 9 years ago

add subversion property svn:eol=native

  • Property svn:eol-style set to native
File size: 10.8 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.OutputStreamWriter;
15import java.io.PrintWriter;
16import java.nio.charset.StandardCharsets;
17import java.text.MessageFormat;
18import java.util.ArrayList;
19import java.util.logging.Logger;
20
21import org.junit.Before;
22import org.junit.BeforeClass;
23import org.junit.Test;
24import org.openstreetmap.josm.JOSMFixture;
25import org.openstreetmap.josm.Main;
26import org.openstreetmap.josm.data.coor.LatLon;
27import org.openstreetmap.josm.data.osm.Changeset;
28import org.openstreetmap.josm.data.osm.DataSet;
29import org.openstreetmap.josm.data.osm.Node;
30import org.openstreetmap.josm.data.osm.OsmPrimitive;
31import org.openstreetmap.josm.data.osm.Relation;
32import org.openstreetmap.josm.data.osm.RelationMember;
33import org.openstreetmap.josm.data.osm.Way;
34import org.openstreetmap.josm.gui.io.UploadStrategy;
35import org.openstreetmap.josm.gui.io.UploadStrategySpecification;
36import org.openstreetmap.josm.gui.progress.NullProgressMonitor;
37
38public class MultiFetchServerObjectReaderTest {
39 private static Logger logger = Logger.getLogger(MultiFetchServerObjectReader.class.getName());
40
41 /**
42 * builds a large data set to be used later for testing MULTI FETCH on the server
43 *
44 * @return a large data set
45 */
46 protected static DataSet buildTestDataSet() {
47 DataSet ds = new DataSet();
48 ds.setVersion("0.6");
49
50 int numNodes = 1000;
51 int numWays = 1000;
52 int numRelations = 1000;
53
54 ArrayList<Node> nodes = new ArrayList<>();
55 ArrayList<Way> ways = new ArrayList<>();
56
57 // create a set of nodes
58 //
59 for (int i=0; i< numNodes; i++) {
60 Node n = new Node();
61 n.setCoor(new LatLon(-36.6,47.6));
62 n.put("name", "node-"+i);
63 ds.addPrimitive(n);
64 nodes.add(n);
65 }
66
67 // create a set of ways, each with a random number of
68 // 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,
85 // and ways
86 //
87 for (int i=0; i< numRelations; i++) {
88 Relation r = new Relation();
89 r.put("name", "relation-" +i);
90 int numNodesInRelation = (int)Math.round(Math.random() * 10);
91 int start = (int)Math.round(Math.random() * numNodes);
92 for (int j = 0; j < numNodesInRelation;j++) {
93 int idx = (start + j) % 500;
94 Node n = nodes.get(idx);
95 r.addMember(new RelationMember("role-" + j, n));
96 }
97 int numWaysInRelation = (int)Math.round(Math.random() * 10);
98 start = (int)Math.round(Math.random() * numWays);
99 for (int j = 0; j < numWaysInRelation;j++) {
100 int idx = (start + j) % 500;
101 Way w = ways.get(idx);
102 r.addMember(new RelationMember("role-" + j, w));
103 }
104 ds.addPrimitive(r);
105 }
106
107 return ds;
108 }
109
110 private static DataSet testDataSet;
111
112 /**
113 * creates the dataset on the server.
114 *
115 * @param ds the data set
116 * @throws OsmTransferException
117 */
118 public static void createDataSetOnServer(DataSet ds) throws OsmTransferException {
119 logger.info("creating data set on the server ...");
120 ArrayList<OsmPrimitive> primitives = new ArrayList<>();
121 primitives.addAll(testDataSet.getNodes());
122 primitives.addAll(testDataSet.getWays());
123 primitives.addAll(testDataSet.getRelations());
124
125 OsmServerWriter writer = new OsmServerWriter();
126 Changeset cs = new Changeset();
127 writer.uploadOsm(new UploadStrategySpecification().setStrategy(UploadStrategy.SINGLE_REQUEST_STRATEGY), 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 //
138 Main.pref.put("osm-server.atomic-upload", false);
139
140 File dataSetCacheOutputFile = new File(System.getProperty("java.io.tmpdir"), 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("property ''{0}'' not set to true, creating test dataset on the server. property is ''{1}''", "useCachedDataset", p));
149
150 // build and upload the test data set
151 //
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 */
178 @Before
179 public void setUp() throws IOException, IllegalDataException {
180 File f = new File(System.getProperty("java.io.tmpdir"), MultiFetchServerObjectReaderTest.class.getName() + ".dataset");
181 logger.info(MessageFormat.format("reading cached dataset ''{0}''", f.toString()));
182 ds = new DataSet();
183 try (FileInputStream fis = new FileInputStream(f)) {
184 ds = OsmReader.parseDataSet(fis, NullProgressMonitor.INSTANCE);
185 }
186 }
187
188 @Test
189 public void testMultiGet10Nodes() throws OsmTransferException {
190 MultiFetchServerObjectReader reader = new MultiFetchServerObjectReader();
191 ArrayList<Node> nodes = new ArrayList<>(ds.getNodes());
192 for (int i =0; i< 10; i++) {
193 reader.append(nodes.get(i));
194 }
195 DataSet out = reader.parseOsm(NullProgressMonitor.INSTANCE);
196 assertEquals(10, out.getNodes().size());
197 for (Node n1:out.getNodes()) {
198 Node n2 = (Node)ds.getPrimitiveById(n1);
199 assertNotNull(n2);
200 assertEquals(n2.get("name"),n2.get("name"));
201 }
202 assertTrue(reader.getMissingPrimitives().isEmpty());
203 }
204
205 @Test
206 public void testMultiGet10Ways() throws OsmTransferException {
207 MultiFetchServerObjectReader reader = new MultiFetchServerObjectReader();
208 ArrayList<Way> ways= new ArrayList<>(ds.getWays());
209 for (int i =0; i< 10; i++) {
210 reader.append(ways.get(i));
211 }
212 DataSet out = reader.parseOsm(NullProgressMonitor.INSTANCE);
213 assertEquals(10, out.getWays().size());
214 for (Way w1: out.getWays()) {
215 Way w2 = (Way)ds.getPrimitiveById(w1);
216 assertNotNull(w2);
217 assertEquals(w2.getNodesCount(), w1.getNodesCount());
218 assertEquals(w2.get("name"),w1.get("name"));
219 }
220 assertTrue(reader.getMissingPrimitives().isEmpty());
221 }
222
223 @Test
224 public void testMultiGet10Relations() throws OsmTransferException {
225 MultiFetchServerObjectReader reader = new MultiFetchServerObjectReader();
226 ArrayList<Relation> relations= new ArrayList<>(ds.getRelations());
227 for (int i =0; i< 10; i++) {
228 reader.append(relations.get(i));
229 }
230 DataSet out = reader.parseOsm(NullProgressMonitor.INSTANCE);
231 assertEquals(10, out.getRelations().size());
232 for (Relation r1: out.getRelations()) {
233 Relation r2 = (Relation)ds.getPrimitiveById(r1);
234 assertNotNull(r2);
235 assertEquals(r2.getMembersCount(), r1.getMembersCount());
236 assertEquals(r2.get("name"),r2.get("name"));
237 }
238 assertTrue(reader.getMissingPrimitives().isEmpty());
239 }
240
241 @Test
242 public void testMultiGet800Nodes() throws OsmTransferException {
243 MultiFetchServerObjectReader reader = new MultiFetchServerObjectReader();
244 ArrayList<Node> nodes = new ArrayList<>(ds.getNodes());
245 for (int i =0; i< 812; i++) {
246 reader.append(nodes.get(i));
247 }
248 DataSet out = reader.parseOsm(NullProgressMonitor.INSTANCE);
249 assertEquals(812, out.getNodes().size());
250 for (Node n1:out.getNodes()) {
251 Node n2 = (Node)ds.getPrimitiveById(n1);
252 assertNotNull(n2);
253 assertEquals(n2.get("name"),n2.get("name"));
254 }
255 assertTrue(reader.getMissingPrimitives().isEmpty());
256 }
257
258 @Test
259 public void multiGetWithNonExistingNode() throws OsmTransferException {
260 MultiFetchServerObjectReader reader = new MultiFetchServerObjectReader();
261 ArrayList<Node> nodes = new ArrayList<>(ds.getNodes());
262 for (int i =0; i< 10; i++) {
263 reader.append(nodes.get(i));
264 }
265 Node n = new Node(9999999);
266 reader.append(n); // doesn't exist
267 DataSet out = reader.parseOsm(NullProgressMonitor.INSTANCE);
268 assertEquals(10, out.getNodes().size());
269 for (Node n1:out.getNodes()) {
270 Node n2 = (Node)ds.getPrimitiveById(n1);
271 assertNotNull(n2);
272 assertEquals(n2.get("name"),n2.get("name"));
273 }
274 assertFalse(reader.getMissingPrimitives().isEmpty());
275 assertEquals(1, reader.getMissingPrimitives().size());
276 assertEquals(9999999, reader.getMissingPrimitives().iterator().next().getUniqueId());
277 }
278}
Note: See TracBrowser for help on using the repository browser.