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)
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')
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)
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
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)
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)
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)
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)
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")
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")