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

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

see #15182 - deprecate Main.worker, replace it by gui.MainApplication.worker + code refactoring to make sure only editor packages use it

  • Property svn:eol-style set to native
File size: 8.2 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.Paths;
16import java.time.ZoneId;
17import java.time.ZonedDateTime;
18import java.util.Date;
19import java.util.List;
20
21import org.junit.Before;
22import org.junit.Rule;
23import org.junit.Test;
24import org.openstreetmap.josm.Main;
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.layer.AutosaveTask;
29import org.openstreetmap.josm.gui.layer.OsmDataLayer;
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().platform().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 }
82
83 /**
84 * Unit test to {@link AutosaveTask#getNewLayerFile}
85 * @throws IOException in case of I/O error
86 */
87 @Test
88 public void testGetNewLayerFile() throws IOException {
89 Files.createDirectories(task.getAutosaveDir());
90 AutosaveLayerInfo info = new AutosaveLayerInfo(new OsmDataLayer(new DataSet(), "layer", null));
91 Date fixed = Date.from(ZonedDateTime.of(2016, 1, 1, 1, 2, 3, 456_000_000, ZoneId.systemDefault()).toInstant());
92
93 AutosaveTask.PROP_INDEX_LIMIT.put(5);
94 for (int i = 0; i <= AutosaveTask.PROP_INDEX_LIMIT.get() + 2; i++) {
95 // Only retry 2 indexes to avoid 1000*1000 disk operations
96 File f = task.getNewLayerFile(info, fixed, Math.max(0, i - 2));
97 if (i > AutosaveTask.PROP_INDEX_LIMIT.get()) {
98 assertNull(f);
99 } else {
100 assertNotNull(f);
101 File pid = task.getPidFile(f);
102 assertTrue(pid.exists());
103 assertTrue(f.exists());
104 if (i == 0) {
105 assertEquals("null_20160101_010203456.osm", f.getName());
106 assertEquals("null_20160101_010203456.pid", pid.getName());
107 } else {
108 assertEquals("null_20160101_010203456_" + i + ".osm", f.getName());
109 assertEquals("null_20160101_010203456_" + i + ".pid", pid.getName());
110 }
111 }
112 }
113 }
114
115 /**
116 * Tests if {@link AutosaveTask#schedule()} creates the directories.
117 */
118 @Test
119 public void testScheduleCreatesDirectories() {
120 try {
121 task.schedule();
122 assertTrue(task.getAutosaveDir().toFile().isDirectory());
123 } finally {
124 task.cancel();
125 }
126 }
127
128 /**
129 * Tests that {@link AutosaveTask#run()} saves every layer
130 */
131 @Test
132 public void testAutosaveIgnoresUnmodifiedLayer() {
133 OsmDataLayer layer = new OsmDataLayer(new DataSet(), "OsmData", null);
134 Main.getLayerManager().addLayer(layer);
135 try {
136 task.schedule();
137 assertEquals(0, countFiles());
138 task.run();
139 assertEquals(0, countFiles());
140 } finally {
141 task.cancel();
142 }
143 }
144
145 private int countFiles() {
146 String[] files = task.getAutosaveDir().toFile().list((dir, name) -> name.endsWith(".osm"));
147 return files != null ? files.length : 0;
148 }
149
150 /**
151 * Tests that {@link AutosaveTask#run()} saves every layer.
152 */
153 @Test
154 public void testAutosaveSavesLayer() {
155 runAutosaveTaskSeveralTimes(1);
156 }
157
158 /**
159 * Tests that {@link AutosaveTask#run()} saves every layer.
160 */
161 @Test
162 public void testAutosaveSavesLayerMultipleTimes() {
163 AutosaveTask.PROP_FILES_PER_LAYER.put(3);
164 runAutosaveTaskSeveralTimes(5);
165 }
166
167 private void runAutosaveTaskSeveralTimes(int times) {
168 DataSet data = new DataSet();
169 OsmDataLayer layer = new OsmDataLayer(data, "OsmData", null);
170 Main.getLayerManager().addLayer(layer);
171 try {
172 task.schedule();
173 assertEquals(0, countFiles());
174
175 for (int i = 0; i < times; i++) {
176 data.addPrimitive(new Node(new LatLon(10, 10)));
177 task.run();
178 assertEquals(Math.min(i + 1, 3), countFiles());
179 }
180
181 } finally {
182 task.cancel();
183 }
184 }
185
186 /**
187 * Tests that {@link AutosaveTask#discardUnsavedLayers()} ignores layers from the current instance
188 * @throws IOException in case of I/O error
189 */
190 @Test
191 public void testDiscardUnsavedLayersIgnoresCurrentInstance() throws IOException {
192 runAutosaveTaskSeveralTimes(1);
193 try (BufferedWriter file = Files.newBufferedWriter(
194 new File(task.getAutosaveDir().toFile(), "any_other_file.osm").toPath(), StandardCharsets.UTF_8)) {
195 file.append("");
196 }
197 assertEquals(2, countFiles());
198
199 task.discardUnsavedLayers();
200 assertEquals(1, countFiles());
201 }
202
203 /**
204 * Tests that {@link AutosaveTask#run()} handles duplicate layers
205 */
206 @Test
207 public void testAutosaveHandlesDupplicateNames() {
208 DataSet data1 = new DataSet();
209 OsmDataLayer layer1 = new OsmDataLayer(data1, "OsmData", null);
210 Main.getLayerManager().addLayer(layer1);
211
212 DataSet data2 = new DataSet();
213 OsmDataLayer layer2 = new OsmDataLayer(data2, "OsmData", null);
214
215 try {
216 task.schedule();
217 assertEquals(0, countFiles());
218 // also test adding layer later
219 Main.getLayerManager().addLayer(layer2);
220
221 data1.addPrimitive(new Node(new LatLon(10, 10)));
222 data2.addPrimitive(new Node(new LatLon(10, 10)));
223 task.run();
224 assertEquals(2, countFiles());
225 } finally {
226 task.cancel();
227 }
228 }
229
230 /**
231 * Test that {@link AutosaveTask#recoverUnsavedLayers()} recovers unsaved layers.
232 * @throws Exception in case of error
233 */
234 @Test
235 public void testRecoverLayers() throws Exception {
236 runAutosaveTaskSeveralTimes(1);
237 try (BufferedWriter file = Files.newBufferedWriter(
238 new File(task.getAutosaveDir().toFile(), "any_other_file.osm").toPath(), StandardCharsets.UTF_8)) {
239 file.append("<?xml version=\"1.0\"?><osm version=\"0.6\"><node id=\"1\" lat=\"1\" lon=\"2\" version=\"1\"/></osm>");
240 }
241
242 assertEquals(2, countFiles());
243 task.recoverUnsavedLayers().get();
244
245 assertEquals(1, countFiles());
246 }
247}
Note: See TracBrowser for help on using the repository browser.