source: josm/trunk/test/unit/org/openstreetmap/josm/gui/layer/AutosaveTaskTest.java@ 13024

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

fix unit test

  • Property svn:eol-style set to native
File size: 8.4 KB
Line 
1// License: GPL. For details, see LICENSE file.
2package org.openstreetmap.josm.gui.layer;
3
4import static org.junit.Assert.assertEquals;
5import static org.junit.Assert.assertFalse;
6import static org.junit.Assert.assertNotNull;
7import static org.junit.Assert.assertNull;
8import static org.junit.Assert.assertTrue;
9
10import java.io.BufferedWriter;
11import java.io.File;
12import java.io.IOException;
13import java.nio.charset.StandardCharsets;
14import java.nio.file.Files;
15import java.nio.file.Path;
16import java.nio.file.Paths;
17import java.time.ZoneId;
18import java.time.ZonedDateTime;
19import java.util.Date;
20import java.util.List;
21
22import org.junit.Before;
23import org.junit.Rule;
24import org.junit.Test;
25import org.openstreetmap.josm.data.coor.LatLon;
26import org.openstreetmap.josm.data.osm.DataSet;
27import org.openstreetmap.josm.data.osm.Node;
28import org.openstreetmap.josm.gui.MainApplication;
29import org.openstreetmap.josm.gui.layer.AutosaveTask.AutosaveLayerInfo;
30import org.openstreetmap.josm.testutils.JOSMTestRules;
31
32import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
33
34/**
35 * Unit tests for class {@link AutosaveTask}.
36 */
37public class AutosaveTaskTest {
38 /**
39 * We need preferences and a home directory for this.
40 */
41 @Rule
42 @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
43 public JOSMTestRules test = new JOSMTestRules().preferences().platform().projection();
44
45 private AutosaveTask task;
46
47 /**
48 * Setup test.
49 * @throws IOException if autosave directory cannot be created
50 */
51 @Before
52 public void setUp() throws IOException {
53 task = new AutosaveTask();
54 }
55
56 /**
57 * Unit test to {@link AutosaveTask#getUnsavedLayersFiles} - empty case
58 */
59 @Test
60 public void testGetUnsavedLayersFilesEmpty() {
61 assertTrue(task.getUnsavedLayersFiles().isEmpty());
62 }
63
64 /**
65 * Unit test to {@link AutosaveTask#getUnsavedLayersFiles} - non empty case
66 * @throws IOException in case of I/O error
67 */
68 @Test
69 public void testGetUnsavedLayersFilesNotEmpty() throws IOException {
70 Files.createDirectories(task.getAutosaveDir());
71 String autodir = task.getAutosaveDir().toString();
72 File layer1 = Files.createFile(Paths.get(autodir, "layer1.osm")).toFile();
73 File layer2 = Files.createFile(Paths.get(autodir, "layer2.osm")).toFile();
74 File dir = Files.createDirectory(Paths.get(autodir, "dir.osm")).toFile();
75 List<File> files = task.getUnsavedLayersFiles();
76 assertEquals(2, files.size());
77 assertTrue(files.contains(layer1));
78 assertTrue(files.contains(layer2));
79 assertFalse(files.contains(dir));
80 // cleanup
81 layer1.delete();
82 layer2.delete();
83 dir.delete();
84 }
85
86 /**
87 * Unit test to {@link AutosaveTask#getNewLayerFile}
88 * @throws IOException in case of I/O error
89 */
90 @Test
91 public void testGetNewLayerFile() throws IOException {
92 Files.createDirectories(task.getAutosaveDir());
93 AutosaveLayerInfo info = new AutosaveLayerInfo(new OsmDataLayer(new DataSet(), "layer", null));
94 Date fixed = Date.from(ZonedDateTime.of(2016, 1, 1, 1, 2, 3, 456_000_000, ZoneId.systemDefault()).toInstant());
95
96 AutosaveTask.PROP_INDEX_LIMIT.put(5);
97 for (int i = 0; i <= AutosaveTask.PROP_INDEX_LIMIT.get() + 2; i++) {
98 // Only retry 2 indexes to avoid 1000*1000 disk operations
99 File f = task.getNewLayerFile(info, fixed, Math.max(0, i - 2));
100 if (i > AutosaveTask.PROP_INDEX_LIMIT.get()) {
101 assertNull(f);
102 } else {
103 assertNotNull(f);
104 File pid = task.getPidFile(f);
105 assertTrue(pid.exists());
106 assertTrue(f.exists());
107 if (i == 0) {
108 assertEquals("null_20160101_010203456.osm", f.getName());
109 assertEquals("null_20160101_010203456.pid", pid.getName());
110 } else {
111 assertEquals("null_20160101_010203456_" + i + ".osm", f.getName());
112 assertEquals("null_20160101_010203456_" + i + ".pid", pid.getName());
113 }
114 }
115 }
116 // cleanup
117 for (Path entry : Files.newDirectoryStream(task.getAutosaveDir(), "*.{osm,pid}")) {
118 Files.delete(entry);
119 }
120 }
121
122 /**
123 * Tests if {@link AutosaveTask#schedule()} creates the directories.
124 */
125 @Test
126 public void testScheduleCreatesDirectories() {
127 try {
128 task.schedule();
129 assertTrue(task.getAutosaveDir().toFile().isDirectory());
130 } finally {
131 task.cancel();
132 }
133 }
134
135 /**
136 * Tests that {@link AutosaveTask#run()} saves every layer
137 */
138 @Test
139 public void testAutosaveIgnoresUnmodifiedLayer() {
140 OsmDataLayer layer = new OsmDataLayer(new DataSet(), "OsmData", null);
141 MainApplication.getLayerManager().addLayer(layer);
142 try {
143 task.schedule();
144 assertEquals(0, countFiles());
145 task.run();
146 assertEquals(0, countFiles());
147 } finally {
148 task.cancel();
149 }
150 }
151
152 private int countFiles() {
153 String[] files = task.getAutosaveDir().toFile().list((dir, name) -> name.endsWith(".osm"));
154 return files != null ? files.length : 0;
155 }
156
157 /**
158 * Tests that {@link AutosaveTask#run()} saves every layer.
159 */
160 @Test
161 public void testAutosaveSavesLayer() {
162 runAutosaveTaskSeveralTimes(1);
163 }
164
165 /**
166 * Tests that {@link AutosaveTask#run()} saves every layer.
167 */
168 @Test
169 public void testAutosaveSavesLayerMultipleTimes() {
170 AutosaveTask.PROP_FILES_PER_LAYER.put(3);
171 runAutosaveTaskSeveralTimes(5);
172 }
173
174 private void runAutosaveTaskSeveralTimes(int times) {
175 DataSet data = new DataSet();
176 OsmDataLayer layer = new OsmDataLayer(data, "OsmData", null);
177 MainApplication.getLayerManager().addLayer(layer);
178 try {
179 task.schedule();
180 assertEquals(0, countFiles());
181
182 for (int i = 0; i < times; i++) {
183 data.addPrimitive(new Node(new LatLon(10, 10)));
184 task.run();
185 assertEquals(Math.min(i + 1, 3), countFiles());
186 }
187
188 } finally {
189 task.cancel();
190 }
191 }
192
193 /**
194 * Tests that {@link AutosaveTask#discardUnsavedLayers()} ignores layers from the current instance
195 * @throws IOException in case of I/O error
196 */
197 @Test
198 public void testDiscardUnsavedLayersIgnoresCurrentInstance() throws IOException {
199 runAutosaveTaskSeveralTimes(1);
200 try (BufferedWriter file = Files.newBufferedWriter(
201 new File(task.getAutosaveDir().toFile(), "any_other_file.osm").toPath(), StandardCharsets.UTF_8)) {
202 file.append("");
203 }
204 assertEquals(2, countFiles());
205
206 task.discardUnsavedLayers();
207 assertEquals(1, countFiles());
208 }
209
210 /**
211 * Tests that {@link AutosaveTask#run()} handles duplicate layers
212 */
213 @Test
214 public void testAutosaveHandlesDupplicateNames() {
215 DataSet data1 = new DataSet();
216 OsmDataLayer layer1 = new OsmDataLayer(data1, "OsmData", null);
217 MainApplication.getLayerManager().addLayer(layer1);
218
219 DataSet data2 = new DataSet();
220 OsmDataLayer layer2 = new OsmDataLayer(data2, "OsmData", null);
221
222 try {
223 task.schedule();
224 assertEquals(0, countFiles());
225 // also test adding layer later
226 MainApplication.getLayerManager().addLayer(layer2);
227
228 data1.addPrimitive(new Node(new LatLon(10, 10)));
229 data2.addPrimitive(new Node(new LatLon(10, 10)));
230 task.run();
231 assertEquals(2, countFiles());
232 } finally {
233 task.cancel();
234 }
235 }
236
237 /**
238 * Test that {@link AutosaveTask#recoverUnsavedLayers()} recovers unsaved layers.
239 * @throws Exception in case of error
240 */
241 @Test
242 public void testRecoverLayers() throws Exception {
243 runAutosaveTaskSeveralTimes(1);
244 try (BufferedWriter file = Files.newBufferedWriter(
245 new File(task.getAutosaveDir().toFile(), "any_other_file.osm").toPath(), StandardCharsets.UTF_8)) {
246 file.append("<?xml version=\"1.0\"?><osm version=\"0.6\"><node id=\"1\" lat=\"1\" lon=\"2\" version=\"1\"/></osm>");
247 }
248
249 assertEquals(2, countFiles());
250 task.recoverUnsavedLayers().get();
251
252 assertEquals(1, countFiles());
253 }
254}
Note: See TracBrowser for help on using the repository browser.