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