# Copyright (C) 2003 Python Software Foundation
from test
import test_support
from test
.test_support
import TESTFN
class TestShutil(unittest
.TestCase
):
def test_rmtree_errors(self
):
# filename is guaranteed not to exist
filename
= tempfile
.mktemp()
self
.assertRaises(OSError, shutil
.rmtree
, filename
)
if (hasattr(os
, 'chmod') and sys
.platform
[:6] != 'cygwin'
and not (hasattr(os
, 'geteuid') and os
.geteuid() == 0)):
self
.childpath
= os
.path
.join(TESTFN
, 'a')
f
= open(self
.childpath
, 'w')
old_dir_mode
= os
.stat(TESTFN
).st_mode
old_child_mode
= os
.stat(self
.childpath
).st_mode
os
.chmod(self
.childpath
, stat
.S_IREAD
)
os
.chmod(TESTFN
, stat
.S_IREAD
)
shutil
.rmtree(TESTFN
, onerror
=self
.check_args_to_onerror
)
# Test whether onerror has actually been called.
self
.assertEqual(self
.errorState
, 2)
os
.chmod(TESTFN
, old_dir_mode
)
os
.chmod(self
.childpath
, old_child_mode
)
def check_args_to_onerror(self
, func
, arg
, exc
):
self
.assertEqual(func
, os
.remove
)
self
.assertEqual(arg
, self
.childpath
)
self
.assertEqual(exc
[0], OSError)
self
.assertEqual(func
, os
.rmdir
)
self
.assertEqual(arg
, TESTFN
)
self
.assertEqual(exc
[0], OSError)
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
)
def test_dont_move_dir_in_itself(self
):
src_dir
= tempfile
.mkdtemp()
dst
= os
.path
.join(src_dir
, 'foo')
self
.assertRaises(shutil
.Error
, shutil
.move
, src_dir
, dst
)
if hasattr(os
, "symlink"):
def test_dont_copy_file_onto_link_to_itself(self
):
src
= os
.path
.join(TESTFN
, 'cheese')
dst
= os
.path
.join(TESTFN
, 'shop')
self
.assertRaises(shutil
.Error
, shutil
.copyfile
, src
, dst
)
self
.assertEqual(open(src
,'r').read(), 'cheddar')
# Using `src` here would mean we end up with a symlink pointing
# to TESTFN/TESTFN/cheese, while it should point at
os
.symlink('cheese', dst
)
self
.assertRaises(shutil
.Error
, shutil
.copyfile
, src
, dst
)
self
.assertEqual(open(src
,'r').read(), 'cheddar')
test_support
.run_unittest(TestShutil
)
if __name__
== '__main__':