# HG changeset patch # User Goffi # Date 1308572826 -7200 # Node ID 40ec9445060ade2c6a06a88bf947da773c42af2b # Parent 7830d4244fb54321657e9414396fbeab6a7086ec added test suit diff -r 7830d4244fb5 -r 40ec9445060a gcp_test.py --- a/gcp_test.py Mon Jun 20 14:25:08 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,118 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- - -""" -gcp: Goffi's CoPier -Copyright (C) 2010, 2011 Jérôme Poisson - (c) 2011 Thomas Preud'homme - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -This program 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 General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -""" - -from __future__ import with_statement -import tempfile -import unittest -from os import getcwd, chdir, system -from shutil import rmtree -from random import randrange -from hashlib import sha1 - -#size shorcuts -S10K = 1024 * 10 -S100K = 1024 * 100 -S1M = 1024 * 1024 -S10M = 1024 * 1024 * 10 -S100M = 1024 * 1024 * 100 - - -def sha1sum(filename, buf_size=4096): - csum = sha1() - with open(filename) as fd: - data = fd.read(buf_size) - while data: - csum.update(data) - data = fd.read(buf_size) - return csum.digest() - -#def makeRandomFile(path, size, buf_size=4096): -# """Create a fake file -# @param path: where the file is created -# @param size: size of the file to create in bytes""" -# def seq(size): -# return ''.join(chr(randrange(256)) for i in range(size)) -# fd = open(path, 'w') -# for byte in range(size//buf_size): -# fd.write(seq(buf_size)) -# fd.write(seq(size%buf_size)) -# fd.close() - -def makeRandomFile(path, size, buf_size=4096): - """Create a fake file using /dev/urandom - @param path: where the file is created - @param size: size of the file to create in bytes""" - source = open('/dev/urandom','r') - dest = open(path, 'w') - for byte in range(size//buf_size): - dest.write(source.read(buf_size)) - dest.write(source.read(size%buf_size)) - dest.close() - - -class TestCopyCases(unittest.TestCase): - """Test basic copy use cases, using gcp externally - gcp must be available in the PATH""" - #TODO: check journal - - def setUp(self): - self.ori_dir = getcwd() - self.tmp_dir = tempfile.mkdtemp() - chdir(self.tmp_dir) - - def tearDown(self): - chdir(self.ori_dir) - rmtree(self.tmp_dir) - - - def test_one_file_copy(self): - """Copy one file and test the result""" - makeRandomFile('file_1', S10K) - ori_sum = sha1sum('file_1') - ret = system("gcp file_1 file_2") - self.assertEqual(ret,0) - dest_sum = sha1sum('file_2') - self.assertEqual(ori_sum, dest_sum) - - def test_one_file_copy_already_exists(self): - """Check that an existing file is not overwritten""" - makeRandomFile('file_1', S10K) - makeRandomFile('file_2', S10K) - file_2_sum = sha1sum('file_2') - ret = system("gcp file_1 file_2") - self.assertNotEqual(ret,0) - file_2_sum_bis = sha1sum('file_2') - self.assertEqual(file_2_sum, file_2_sum_bis) - - def test_one_file_copy_already_exists_force(self): - """Check that an existing file is overwritten with --force""" - makeRandomFile('file_1', S10K) - makeRandomFile('file_2', S10K) - file_1_sum = sha1sum('file_1') - ret = system("gcp -f file_1 file_2") - self.assertEqual(ret,0) - file_2_sum_bis = sha1sum('file_2') - self.assertEqual(file_1_sum, file_2_sum_bis) - - -if __name__ == '__main__': - unittest.main() diff -r 7830d4244fb5 -r 40ec9445060a test_gcp.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test_gcp.py Mon Jun 20 14:27:06 2011 +0200 @@ -0,0 +1,226 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- + +""" +gcp: Goffi's CoPier +Copyright (C) 2010, 2011 Jérôme Poisson + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program 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 General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +""" + +from __future__ import with_statement +import tempfile +import unittest +from os import getcwd, chdir, system, mkdir, makedirs, listdir +from os.path import join, isdir +from shutil import rmtree +from random import randrange +from hashlib import sha1 + +#size shorcuts +S10K = 1024 * 10 +S100K = 1024 * 100 +S1M = 1024 * 1024 +S10M = 1024 * 1024 * 10 +S100M = 1024 * 1024 * 100 + + +def sha1sum(filename, buf_size=4096): + """Return the SHA1 hash of a file + @param filename: path to the file + @param buf_size: size of the buffer to use for calculation""" + csum = sha1() + with open(filename) as fd: + data = fd.read(buf_size) + while data: + csum.update(data) + data = fd.read(buf_size) + return csum.digest() + +def dirCheck(dir_path): + """Recursively calculate SHA1 sum of a dir + @param path: path of the dir to check + @return: a dict in the form [{filepath: sum,...}] + """ + def recursive_sum(directory, result): + for current_path in listdir(directory): + full_path = join(directory, current_path) + if isdir(full_path): + recursive_sum(full_path, result) + else: + result[full_path] = sha1sum(full_path) + + result = {} + _ori_dir = getcwd() + chdir(dir_path) + recursive_sum(".", result) + chdir(_ori_dir) + return result + +#def makeRandomFile(path, size, buf_size=4096): +# """Create a fake file +# @param path: where the file is created +# @param size: size of the file to create in bytes""" +# def seq(size): +# return ''.join(chr(randrange(256)) for i in range(size)) +# fd = open(path, 'w') +# for byte in range(size//buf_size): +# fd.write(seq(buf_size)) +# fd.write(seq(size%buf_size)) +# fd.close() + +def makeRandomFile(path, size=S10K, buf_size=4096): + """Create a fake file using /dev/urandom + @param path: where the file must be created + @param size: size of the file to create in bytes""" + source = open('/dev/urandom','r') + dest = open(path, 'w') + for byte in range(size//buf_size): + dest.write(source.read(buf_size)) + dest.write(source.read(size%buf_size)) + dest.close() + +def makeTestDir(path): + """Helper method to easily create a test dir + @param path: where the dir must be created""" + + for i in range(2): + subdir = join(path,'subdir_%d' % i) + makedirs(subdir) + for j in range(2): + makeRandomFile(join(subdir, 'file_%d' % j), S10K) + for i in range(2): + makeRandomFile(join(path,'file_%d' % i), S10K) + +class TestCopyCases(unittest.TestCase): + """Test basic copy use cases, using gcp externally + gcp must be available in the PATH""" + #TODO: check journal + + def setUp(self): + self.ori_dir = getcwd() + self.tmp_dir = tempfile.mkdtemp() + chdir(self.tmp_dir) + + def tearDown(self): + chdir(self.ori_dir) + rmtree(self.tmp_dir) + + def test_one_file_copy(self): + """Copy one file and test the result""" + makeRandomFile('file_1', S10K) + ori_sum = sha1sum('file_1') + ret = system("gcp file_1 file_2") + self.assertEqual(ret,0) + dest_sum = sha1sum('file_2') + self.assertEqual(ori_sum, dest_sum) + + def test_one_file_copy_already_exists(self): + """Check that an existing file is not overwritten""" + makeRandomFile('file_1', S10K) + makeRandomFile('file_2', S10K) + file_2_sum = sha1sum('file_2') + ret = system("gcp file_1 file_2") + self.assertNotEqual(ret,0) + file_2_sum_bis = sha1sum('file_2') + self.assertEqual(file_2_sum, file_2_sum_bis) + + def test_one_file_copy_already_exists_force(self): + """Check that an existing file is overwritten with --force""" + makeRandomFile('file_1', S10K) + makeRandomFile('file_2', S10K) + file_1_sum = sha1sum('file_1') + ret = system("gcp -f file_1 file_2") + self.assertEqual(ret,0) + file_2_sum_bis = sha1sum('file_2') + self.assertEqual(file_1_sum, file_2_sum_bis) + + def test_one_dir_copy(self): + """Check copy of one dir to a non existant path""" + makeTestDir('dir_1') + check_1 = dirCheck('dir_1') + ret = system("gcp -r dir_1 dir_2") + self.assertEqual(ret,0) + check_2 = dirCheck('dir_2') + self.assertEqual(check_1, check_2) + + def test_one_dir_copy_nocopy(self): + """Check that a dir is not copied without the recursive option""" + makeTestDir('dir_1') + check_before = dirCheck('.') + ret = system("gcp dir_1 dir_2") + self.assertEqual(ret,0) + check_after = dirCheck('.') + self.assertEqual(check_before, check_after) + + def test_one_dir_copy_existing_dest(self): + """Check that a dir is copied inside an existing destination""" + makeTestDir('dir_1') + mkdir('dir_2') + check_1 = dirCheck('dir_1') + ret = system("gcp -r dir_1 dir_2") + self.assertEqual(ret,0) + self.assertEqual(listdir('dir_2'), ['dir_1']) + check_2 = dirCheck('dir_2/dir_1') + self.assertEqual(check_1, check_2) + + def test_mixt_copy_existing_dest(self): + """Check that a mixt copy (files + dir) to an existing dest work as expected""" + for i in range(2): + makeRandomFile('file_%d' % i, S10K) + makeTestDir('dir_%d' % i) + check_1 = dirCheck('.') + mkdir('dest_dir') + ret = system("gcp -r file_0 file_1 dir_0 dir_1 dest_dir") + self.assertEqual(ret,0) + check_2 = dirCheck('dest_dir') + self.assertEqual(check_1, check_2) + + def test_mixt_copy_nonexisting_dest(self): + """Check that a mixt copy (files + dir) to an non existing dest work as expected + /!\\ the behavious is different of the one of cp in this case ! (cp doesn't copy at all, while gcp create the dest)""" + for i in range(2): + makeRandomFile('file_%d' % i, S10K) + makeTestDir('dir_%d' % i) + check_1 = dirCheck('.') + ret = system("gcp -r file_0 file_1 dir_0 dir_1 dest_dir") + self.assertEqual(ret,0) + check_2 = dirCheck('dest_dir') + self.assertEqual(check_1, check_2) + + def test_mixt_copy_existing_dest_nonrecursive(self): + """Check that a mixt copy (files + dir) to an existing dest without the recursive option work as expected""" + for i in range(2): + makeRandomFile('file_%d' % i, S10K) + makeTestDir('dir_%d' % i) + mkdir('dest_dir') + ret = system("gcp file_0 file_1 dir_0 dir_1 dest_dir") + self.assertEqual(ret,0) + self.assertEqual(set(listdir('dest_dir')), set(['file_0', 'file_1'])) + self.assertEqual(sha1sum('file_0'), sha1sum('dest_dir/file_0')) + self.assertEqual(sha1sum('file_1'), sha1sum('dest_dir/file_1')) + + def test_mixt_copy_nonexisting_dest_nonrecursive(self): + """Check that a mixt copy (files + dir) to an existing dest without the recursive option work as expected""" + for i in range(2): + makeRandomFile('file_%d' % i, S10K) + makeTestDir('dir_%d' % i) + check_before = dirCheck('.') + ret = system("gcp file_0 file_1 dir_0 dir_1 dest_dir") + self.assertEqual(ret >> 8, 1) + check_after = dirCheck('.') + self.assertEqual(check_before, check_after) + +if __name__ == '__main__': + unittest.main()