2004-10-31 12:05:31 +00:00
|
|
|
|
2003-01-24 17:34:13 +00:00
|
|
|
# Copyright (C) 2003 Python Software Foundation
|
|
|
|
|
|
|
|
import unittest
|
|
|
|
import shutil
|
|
|
|
import tempfile
|
2004-10-31 12:05:31 +00:00
|
|
|
import stat
|
2004-06-19 21:11:35 +00:00
|
|
|
import os
|
|
|
|
import os.path
|
2003-01-24 17:34:13 +00:00
|
|
|
from test import test_support
|
2004-08-14 13:30:02 +00:00
|
|
|
from test.test_support import TESTFN
|
2003-01-24 17:34:13 +00:00
|
|
|
|
|
|
|
class TestShutil(unittest.TestCase):
|
|
|
|
def test_rmtree_errors(self):
|
|
|
|
# filename is guaranteed not to exist
|
|
|
|
filename = tempfile.mktemp()
|
|
|
|
self.assertRaises(OSError, shutil.rmtree, filename)
|
2004-10-31 12:05:31 +00:00
|
|
|
|
|
|
|
if hasattr(os, 'chmod'):
|
|
|
|
def test_on_error(self):
|
|
|
|
self.errorState = 0
|
|
|
|
os.mkdir(TESTFN)
|
|
|
|
f = open(os.path.join(TESTFN, 'a'), 'w')
|
|
|
|
f.close()
|
|
|
|
# Make TESTFN unwritable.
|
|
|
|
os.chmod(TESTFN, stat.S_IRUSR)
|
|
|
|
|
|
|
|
shutil.rmtree(TESTFN, onerror=self.check_args_to_onerror)
|
|
|
|
|
|
|
|
# Make TESTFN writable again.
|
|
|
|
os.chmod(TESTFN, stat.S_IRWXU)
|
|
|
|
shutil.rmtree(TESTFN)
|
|
|
|
|
|
|
|
def check_args_to_onerror(self, func, arg, exc):
|
|
|
|
if self.errorState == 0:
|
|
|
|
self.assertEqual(func, os.remove)
|
|
|
|
self.assertEqual(arg, os.path.join(TESTFN, 'a'))
|
|
|
|
self.assertEqual(exc[0], OSError)
|
|
|
|
self.errorState = 1
|
|
|
|
else:
|
|
|
|
self.assertEqual(func, os.rmdir)
|
|
|
|
self.assertEqual(arg, TESTFN)
|
|
|
|
self.assertEqual(exc[0], OSError)
|
2003-01-24 17:34:13 +00:00
|
|
|
|
2004-09-11 21:26:21 +00:00
|
|
|
def test_rmtree_dont_delete_file(self):
|
|
|
|
# When called on a file instead of a directory, don't delete it.
|
|
|
|
handle, path = tempfile.mkstemp()
|
|
|
|
os.fdopen(handle).close()
|
|
|
|
self.assertRaises(OSError, shutil.rmtree, path)
|
|
|
|
os.remove(path)
|
|
|
|
|
2004-06-19 21:11:35 +00:00
|
|
|
def test_dont_move_dir_in_itself(self):
|
|
|
|
src_dir = tempfile.mkdtemp()
|
|
|
|
try:
|
|
|
|
dst = os.path.join(src_dir, 'foo')
|
|
|
|
self.assertRaises(shutil.Error, shutil.move, src_dir, dst)
|
|
|
|
finally:
|
|
|
|
try:
|
|
|
|
os.rmdir(src_dir)
|
|
|
|
except:
|
|
|
|
pass
|
|
|
|
|
2004-08-14 13:30:02 +00:00
|
|
|
if hasattr(os, "symlink"):
|
|
|
|
def test_dont_copy_file_onto_link_to_itself(self):
|
|
|
|
# bug 851123.
|
|
|
|
os.mkdir(TESTFN)
|
2004-08-14 13:57:08 +00:00
|
|
|
src = os.path.join(TESTFN, 'cheese')
|
|
|
|
dst = os.path.join(TESTFN, 'shop')
|
2004-08-14 13:30:02 +00:00
|
|
|
try:
|
2004-08-14 13:57:08 +00:00
|
|
|
f = open(src, 'w')
|
2004-08-14 13:30:02 +00:00
|
|
|
f.write('cheddar')
|
|
|
|
f.close()
|
2004-08-14 13:57:08 +00:00
|
|
|
|
|
|
|
os.link(src, dst)
|
|
|
|
self.assertRaises(shutil.Error, shutil.copyfile, src, dst)
|
|
|
|
self.assertEqual(open(src,'r').read(), 'cheddar')
|
|
|
|
os.remove(dst)
|
|
|
|
|
|
|
|
# Using `src` here would mean we end up with a symlink pointing
|
|
|
|
# to TESTFN/TESTFN/cheese, while it should point at
|
|
|
|
# TESTFN/cheese.
|
|
|
|
os.symlink('cheese', dst)
|
|
|
|
self.assertRaises(shutil.Error, shutil.copyfile, src, dst)
|
|
|
|
self.assertEqual(open(src,'r').read(), 'cheddar')
|
|
|
|
os.remove(dst)
|
2004-08-14 13:30:02 +00:00
|
|
|
finally:
|
|
|
|
try:
|
|
|
|
shutil.rmtree(TESTFN)
|
|
|
|
except OSError:
|
|
|
|
pass
|
2004-06-19 21:11:35 +00:00
|
|
|
|
2003-01-24 17:34:13 +00:00
|
|
|
def test_main():
|
2003-05-01 17:45:56 +00:00
|
|
|
test_support.run_unittest(TestShutil)
|
2003-01-24 17:34:13 +00:00
|
|
|
|
|
|
|
if __name__ == '__main__':
|
2003-05-01 17:45:56 +00:00
|
|
|
test_main()
|