예제 #1
0
    def test_listdir_with_stat_success(self):
        mock_glfs_opendir = Mock()
        mock_glfs_opendir.return_value = 2

        dirent1 = api.Dirent()
        dirent1.d_name = "mockfile"
        dirent1.d_reclen = 8
        stat1 = api.Stat()
        stat1.st_nlink = 1
        dirent2 = api.Dirent()
        dirent2.d_name = "mockdir"
        dirent2.d_reclen = 7
        stat2 = api.Stat()
        stat2.st_nlink = 2
        dirent3 = api.Dirent()
        dirent3.d_name = "."
        dirent3.d_reclen = 1
        stat3 = api.Stat()
        stat3.n_link = 2
        mock_Dir_next = Mock()
        mock_Dir_next.side_effect = [(dirent1, stat1),
                                     (dirent2, stat2),
                                     (dirent3, stat3),
                                     StopIteration]

        with nested(patch("gluster.gfapi.api.glfs_opendir",
                          mock_glfs_opendir),
                    patch("gluster.gfapi.Dir.next", mock_Dir_next)):
            d = self.vol.listdir_with_stat("testdir")
            self.assertEqual(len(d), 2)
            self.assertEqual(d[0][0], 'mockfile')
            self.assertEqual(d[0][1].st_nlink, 1)
            self.assertEqual(d[1][0], 'mockdir')
            self.assertEqual(d[1][1].st_nlink, 2)
예제 #2
0
    def test_copytree_success(self):
        d_stat = api.Stat()
        d_stat.st_mode = stat.S_IFDIR
        f_stat = api.Stat()
        f_stat.st_mode = stat.S_IFREG
        # Depth = 0
        iter1 = [('dir1', d_stat), ('dir2', d_stat), ('file1', f_stat)]
        # Depth = 1, dir1
        iter2 = [('file2', f_stat), ('file3', f_stat)]
        # Depth = 1, dir2
        iter3 = [('file4', f_stat), ('dir3', d_stat), ('file5', f_stat)]
        # Depth = 2, dir3
        iter4 = []  # Empty directory.
        # So there are 5 files in total that should to be copied
        # and (3 + 1) directories should be created, including the destination

        m_list_s = Mock(side_effect=[iter1, iter2, iter3, iter4])
        m_makedirs = Mock()
        m_fopen = MagicMock()
        m_copyfileobj = Mock()
        m_utime = Mock()
        m_chmod = Mock()
        m_copystat = Mock()
        with patch("gluster.gfapi.Volume.listdir_with_stat", m_list_s):
            with patch("gluster.gfapi.Volume.makedirs", m_makedirs):
                with patch("gluster.gfapi.Volume.fopen", m_fopen):
                    with patch("gluster.gfapi.Volume.copyfileobj",
                               m_copyfileobj):
                        with patch("gluster.gfapi.Volume.utime", m_utime):
                            with patch("gluster.gfapi.Volume.chmod", m_chmod):
                                with patch("gluster.gfapi.Volume.copystat",
                                           m_copystat):
                                    self.vol.copytree('/source',
                                                      '/destination')

        # Assert that listdir_with_stat() was called on all directories
        self.assertEqual(m_list_s.call_count, 3 + 1)
        # Assert that fopen() was called 10 times - twice for each file
        # i.e once for reading and another time for writing.
        self.assertEqual(m_fopen.call_count, 10)
        # Assert number of files copied
        self.assertEqual(m_copyfileobj.call_count, 5)
        # Assert that utime and chmod was called on the files
        self.assertEqual(m_utime.call_count, 5)
        self.assertEqual(m_chmod.call_count, 5)
        # Assert number of directories created
        self.assertEqual(m_makedirs.call_count, 3 + 1)
        # Assert that copystat() was called on source and destination dir
        m_copystat.called_once_with('/source', '/destination')
예제 #3
0
    def test_scandir_success(self):
        mock_glfs_opendir = Mock()
        mock_glfs_opendir.return_value = 2

        dirent1 = api.Dirent()
        dirent1.d_name = "mockfile"
        dirent1.d_reclen = 8
        stat1 = api.Stat()
        stat1.st_nlink = 1
        stat1.st_mode = 33188
        dirent2 = api.Dirent()
        dirent2.d_name = "mockdir"
        dirent2.d_reclen = 7
        stat2 = api.Stat()
        stat2.st_nlink = 2
        stat2.st_mode = 16877
        dirent3 = api.Dirent()
        dirent3.d_name = "."
        dirent3.d_reclen = 1
        stat3 = api.Stat()
        stat3.n_link = 2
        stat3.st_mode = 16877
        mock_Dir_next = Mock()
        mock_Dir_next.side_effect = [(dirent1, stat1),
                                     (dirent2, stat2),
                                     (dirent3, stat3),
                                     StopIteration]

        with nested(patch("gluster.gfapi.api.glfs_opendir",
                          mock_glfs_opendir),
                    patch("gluster.gfapi.Dir.next", mock_Dir_next)):
            i = 0
            for entry in self.vol.scandir("testdir"):
                self.assertTrue(isinstance(entry, DirEntry))
                if entry.name == 'mockfile':
                    self.assertEqual(entry.path, 'testdir/mockfile')
                    self.assertTrue(entry.is_file())
                    self.assertFalse(entry.is_dir())
                    self.assertEqual(entry.stat().st_nlink, 1)
                elif entry.name == 'mockdir':
                    self.assertEqual(entry.path, 'testdir/mockdir')
                    self.assertTrue(entry.is_dir())
                    self.assertFalse(entry.is_file())
                    self.assertEqual(entry.stat().st_nlink, 2)
                else:
                    self.fail("Unexpected entry")
                i = i + 1
            self.assertEqual(i, 2)
