summaryrefslogtreecommitdiff
path: root/test/test_fileutils.py
diff options
context:
space:
mode:
authorLaurent Peuch <cortex@worlddomination.be>2020-03-20 14:18:08 +0100
committerLaurent Peuch <cortex@worlddomination.be>2020-03-20 14:18:08 +0100
commit2f92ba46d9801839063d940dfcf1f0d46c576b9d (patch)
tree171f7e33b04c3a60392d5279de175db3ef6243e4 /test/test_fileutils.py
parentdb91eae86a35dabbfd5986a1b1a10696ae3749ed (diff)
downloadlogilab-common-2f92ba46d9801839063d940dfcf1f0d46c576b9d.tar.gz
[tox] move to pytest
Diffstat (limited to 'test/test_fileutils.py')
-rw-r--r--test/test_fileutils.py146
1 files changed, 146 insertions, 0 deletions
diff --git a/test/test_fileutils.py b/test/test_fileutils.py
new file mode 100644
index 0000000..555e73f
--- /dev/null
+++ b/test/test_fileutils.py
@@ -0,0 +1,146 @@
+# copyright 2003-2012 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
+# contact http://www.logilab.fr/ -- mailto:contact@logilab.fr
+#
+# This file is part of logilab-common.
+#
+# logilab-common is free software: you can redistribute it and/or modify it under
+# the terms of the GNU Lesser General Public License as published by the Free
+# Software Foundation, either version 2.1 of the License, or (at your option) any
+# later version.
+#
+# logilab-common is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+# FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
+# details.
+#
+# You should have received a copy of the GNU Lesser General Public License along
+# with logilab-common. If not, see <http://www.gnu.org/licenses/>.
+"""unit tests for logilab.common.fileutils"""
+
+import doctest
+import io
+import sys, os, tempfile, shutil
+from stat import S_IWRITE
+from os.path import join
+
+from logilab.common.testlib import TestCase, unittest_main, unittest
+
+from logilab.common.fileutils import *
+
+DATA_DIR = join(os.path.abspath(os.path.dirname(__file__)), 'data')
+NEWLINES_TXT = join(DATA_DIR, 'newlines.txt')
+
+
+class FirstleveldirectoryTC(TestCase):
+
+ def test_known_values_first_level_directory(self):
+ """return the first level directory of a path"""
+ self.assertEqual(first_level_directory('truc/bidule/chouette'), 'truc', None)
+ self.assertEqual(first_level_directory('/truc/bidule/chouette'), '/', None)
+
+class IsBinaryTC(TestCase):
+ def test(self):
+ self.assertEqual(is_binary('toto.txt'), 0)
+ #self.assertEqual(is_binary('toto.xml'), 0)
+ self.assertEqual(is_binary('toto.bin'), 1)
+ self.assertEqual(is_binary('toto.sxi'), 1)
+ self.assertEqual(is_binary('toto.whatever'), 1)
+
+class GetModeTC(TestCase):
+ def test(self):
+ self.assertEqual(write_open_mode('toto.txt'), 'w')
+ #self.assertEqual(write_open_mode('toto.xml'), 'w')
+ self.assertEqual(write_open_mode('toto.bin'), 'wb')
+ self.assertEqual(write_open_mode('toto.sxi'), 'wb')
+
+class NormReadTC(TestCase):
+ def test_known_values_norm_read(self):
+ with io.open(NEWLINES_TXT) as f:
+ data = f.read()
+ self.assertEqual(data.strip(), '\n'.join(['# mixed new lines', '1', '2', '3']))
+
+
+class LinesTC(TestCase):
+ def test_known_values_lines(self):
+ self.assertEqual(lines(NEWLINES_TXT),
+ ['# mixed new lines', '1', '2', '3'])
+
+ def test_known_values_lines_comment(self):
+ self.assertEqual(lines(NEWLINES_TXT, comments='#'),
+ ['1', '2', '3'])
+
+class ExportTC(TestCase):
+ def setUp(self):
+ self.tempdir = tempfile.mktemp()
+ os.mkdir(self.tempdir)
+
+ def test(self):
+ export(DATA_DIR, self.tempdir, verbose=0)
+ self.assertTrue(exists(join(self.tempdir, '__init__.py')))
+ self.assertTrue(exists(join(self.tempdir, 'sub')))
+ self.assertTrue(not exists(join(self.tempdir, '__init__.pyc')))
+ self.assertTrue(not exists(join(self.tempdir, 'CVS')))
+
+ def tearDown(self):
+ shutil.rmtree(self.tempdir)
+
+class ProtectedFileTC(TestCase):
+ def setUp(self):
+ self.rpath = join(DATA_DIR, 'write_protected_file.txt')
+ self.rwpath = join(DATA_DIR, 'normal_file.txt')
+ # Make sure rpath is not writable !
+ os.chmod(self.rpath, 33060)
+ # Make sure rwpath is writable !
+ os.chmod(self.rwpath, 33188)
+
+ def test_mode_change(self):
+ """tests that mode is changed when needed"""
+ # test on non-writable file
+ #self.assertTrue(not os.access(self.rpath, os.W_OK))
+ self.assertTrue(not os.stat(self.rpath).st_mode & S_IWRITE)
+ wp_file = ProtectedFile(self.rpath, 'w')
+ self.assertTrue(os.stat(self.rpath).st_mode & S_IWRITE)
+ self.assertTrue(os.access(self.rpath, os.W_OK))
+ # test on writable-file
+ self.assertTrue(os.stat(self.rwpath).st_mode & S_IWRITE)
+ self.assertTrue(os.access(self.rwpath, os.W_OK))
+ wp_file = ProtectedFile(self.rwpath, 'w')
+ self.assertTrue(os.stat(self.rwpath).st_mode & S_IWRITE)
+ self.assertTrue(os.access(self.rwpath, os.W_OK))
+
+ def test_restore_on_close(self):
+ """tests original mode is restored on close"""
+ # test on non-writable file
+ #self.assertTrue(not os.access(self.rpath, os.W_OK))
+ self.assertTrue(not os.stat(self.rpath).st_mode & S_IWRITE)
+ ProtectedFile(self.rpath, 'w').close()
+ #self.assertTrue(not os.access(self.rpath, os.W_OK))
+ self.assertTrue(not os.stat(self.rpath).st_mode & S_IWRITE)
+ # test on writable-file
+ self.assertTrue(os.access(self.rwpath, os.W_OK))
+ self.assertTrue(os.stat(self.rwpath).st_mode & S_IWRITE)
+ ProtectedFile(self.rwpath, 'w').close()
+ self.assertTrue(os.access(self.rwpath, os.W_OK))
+ self.assertTrue(os.stat(self.rwpath).st_mode & S_IWRITE)
+
+ def test_mode_change_on_append(self):
+ """tests that mode is changed when file is opened in 'a' mode"""
+ #self.assertTrue(not os.access(self.rpath, os.W_OK))
+ self.assertTrue(not os.stat(self.rpath).st_mode & S_IWRITE)
+ wp_file = ProtectedFile(self.rpath, 'a')
+ self.assertTrue(os.access(self.rpath, os.W_OK))
+ self.assertTrue(os.stat(self.rpath).st_mode & S_IWRITE)
+ wp_file.close()
+ #self.assertTrue(not os.access(self.rpath, os.W_OK))
+ self.assertTrue(not os.stat(self.rpath).st_mode & S_IWRITE)
+
+
+if sys.version_info < (3, 0):
+ def load_tests(loader, tests, ignore):
+ from logilab.common import fileutils
+ tests.addTests(doctest.DocTestSuite(fileutils))
+ return tests
+
+
+if __name__ == '__main__':
+ unittest_main()