Mercurial > vim
comparison src/testdir/test_recover.vim @ 24844:250c6ab76d19 v8.2.2960
patch 8.2.2960: swap file recovery not sufficiently tested
Commit: https://github.com/vim/vim/commit/8cf02e5cf8fb14a5009f12e7af0a47617a0ce88d
Author: Yegappan Lakshmanan <yegappan@yahoo.com>
Date: Mon Jun 7 20:41:22 2021 +0200
patch 8.2.2960: swap file recovery not sufficiently tested
Problem: Swap file recovery not sufficiently tested.
Solution: Add a few more tests. (Yegappan Lakshmanan, closes https://github.com/vim/vim/issues/8339)
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Mon, 07 Jun 2021 20:45:03 +0200 |
parents | e0c43439fea6 |
children | 13812db714fa |
comparison
equal
deleted
inserted
replaced
24843:1b6471c91081 | 24844:250c6ab76d19 |
---|---|
144 call writefile(b, '.Xfile1.swn') | 144 call writefile(b, '.Xfile1.swn') |
145 call writefile(b, '.Xfile1.swo') | 145 call writefile(b, '.Xfile1.swo') |
146 %bw! | 146 %bw! |
147 call feedkeys(":recover Xfile1\<CR>3\<CR>q", 'xt') | 147 call feedkeys(":recover Xfile1\<CR>3\<CR>q", 'xt') |
148 call assert_equal(['a', 'b', 'c'], getline(1, '$')) | 148 call assert_equal(['a', 'b', 'c'], getline(1, '$')) |
149 " try using out-of-range number to select a swap file | |
150 bw! | |
151 call feedkeys(":recover Xfile1\<CR>4\<CR>q", 'xt') | |
152 call assert_equal('Xfile1', @%) | |
153 call assert_equal([''], getline(1, '$')) | |
154 bw! | |
155 call feedkeys(":recover Xfile1\<CR>0\<CR>q", 'xt') | |
156 call assert_equal('Xfile1', @%) | |
157 call assert_equal([''], getline(1, '$')) | |
158 bw! | |
149 | 159 |
150 call delete('.Xfile1.swm') | 160 call delete('.Xfile1.swm') |
151 call delete('.Xfile1.swn') | 161 call delete('.Xfile1.swn') |
152 call delete('.Xfile1.swo') | 162 call delete('.Xfile1.swo') |
153 endfunc | 163 endfunc |
164 call assert_fails('recover', 'E305:') | 174 call assert_fails('recover', 'E305:') |
165 call delete('.Xfile1.swp') | 175 call delete('.Xfile1.swp') |
166 endfunc | 176 endfunc |
167 | 177 |
168 " Test for :recover using a corrupted swap file | 178 " Test for :recover using a corrupted swap file |
179 " Refer to the comments in the memline.c file for the swap file headers | |
180 " definition. | |
169 func Test_recover_corrupted_swap_file() | 181 func Test_recover_corrupted_swap_file() |
170 CheckUnix | 182 CheckUnix |
171 | 183 |
172 " recover using a partial swap file | 184 " recover using a partial swap file |
173 call writefile(0z1234, '.Xfile1.swp') | 185 call writefile(0z1234, '.Xfile1.swp') |
195 " clear the B0_MAGIC_LONG field | 207 " clear the B0_MAGIC_LONG field |
196 let b[1008:1011] = 0z00000000 | 208 let b[1008:1011] = 0z00000000 |
197 call writefile(b, sn) | 209 call writefile(b, sn) |
198 let msg = execute('recover Xfile1') | 210 let msg = execute('recover Xfile1') |
199 call assert_match('the file has been damaged', msg) | 211 call assert_match('the file has been damaged', msg) |
212 call assert_equal('Xfile1', @%) | |
213 call assert_equal([''], getline(1, '$')) | |
214 bw! | |
215 | |
216 " reduce the page size | |
217 let b = copy(save_b) | |
218 let b[12:15] = 0z00010000 | |
219 call writefile(b, sn) | |
220 let msg = execute('recover Xfile1') | |
221 call assert_match('page size is smaller than minimum value', msg) | |
222 call assert_equal('Xfile1', @%) | |
223 call assert_equal([''], getline(1, '$')) | |
200 bw! | 224 bw! |
201 | 225 |
202 " clear the pointer ID | 226 " clear the pointer ID |
203 let b = copy(save_b) | 227 let b = copy(save_b) |
204 let b[4096:4097] = 0z0000 | 228 let b[4096:4097] = 0z0000 |
205 call writefile(b, sn) | 229 call writefile(b, sn) |
206 call assert_fails('recover Xfile1', 'E310:') | 230 call assert_fails('recover Xfile1', 'E310:') |
231 call assert_equal('Xfile1', @%) | |
232 call assert_equal([''], getline(1, '$')) | |
233 bw! | |
234 | |
235 " set the number of pointers in a pointer block to zero | |
236 let b = copy(save_b) | |
237 let b[4098:4099] = 0z0000 | |
238 call writefile(b, sn) | |
239 call assert_fails('recover Xfile1', 'E312:') | |
240 call assert_equal('Xfile1', @%) | |
241 call assert_equal(['???EMPTY BLOCK'], getline(1, '$')) | |
242 bw! | |
243 | |
244 " set the block number in a pointer entry to a negative number | |
245 let b = copy(save_b) | |
246 let b[4104:4111] = 0z00000000.00000080 | |
247 call writefile(b, sn) | |
248 call assert_fails('recover Xfile1', 'E312:') | |
249 call assert_equal('Xfile1', @%) | |
250 call assert_equal(['???LINES MISSING'], getline(1, '$')) | |
207 bw! | 251 bw! |
208 | 252 |
209 " clear the data block ID | 253 " clear the data block ID |
210 let b = copy(save_b) | 254 let b = copy(save_b) |
211 let b[8192:8193] = 0z0000 | 255 let b[8192:8193] = 0z0000 |
212 call writefile(b, sn) | 256 call writefile(b, sn) |
213 call assert_fails('recover Xfile1', 'E312:') | 257 call assert_fails('recover Xfile1', 'E312:') |
258 call assert_equal('Xfile1', @%) | |
259 call assert_equal(['???BLOCK MISSING'], getline(1, '$')) | |
260 bw! | |
261 | |
262 " set the number of lines in the data block to zero | |
263 let b = copy(save_b) | |
264 let b[8208:8211] = 0z00000000 | |
265 call writefile(b, sn) | |
266 call assert_fails('recover Xfile1', 'E312:') | |
267 call assert_equal('Xfile1', @%) | |
268 call assert_equal(['??? from here until ???END lines may have been inserted/deleted', | |
269 \ '???END'], getline(1, '$')) | |
270 bw! | |
271 | |
272 " use an invalid text start for the lines in a data block | |
273 let b = copy(save_b) | |
274 let b[8216:8219] = 0z00000000 | |
275 call writefile(b, sn) | |
276 call assert_fails('recover Xfile1', 'E312:') | |
277 call assert_equal('Xfile1', @%) | |
278 call assert_equal(['???'], getline(1, '$')) | |
279 bw! | |
280 | |
281 " use an incorrect text end (db_txt_end) for the data block | |
282 let b = copy(save_b) | |
283 let b[8204:8207] = 0z80000000 | |
284 call writefile(b, sn) | |
285 call assert_fails('recover Xfile1', 'E312:') | |
286 call assert_equal('Xfile1', @%) | |
287 call assert_equal(['??? from here until ???END lines may be messed up', '', | |
288 \ '???END'], getline(1, '$')) | |
214 bw! | 289 bw! |
215 | 290 |
216 " remove the data block | 291 " remove the data block |
217 let b = copy(save_b) | 292 let b = copy(save_b) |
218 call writefile(b[:8191], sn) | 293 call writefile(b[:8191], sn) |
219 call assert_fails('recover Xfile1', 'E312:') | 294 call assert_fails('recover Xfile1', 'E312:') |
295 call assert_equal('Xfile1', @%) | |
296 call assert_equal(['???MANY LINES MISSING'], getline(1, '$')) | |
220 endif | 297 endif |
221 | 298 |
222 bw! | 299 bw! |
223 call delete(sn) | 300 call delete(sn) |
224 endfunc | 301 endfunc |
288 bw! | 365 bw! |
289 call delete('Xfile1') | 366 call delete('Xfile1') |
290 call delete('.Xfile1.swz') | 367 call delete('.Xfile1.swz') |
291 endfunc | 368 endfunc |
292 | 369 |
370 " Test for recovering a file when editing a symbolically linked file | |
371 func Test_recover_symbolic_link() | |
372 CheckUnix | |
373 call writefile(['aaa', 'bbb', 'ccc'], 'Xfile1') | |
374 silent !ln -s Xfile1 Xfile2 | |
375 edit Xfile2 | |
376 call assert_equal('.Xfile1.swp', fnamemodify(swapname(''), ':t')) | |
377 preserve | |
378 let b = readblob('.Xfile1.swp') | |
379 %bw! | |
380 call writefile([], 'Xfile1') | |
381 call writefile(b, '.Xfile1.swp') | |
382 silent! recover Xfile2 | |
383 call assert_equal(['aaa', 'bbb', 'ccc'], getline(1, '$')) | |
384 call assert_true(&modified) | |
385 update | |
386 %bw! | |
387 call assert_equal(['aaa', 'bbb', 'ccc'], readfile('Xfile1')) | |
388 call delete('Xfile1') | |
389 call delete('Xfile2') | |
390 call delete('.Xfile1.swp') | |
391 endfunc | |
392 | |
293 " vim: shiftwidth=2 sts=2 expandtab | 393 " vim: shiftwidth=2 sts=2 expandtab |