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

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

see #12994, see #13018 - checkstyle

  • Property svn:eol-style set to native
File size: 8.1 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.File;
11import java.io.FileWriter;
12import java.io.FilenameFilter;
13import java.io.IOException;
14import java.nio.file.Files;
15import java.nio.file.Paths;
16import java.util.Calendar;
17import java.util.Date;
18import java.util.List;
19
20import org.junit.Before;
21import org.junit.Rule;
22import org.junit.Test;
23import org.openstreetmap.josm.Main;
24import org.openstreetmap.josm.data.AutosaveTask.AutosaveLayerInfo;
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.OsmDataLayer;
29import org.openstreetmap.josm.testutils.JOSMTestRules;
30
31import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
32
33/**
34 * Unit tests for class {@link AutosaveTask}.
35 */
36public class AutosaveTaskTest {
37 /**
38 * We need preferences and a home directory for this.
39 */
40 @Rule
41 @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
42 public JOSMTestRules test = new JOSMTestRules().preferences().platform().projection();
43
44 private AutosaveTask task;
45
46 /**
47 * Setup test.
48 * @throws IOException if autosave directory cannot be created
49 */
50 @Before
51 public void setUp() throws IOException {
52 task = new AutosaveTask();
53 }
54
55 /**
56 * Unit test to {@link AutosaveTask#getUnsavedLayersFiles} - empty case
57 */
58 @Test
59 public void testGetUnsavedLayersFilesEmpty() {
60 assertTrue(task.getUnsavedLayersFiles().isEmpty());
61 }
62
63 /**
64 * Unit test to {@link AutosaveTask#getUnsavedLayersFiles} - non empty case
65 * @throws IOException in case of I/O error
66 */
67 @Test
68 public void testGetUnsavedLayersFilesNotEmpty() throws IOException {
69 Files.createDirectories(task.getAutosaveDir());
70 String autodir = task.getAutosaveDir().toString();
71 File layer1 = Files.createFile(Paths.get(autodir, "layer1.osm")).toFile();
72 File layer2 = Files.createFile(Paths.get(autodir, "layer2.osm")).toFile();
73 File dir = Files.createDirectory(Paths.get(autodir, "dir.osm")).toFile();
74 List<File> files = task.getUnsavedLayersFiles();
75 assertEquals(2, files.size());
76 assertTrue(files.contains(layer1));
77 assertTrue(files.contains(layer2));
78 assertFalse(files.contains(dir));
79 }
80
81 /**
82 * Unit test to {@link AutosaveTask#getNewLayerFile}
83 * @throws IOException in case of I/O error
84 */
85 @Test
86 public void testGetNewLayerFile() throws IOException {
87 Files.createDirectories(task.getAutosaveDir());
88 AutosaveLayerInfo info = new AutosaveLayerInfo(new OsmDataLayer(new DataSet(), "layer", null));
89 Calendar cal = Calendar.getInstance();
90 cal.set(2016, 0, 1, 1, 2, 3);
91 cal.set(Calendar.MILLISECOND, 456);
92 Date fixed = cal.getTime();
93
94 for (int i = 0; i <= AutosaveTask.PROP_INDEX_LIMIT.get() + 1; 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 return task.getAutosaveDir().toFile().list(new FilenameFilter() {
147 @Override
148 public boolean accept(File dir, String name) {
149 return name.endsWith(".osm");
150 }
151 }).length;
152 }
153
154 /**
155 * Tests that {@link AutosaveTask#run()} saves every layer.
156 */
157 @Test
158 public void testAutosaveSavesLayer() {
159 runAutosaveTaskSeveralTimes(1);
160 }
161
162 /**
163 * Tests that {@link AutosaveTask#run()} saves every layer.
164 */
165 @Test
166 public void testAutosaveSavesLayerMultipleTimes() {
167 AutosaveTask.PROP_FILES_PER_LAYER.put(3);
168 runAutosaveTaskSeveralTimes(5);
169 }
170
171 private void runAutosaveTaskSeveralTimes(int times) {
172 DataSet data = new DataSet();
173 OsmDataLayer layer = new OsmDataLayer(data, "OsmData", null);
174 Main.getLayerManager().addLayer(layer);
175 try {
176 task.schedule();
177 assertEquals(0, countFiles());
178
179 for (int i = 0; i < times; i++) {
180 data.addPrimitive(new Node(new LatLon(10, 10)));
181 task.run();
182 assertEquals(Math.min(i + 1, 3), countFiles());
183 }
184
185 } finally {
186 task.cancel();
187 }
188 }
189
190 /**
191 * Tests that {@link AutosaveTask#discardUnsavedLayers()} ignores layers from the current instance
192 * @throws IOException in case of I/O error
193 */
194 @Test
195 public void testDiscardUnsavedLayersIgnoresCurrentInstance() throws IOException {
196 runAutosaveTaskSeveralTimes(1);
197 try (FileWriter file = new FileWriter(new File(task.getAutosaveDir().toFile(), "any_other_file.osm"))) {
198 file.append("");
199 }
200 assertEquals(2, countFiles());
201
202 task.discardUnsavedLayers();
203 assertEquals(1, countFiles());
204 }
205
206 /**
207 * Tests that {@link AutosaveTask#run()} handles duplicate layers
208 */
209 @Test
210 public void testAutosaveHandlesDupplicateNames() {
211 DataSet data1 = new DataSet();
212 OsmDataLayer layer1 = new OsmDataLayer(data1, "OsmData", null);
213 Main.getLayerManager().addLayer(layer1);
214
215 DataSet data2 = new DataSet();
216 OsmDataLayer layer2 = new OsmDataLayer(data2, "OsmData", null);
217
218 try {
219 task.schedule();
220 assertEquals(0, countFiles());
221 // also test adding layer later
222 Main.getLayerManager().addLayer(layer2);
223
224 data1.addPrimitive(new Node(new LatLon(10, 10)));
225 data2.addPrimitive(new Node(new LatLon(10, 10)));
226 task.run();
227 assertEquals(2, countFiles());
228 } finally {
229 task.cancel();
230 }
231 }
232
233 /**
234 * Test that {@link AutosaveTask#recoverUnsavedLayers()} recovers unsaved layers.
235 * @throws Exception in case of error
236 */
237 @Test
238 public void testRecoverLayers() throws Exception {
239 runAutosaveTaskSeveralTimes(1);
240 try (FileWriter file = new FileWriter(new File(task.getAutosaveDir().toFile(), "any_other_file.osm"))) {
241 file.append("<?xml version=\"1.0\"?><osm version=\"0.6\"><node id=\"1\" lat=\"1\" lon=\"2\" version=\"1\"/></osm>");
242 }
243
244 assertEquals(2, countFiles());
245 task.recoverUnsavedLayers().get();
246
247 assertEquals(1, countFiles());
248 }
249}
Note: See TracBrowser for help on using the repository browser.