#!/usr/bin/env python import os import shutil import unittest import mozfile import mozunit import stubs class MozfileCopyContentsTestCase(unittest.TestCase): """Test our ability to copy the contents of directories""" def _directory_is_subset(self, set_, subset_): """ Confirm that all the contents of 'subset_' are contained in 'set_' """ names = os.listdir(subset_) for name in names: full_set_path = os.path.join(set_, name) full_subset_path = os.path.join(subset_, name) if os.path.isdir(full_subset_path): self.assertTrue(os.path.isdir(full_set_path)) self._directory_is_subset(full_set_path, full_subset_path) elif os.path.islink(full_subset_path): self.assertTrue(os.path.islink(full_set_path)) else: self.assertTrue(os.stat(full_set_path)) def _directories_are_equal(self, dir1, dir2): """ Confirm that the contents of 'dir1' are the same as 'dir2' """ names1 = os.listdir(dir1) names2 = os.listdir(dir2) self.assertTrue(len(names1) == len(names2)) for name in names1: self.assertTrue(name in names2) dir1_path = os.path.join(dir1, name) dir2_path = os.path.join(dir2, name) if os.path.isdir(dir1_path): self.assertTrue(os.path.isdir(dir2_path)) self._directories_are_equal(dir1_path, dir2_path) elif os.path.islink(dir1_path): self.assertTrue(os.path.islink(dir2_path)) else: self.assertTrue(os.stat(dir2_path)) def test_copy_empty_directory(self): tempdir = stubs.create_empty_stub() dstdir = stubs.create_empty_stub() self.assertTrue(os.path.isdir(tempdir)) mozfile.copy_contents(tempdir, dstdir) self._directories_are_equal(dstdir, tempdir) if os.path.isdir(tempdir): shutil.rmtree(tempdir) if os.path.isdir(dstdir): shutil.rmtree(dstdir) def test_copy_full_directory(self): tempdir = stubs.create_stub() dstdir = stubs.create_empty_stub() self.assertTrue(os.path.isdir(tempdir)) mozfile.copy_contents(tempdir, dstdir) self._directories_are_equal(dstdir, tempdir) if os.path.isdir(tempdir): shutil.rmtree(tempdir) if os.path.isdir(dstdir): shutil.rmtree(dstdir) def test_copy_full_directory_with_existing_file(self): tempdir = stubs.create_stub() dstdir = stubs.create_empty_stub() filename = "i_dont_exist_in_tempdir" f = open(os.path.join(dstdir, filename), "w") f.write("Hello World") f.close() self.assertTrue(os.path.isdir(tempdir)) mozfile.copy_contents(tempdir, dstdir) self._directory_is_subset(dstdir, tempdir) self.assertTrue(os.path.exists(os.path.join(dstdir, filename))) if os.path.isdir(tempdir): shutil.rmtree(tempdir) if os.path.isdir(dstdir): shutil.rmtree(dstdir) def test_copy_full_directory_with_overlapping_file(self): tempdir = stubs.create_stub() dstdir = stubs.create_empty_stub() filename = "i_do_exist_in_tempdir" for d in [tempdir, dstdir]: f = open(os.path.join(d, filename), "w") f.write("Hello " + d) f.close() self.assertTrue(os.path.isdir(tempdir)) self.assertTrue(os.path.exists(os.path.join(tempdir, filename))) self.assertTrue(os.path.exists(os.path.join(dstdir, filename))) line = open(os.path.join(dstdir, filename), "r").readlines()[0] self.assertTrue(line == "Hello " + dstdir) mozfile.copy_contents(tempdir, dstdir) line = open(os.path.join(dstdir, filename), "r").readlines()[0] self.assertTrue(line == "Hello " + tempdir) self._directories_are_equal(tempdir, dstdir) if os.path.isdir(tempdir): shutil.rmtree(tempdir) if os.path.isdir(dstdir): shutil.rmtree(dstdir) if __name__ == "__main__": mozunit.main()