xref: /vim-8.2.3635/src/testdir/test_stat.vim (revision 944eeb44)
18767f52fSBram Moolenaar" Tests for stat functions and checktime
28767f52fSBram Moolenaar
36d91bcb4SBram Moolenaarsource check.vim
46d91bcb4SBram Moolenaar
582de3c2cSBram Moolenaarfunc CheckFileTime(doSleep)
6addc156cSBram Moolenaar  let fnames = ['Xtest1.tmp', 'Xtest2.tmp', 'Xtest3.tmp']
7addc156cSBram Moolenaar  let times = []
882de3c2cSBram Moolenaar  let result = 0
98767f52fSBram Moolenaar
104b96df5aSBram Moolenaar  " Use three files instead of localtim(), with a network filesystem the file
11addc156cSBram Moolenaar  " times may differ at bit
128767f52fSBram Moolenaar  let fl = ['Hello World!']
13addc156cSBram Moolenaar  for fname in fnames
148767f52fSBram Moolenaar    call writefile(fl, fname)
154c313b13SBram Moolenaar    call add(times, fname->getftime())
1682de3c2cSBram Moolenaar    if a:doSleep
1782de3c2cSBram Moolenaar      sleep 1
1882de3c2cSBram Moolenaar    endif
19addc156cSBram Moolenaar  endfor
208767f52fSBram Moolenaar
21addc156cSBram Moolenaar  let time_correct = (times[0] <= times[1] && times[1] <= times[2])
2282de3c2cSBram Moolenaar  if a:doSleep || time_correct
23addc156cSBram Moolenaar    call assert_true(time_correct, printf('Expected %s <= %s <= %s', times[0], times[1], times[2]))
244c313b13SBram Moolenaar    call assert_equal(strlen(fl[0] . "\n"), fnames[0]->getfsize())
254c313b13SBram Moolenaar    call assert_equal('file', fnames[0]->getftype())
26addc156cSBram Moolenaar    call assert_equal('rw-', getfperm(fnames[0])[0:2])
2782de3c2cSBram Moolenaar    let result = 1
2882de3c2cSBram Moolenaar  endif
29a2f28859SBram Moolenaar
30addc156cSBram Moolenaar  for fname in fnames
31a2f28859SBram Moolenaar    call delete(fname)
32addc156cSBram Moolenaar  endfor
3382de3c2cSBram Moolenaar  return result
3482de3c2cSBram Moolenaarendfunc
3582de3c2cSBram Moolenaar
3682de3c2cSBram Moolenaarfunc Test_existent_file()
3782de3c2cSBram Moolenaar  " On some systems the file timestamp is rounded to a multiple of 2 seconds.
3882de3c2cSBram Moolenaar  " We need to sleep to handle that, but that makes the test slow.  First try
3982de3c2cSBram Moolenaar  " without the sleep, and if it fails try again with the sleep.
4082de3c2cSBram Moolenaar  if CheckFileTime(0) == 0
4182de3c2cSBram Moolenaar    call CheckFileTime(1)
4282de3c2cSBram Moolenaar  endif
438767f52fSBram Moolenaarendfunc
448767f52fSBram Moolenaar
458767f52fSBram Moolenaarfunc Test_existent_directory()
468767f52fSBram Moolenaar  let dname = '.'
478767f52fSBram Moolenaar
488767f52fSBram Moolenaar  call assert_equal(0, getfsize(dname))
498767f52fSBram Moolenaar  call assert_equal('dir', getftype(dname))
508767f52fSBram Moolenaar  call assert_equal('rwx', getfperm(dname)[0:2])
518767f52fSBram Moolenaarendfunc
528767f52fSBram Moolenaar
53386bc82aSBram Moolenaarfunc SleepForTimestamp()
54386bc82aSBram Moolenaar  " FAT has a granularity of 2 seconds, otherwise it's usually 1 second
55386bc82aSBram Moolenaar  if has('win32')
56386bc82aSBram Moolenaar    sleep 2
57386bc82aSBram Moolenaar  else
58386bc82aSBram Moolenaar    sleep 1
59386bc82aSBram Moolenaar  endif
60386bc82aSBram Moolenaarendfunc
61386bc82aSBram Moolenaar
628767f52fSBram Moolenaarfunc Test_checktime()
638767f52fSBram Moolenaar  let fname = 'Xtest.tmp'
648767f52fSBram Moolenaar
658767f52fSBram Moolenaar  let fl = ['Hello World!']
668767f52fSBram Moolenaar  call writefile(fl, fname)
678767f52fSBram Moolenaar  set autoread
688767f52fSBram Moolenaar  exec 'e' fname
69386bc82aSBram Moolenaar  call SleepForTimestamp()
708767f52fSBram Moolenaar  let fl = readfile(fname)
718767f52fSBram Moolenaar  let fl[0] .= ' - checktime'
728767f52fSBram Moolenaar  call writefile(fl, fname)
738767f52fSBram Moolenaar  checktime
748767f52fSBram Moolenaar  call assert_equal(fl[0], getline(1))
75a2f28859SBram Moolenaar
76a2f28859SBram Moolenaar  call delete(fname)
778767f52fSBram Moolenaarendfunc
788767f52fSBram Moolenaar
790a7984afSLeah Neukirchenfunc Test_checktime_fast()
800a7984afSLeah Neukirchen  CheckFeature nanotime
810a7984afSLeah Neukirchen
820a7984afSLeah Neukirchen  let fname = 'Xtest.tmp'
830a7984afSLeah Neukirchen
840a7984afSLeah Neukirchen  let fl = ['Hello World!']
850a7984afSLeah Neukirchen  call writefile(fl, fname)
860a7984afSLeah Neukirchen  set autoread
870a7984afSLeah Neukirchen  exec 'e' fname
880a7984afSLeah Neukirchen  let fl = readfile(fname)
890a7984afSLeah Neukirchen  let fl[0] .= ' - checktime'
900a7984afSLeah Neukirchen  call writefile(fl, fname)
910a7984afSLeah Neukirchen  checktime
920a7984afSLeah Neukirchen  call assert_equal(fl[0], getline(1))
930a7984afSLeah Neukirchen
940a7984afSLeah Neukirchen  call delete(fname)
950a7984afSLeah Neukirchenendfunc
960a7984afSLeah Neukirchen
970a7984afSLeah Neukirchenfunc Test_autoread_fast()
980a7984afSLeah Neukirchen  CheckFeature nanotime
990a7984afSLeah Neukirchen
100eaa006daSBram Moolenaar  " this is timing sensitive
101eaa006daSBram Moolenaar  let g:test_is_flaky = 1
1020a7984afSLeah Neukirchen
103eaa006daSBram Moolenaar  new Xautoread
104eaa006daSBram Moolenaar  setlocal autoread
105eaa006daSBram Moolenaar  call setline(1, 'foo')
1060a7984afSLeah Neukirchen  w!
107*944eeb44SBram Moolenaar  sleep 10m
108*944eeb44SBram Moolenaar  call writefile(['bar'], 'Xautoread')
109accf4ed3SBram Moolenaar  sleep 10m
1100a7984afSLeah Neukirchen  checktime
1110a7984afSLeah Neukirchen  call assert_equal('bar', trim(getline(1)))
112eaa006daSBram Moolenaar
1130a7984afSLeah Neukirchen  call delete('Xautoread')
1140a7984afSLeah Neukirchenendfunc
1150a7984afSLeah Neukirchen
116386bc82aSBram Moolenaarfunc Test_autoread_file_deleted()
117386bc82aSBram Moolenaar  new Xautoread
118386bc82aSBram Moolenaar  set autoread
119386bc82aSBram Moolenaar  call setline(1, 'original')
120386bc82aSBram Moolenaar  w!
121386bc82aSBram Moolenaar
122386bc82aSBram Moolenaar  call SleepForTimestamp()
123386bc82aSBram Moolenaar  if has('win32')
124386bc82aSBram Moolenaar    silent !echo changed > Xautoread
125386bc82aSBram Moolenaar  else
126386bc82aSBram Moolenaar    silent !echo 'changed' > Xautoread
127386bc82aSBram Moolenaar  endif
128386bc82aSBram Moolenaar  checktime
129386bc82aSBram Moolenaar  call assert_equal('changed', trim(getline(1)))
130386bc82aSBram Moolenaar
131386bc82aSBram Moolenaar  call SleepForTimestamp()
132386bc82aSBram Moolenaar  messages clear
133386bc82aSBram Moolenaar  if has('win32')
134386bc82aSBram Moolenaar    silent !del Xautoread
135386bc82aSBram Moolenaar  else
136386bc82aSBram Moolenaar    silent !rm Xautoread
137386bc82aSBram Moolenaar  endif
138386bc82aSBram Moolenaar  checktime
139386bc82aSBram Moolenaar  call assert_match('E211:', execute('messages'))
140386bc82aSBram Moolenaar  call assert_equal('changed', trim(getline(1)))
141386bc82aSBram Moolenaar
142386bc82aSBram Moolenaar  call SleepForTimestamp()
143386bc82aSBram Moolenaar  if has('win32')
144386bc82aSBram Moolenaar    silent !echo recreated > Xautoread
145386bc82aSBram Moolenaar  else
146386bc82aSBram Moolenaar    silent !echo 'recreated' > Xautoread
147386bc82aSBram Moolenaar  endif
148386bc82aSBram Moolenaar  checktime
149386bc82aSBram Moolenaar  call assert_equal('recreated', trim(getline(1)))
150386bc82aSBram Moolenaar
151386bc82aSBram Moolenaar  call delete('Xautoread')
152386bc82aSBram Moolenaar  bwipe!
153386bc82aSBram Moolenaarendfunc
154386bc82aSBram Moolenaar
155386bc82aSBram Moolenaar
1568767f52fSBram Moolenaarfunc Test_nonexistent_file()
1578767f52fSBram Moolenaar  let fname = 'Xtest.tmp'
1588767f52fSBram Moolenaar
1598767f52fSBram Moolenaar  call delete(fname)
1608767f52fSBram Moolenaar  call assert_equal(-1, getftime(fname))
1618767f52fSBram Moolenaar  call assert_equal(-1, getfsize(fname))
1628767f52fSBram Moolenaar  call assert_equal('', getftype(fname))
1638767f52fSBram Moolenaar  call assert_equal('', getfperm(fname))
1648767f52fSBram Moolenaarendfunc
1658767f52fSBram Moolenaar
1661598f993SBram Moolenaarfunc Test_getftype()
1671598f993SBram Moolenaar  call assert_equal('file', getftype(v:progpath))
1681598f993SBram Moolenaar  call assert_equal('dir',  getftype('.'))
1691598f993SBram Moolenaar
1701598f993SBram Moolenaar  if !has('unix')
1711598f993SBram Moolenaar    return
1721598f993SBram Moolenaar  endif
1731598f993SBram Moolenaar
1741598f993SBram Moolenaar  silent !ln -s Xfile Xlink
1751598f993SBram Moolenaar  call assert_equal('link', getftype('Xlink'))
1761598f993SBram Moolenaar  call delete('Xlink')
1771598f993SBram Moolenaar
1781598f993SBram Moolenaar  if executable('mkfifo')
1791598f993SBram Moolenaar    silent !mkfifo Xfifo
1801598f993SBram Moolenaar    call assert_equal('fifo', getftype('Xfifo'))
1811598f993SBram Moolenaar    call delete('Xfifo')
1821598f993SBram Moolenaar  endif
1831598f993SBram Moolenaar
1841598f993SBram Moolenaar  for cdevfile in systemlist('find /dev -type c -maxdepth 2 2>/dev/null')
185ad5db44cSBram Moolenaar    " On Mac /def/fd/2 is found but the type is "fifo"
186ad5db44cSBram Moolenaar    if cdevfile !~ '/dev/fd/'
1873b3a506fSBram Moolenaar      let type = getftype(cdevfile)
1883b3a506fSBram Moolenaar      " ignore empty result, can happen if the file disappeared
1893b3a506fSBram Moolenaar      if type != ''
190ad5db44cSBram Moolenaar	call assert_equal('cdev', type, 'for ' .. cdevfile)
191ad5db44cSBram Moolenaar      endif
1923b3a506fSBram Moolenaar    endif
1931598f993SBram Moolenaar  endfor
1941598f993SBram Moolenaar
1951598f993SBram Moolenaar  for bdevfile in systemlist('find /dev -type b -maxdepth 2 2>/dev/null')
1963b3a506fSBram Moolenaar    let type = getftype(bdevfile)
1973b3a506fSBram Moolenaar    " ignore empty result, can happen if the file disappeared
1983b3a506fSBram Moolenaar    if type != ''
199ad5db44cSBram Moolenaar      call assert_equal('bdev', type, 'for ' .. bdevfile)
2003b3a506fSBram Moolenaar    endif
2011598f993SBram Moolenaar  endfor
2021598f993SBram Moolenaar
2031598f993SBram Moolenaar  " The /run/ directory typically contains socket files.
2041598f993SBram Moolenaar  " If it does not, test won't fail but will not test socket files.
2051598f993SBram Moolenaar  for socketfile in systemlist('find /run -type s -maxdepth 2 2>/dev/null')
2063b3a506fSBram Moolenaar    let type = getftype(socketfile)
2073b3a506fSBram Moolenaar    " ignore empty result, can happen if the file disappeared
2083b3a506fSBram Moolenaar    if type != ''
209ad5db44cSBram Moolenaar      call assert_equal('socket', type, 'for ' .. socketfile)
2103b3a506fSBram Moolenaar    endif
2111598f993SBram Moolenaar  endfor
2121598f993SBram Moolenaar
2131598f993SBram Moolenaar  " TODO: file type 'other' is not tested. How can we test it?
2141598f993SBram Moolenaarendfunc
2151598f993SBram Moolenaar
2168767f52fSBram Moolenaarfunc Test_win32_symlink_dir()
2178767f52fSBram Moolenaar  " On Windows, non-admin users cannot create symlinks.
2188767f52fSBram Moolenaar  " So we use an existing symlink for this test.
2196d91bcb4SBram Moolenaar  CheckMSWindows
2208767f52fSBram Moolenaar  " Check if 'C:\Users\All Users' is a symlink to a directory.
2218767f52fSBram Moolenaar  let res = system('dir C:\Users /a')
2228767f52fSBram Moolenaar  if match(res, '\C<SYMLINKD> *All Users') >= 0
2238767f52fSBram Moolenaar    " Get the filetype of the symlink.
2248767f52fSBram Moolenaar    call assert_equal('dir', getftype('C:\Users\All Users'))
2256d91bcb4SBram Moolenaar  else
2266d91bcb4SBram Moolenaar    throw 'Skipped: cannot find an existing symlink'
2278767f52fSBram Moolenaar  endif
2288767f52fSBram Moolenaarendfunc
2296d91bcb4SBram Moolenaar
2306d91bcb4SBram Moolenaar" vim: shiftwidth=2 sts=2 expandtab
231