예제 #4
0
    def test_walk_success(self):
        s_dir = api.Stat()
        s_dir.st_mode = stat.S_IFDIR
        d1 = DirEntry(Mock(), 'dirpath', 'dir1', s_dir)
        d2 = DirEntry(Mock(), 'dirpath', 'dir2', s_dir)
        s_file = api.Stat()
        s_file.st_mode = stat.S_IFREG
        d3 = DirEntry(Mock(), 'dirpath', 'file1', s_file)
        d4 = DirEntry(Mock(), 'dirpath', 'file2', s_file)
        mock_scandir = MagicMock()
        mock_scandir.return_value = [d1, d3, d2, d4]

        with patch("gluster.gfapi.Volume.scandir", mock_scandir):
            for (path, dirs, files) in self.vol.walk("dirpath"):
                self.assertEqual(dirs, ['dir1', 'dir2'])
                self.assertEqual(files, ['file1', 'file2'])
                break
예제 #5
0
    def test_islink_false(self):
        mock_glfs_lstat = Mock()
        s = api.Stat()
        s.st_mode = stat.S_IFREG
        mock_glfs_lstat.return_value = s

        with patch("gluster.gfapi.Volume.lstat", mock_glfs_lstat):
            ret = self.vol.islink("file")
            self.assertFalse(ret)
예제 #6
0
    def test_islink_true(self):
        mock_glfs_lstat = Mock()
        s = api.Stat()
        s.st_mode = stat.S_IFLNK
        mock_glfs_lstat.return_value = s

        with patch("gluster.gfapi.Volume.lstat", mock_glfs_lstat):
            ret = self.vol.islink("solnk")
            self.assertTrue(ret)
예제 #7
0
    def test_isfile_false(self):
        mock_glfs_stat = Mock()
        s = api.Stat()
        s.st_mode = stat.S_IFDIR
        mock_glfs_stat.return_value = s

        with patch("gluster.gfapi.Volume.stat", mock_glfs_stat):
            ret = self.vol.isfile("dir")
            self.assertFalse(ret)
예제 #8
0
    def test_isfile_true(self):
        mock_glfs_stat = Mock()
        s = api.Stat()
        s.st_mode = stat.S_IFREG
        mock_glfs_stat.return_value = s

        with patch("gluster.gfapi.Volume.stat", mock_glfs_stat):
            ret = self.vol.isfile("file")
            self.assertTrue(ret)
예제 #9
0
    def test_rmtree_success(self):
        s_file = api.Stat()
        s_file.st_mode = stat.S_IFREG
        d = DirEntry(None, 'dirpath', 'file1', s_file)
        mock_scandir = MagicMock()
        mock_scandir.return_value = [d]

        mock_unlink = Mock()
        mock_rmdir = Mock()
        mock_islink = Mock(return_value=False)

        with nested(patch("gluster.gfapi.Volume.scandir", mock_scandir),
                    patch("gluster.gfapi.Volume.islink", mock_islink),
                    patch("gluster.gfapi.Volume.unlink", mock_unlink),
                    patch("gluster.gfapi.Volume.rmdir", mock_rmdir)):
            self.vol.rmtree("dirpath")

        mock_islink.assert_called_once_with("dirpath")
        mock_unlink.assert_called_once_with("dirpath/file1")
        mock_rmdir.assert_called_once_with("dirpath")
예제 #10
0
    def test_rmtree_ignore_unlink_rmdir_exception(self):
        s_file = api.Stat()
        s_file.st_mode = stat.S_IFREG
        d = DirEntry(None, 'dirpath', 'file1', s_file)
        mock_scandir = MagicMock()
        mock_scandir.return_value = [d]

        mock_unlink = Mock(side_effect=OSError)
        mock_rmdir = Mock(side_effect=OSError)
        mock_islink = Mock(return_value=False)

        with patch("gluster.gfapi.Volume.scandir", mock_scandir):
            with patch("gluster.gfapi.Volume.islink", mock_islink):
                with patch("gluster.gfapi.Volume.unlink", mock_unlink):
                    with patch("gluster.gfapi.Volume.rmdir", mock_rmdir):
                        self.vol.rmtree("dirpath", True)

        mock_islink.assert_called_once_with("dirpath")
        mock_unlink.assert_called_once_with("dirpath/file1")
        mock_rmdir.assert_called_once_with("dirpath")