10c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi"""
20c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi  Test cases for the dircache module
30c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi  Nick Mathewson
40c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi"""
50c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
60c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiimport unittest
70c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yifrom test.test_support import run_unittest, import_module
80c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yidircache = import_module('dircache', deprecated=True)
90c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiimport os, time, sys, tempfile
100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass DircacheTests(unittest.TestCase):
130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def setUp(self):
140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.tempdir = tempfile.mkdtemp()
150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def tearDown(self):
170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        for fname in os.listdir(self.tempdir):
180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.delTemp(fname)
190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        os.rmdir(self.tempdir)
200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def writeTemp(self, fname):
220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        f = open(os.path.join(self.tempdir, fname), 'w')
230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        f.close()
240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def mkdirTemp(self, fname):
260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        os.mkdir(os.path.join(self.tempdir, fname))
270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def delTemp(self, fname):
290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        fname = os.path.join(self.tempdir, fname)
300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        if os.path.isdir(fname):
310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            os.rmdir(fname)
320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        else:
330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            os.unlink(fname)
340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_listdir(self):
360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ## SUCCESSFUL CASES
370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        entries = dircache.listdir(self.tempdir)
380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(entries, [])
390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Check that cache is actually caching, not just passing through.
410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertTrue(dircache.listdir(self.tempdir) is entries)
420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Directories aren't "files" on Windows, and directory mtime has
440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # nothing to do with when files under a directory get created.
450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # That is, this test can't possibly work under Windows -- dircache
460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # is only good for capturing a one-shot snapshot there.
470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        if sys.platform[:3] not in ('win', 'os2'):
490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            # Sadly, dircache has the same granularity as stat.mtime, and so
500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            # can't notice any changes that occurred within 1 sec of the last
510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            # time it examined a directory.
520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            time.sleep(1)
530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.writeTemp("test1")
540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            entries = dircache.listdir(self.tempdir)
550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.assertEqual(entries, ['test1'])
560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.assertTrue(dircache.listdir(self.tempdir) is entries)
570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ## UNSUCCESSFUL CASES
590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertRaises(OSError, dircache.listdir, self.tempdir+"_nonexistent")
600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_annotate(self):
620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.writeTemp("test2")
630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.mkdirTemp("A")
640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        lst = ['A', 'test2', 'test_nonexistent']
650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        dircache.annotate(self.tempdir, lst)
660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(lst, ['A/', 'test2', 'test_nonexistent'])
670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yidef test_main():
700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    try:
710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        run_unittest(DircacheTests)
720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    finally:
730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        dircache.reset()
740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiif __name__ == "__main__":
770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    test_main()
78