14adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao"""
24adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao  Test cases for the dircache module
34adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao  Nick Mathewson
44adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao"""
54adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
64adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoimport unittest
74adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaofrom test.test_support import run_unittest, import_module
84adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodircache = import_module('dircache', deprecated=True)
94adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoimport os, time, sys, tempfile
104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass DircacheTests(unittest.TestCase):
134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def setUp(self):
144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.tempdir = tempfile.mkdtemp()
154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def tearDown(self):
174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        for fname in os.listdir(self.tempdir):
184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.delTemp(fname)
194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        os.rmdir(self.tempdir)
204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def writeTemp(self, fname):
224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        f = open(os.path.join(self.tempdir, fname), 'w')
234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        f.close()
244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def mkdirTemp(self, fname):
264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        os.mkdir(os.path.join(self.tempdir, fname))
274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def delTemp(self, fname):
294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        fname = os.path.join(self.tempdir, fname)
304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if os.path.isdir(fname):
314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            os.rmdir(fname)
324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        else:
334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            os.unlink(fname)
344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_listdir(self):
364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ## SUCCESSFUL CASES
374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        entries = dircache.listdir(self.tempdir)
384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(entries, [])
394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Check that cache is actually caching, not just passing through.
414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(dircache.listdir(self.tempdir) is entries)
424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Directories aren't "files" on Windows, and directory mtime has
444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # nothing to do with when files under a directory get created.
454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # That is, this test can't possibly work under Windows -- dircache
464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # is only good for capturing a one-shot snapshot there.
474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if sys.platform[:3] not in ('win', 'os2'):
494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # Sadly, dircache has the same granularity as stat.mtime, and so
504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # can't notice any changes that occurred within 1 sec of the last
514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # time it examined a directory.
524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            time.sleep(1)
534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.writeTemp("test1")
544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            entries = dircache.listdir(self.tempdir)
554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertEqual(entries, ['test1'])
564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertTrue(dircache.listdir(self.tempdir) is entries)
574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ## UNSUCCESSFUL CASES
594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(OSError, dircache.listdir, self.tempdir+"_nonexistent")
604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_annotate(self):
624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.writeTemp("test2")
634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.mkdirTemp("A")
644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        lst = ['A', 'test2', 'test_nonexistent']
654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        dircache.annotate(self.tempdir, lst)
664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(lst, ['A/', 'test2', 'test_nonexistent'])
674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodef test_main():
704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    try:
714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        run_unittest(DircacheTests)
724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    finally:
734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        dircache.reset()
744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoif __name__ == "__main__":
774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    test_main()
78