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

Last change on this file since 16977 was 16977, checked in by simon04, 4 years ago

Fix typo in Javadoc

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