source: josm/trunk/test/unit/org/openstreetmap/josm/data/AutosaveTaskTest.java@ 11899

Last change on this file since 11899 was 11324, checked in by Don-vip, 8 years ago

findbugs

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