diff options
Diffstat (limited to 'tests.py')
-rwxr-xr-x | tests.py | 565 |
1 files changed, 0 insertions, 565 deletions
diff --git a/tests.py b/tests.py deleted file mode 100755 index 4466fc0..0000000 --- a/tests.py +++ /dev/null @@ -1,565 +0,0 @@ -#!/usr/bin/python -# -# Copyright (C) 2007 Lars Wirzenius <liw@iki.fi> -# -# 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 2 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, write to the Free Software Foundation, Inc., -# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - - -"""Unit tests for genbackupdata.py""" - - -import os -import shutil -import unittest -import zlib - -import genbackupdata - - -class BackupDataTests(unittest.TestCase): - - dirname = "tests.dir" - - def remove_dir(self): - """Remove a directory, if it exists""" - if os.path.exists(self.dirname): - shutil.rmtree(self.dirname) - - def create(self, filename, contents): - """Create a new file with the desired contents""" - dirname = os.path.dirname(filename) - if not os.path.exists(dirname): - os.makedirs(dirname) - f = file(filename, "w") - f.write(contents) - f.close() - - def read_file(self, filename): - """Return the entire contents of a file""" - f = file(filename) - data = f.read() - f.close() - return data - - def setUp(self): - self.remove_dir() - self.bd = genbackupdata.BackupData() - self.bd.set_directory(self.dirname) - - def tearDown(self): - del self.bd - self.remove_dir() - - def testSetsDirectoryCorrect(self): - self.failUnlessEqual(self.bd.get_directory(), self.dirname) - - def testDoesNotCreateDirectoryAtOnce(self): - self.failIf(os.path.exists(self.dirname)) - - def testCreatesDirectory(self): - self.bd.create_directory() - self.failUnless(os.path.exists(self.dirname)) - - def testDoesNotFailWhenCreatingDirectoryWhenItExistsAlready(self): - self.bd.create_directory() - self.bd.create_directory() - - def testHasCorrectDefaultSeed(self): - self.failUnlessEqual(self.bd.get_seed(), genbackupdata.DEFAULT_SEED) - - def testCorrectlySetsSeed(self): - self.bd.set_seed(12765) - self.failUnlessEqual(self.bd.get_seed(), 12765) - - def testHasNoPRNGInitially(self): - self.failUnlessEqual(self.bd.get_prng(), None) - - def testCreatesPRNGWhenRequested(self): - self.bd.init_prng() - self.failIfEqual(self.bd.get_prng(), None) - - def testFailsIfSeedGetsSetAfterPRNGHasBeenCreatedTwice(self): - self.bd.init_prng() - self.failUnlessRaises(AssertionError, self.bd.set_seed, 12765) - - def testHasCorrectDefaultBinaryChunkSize(self): - self.failUnlessEqual(self.bd.get_binary_chunk_size(), - genbackupdata.DEFAULT_BINARY_CHUNK_SIZE) - - def testCorrectlySetsBinaryChunkSize(self): - self.bd.set_binary_chunk_size(12765) - self.failUnlessEqual(self.bd.get_binary_chunk_size(), 12765) - - def testHasCorrectDefaultTextFileSize(self): - self.failUnlessEqual(self.bd.get_text_file_size(), - genbackupdata.DEFAULT_TEXT_FILE_SIZE) - - def testCorrectlySetsTextFileSize(self): - self.bd.set_text_file_size(12765) - self.failUnlessEqual(self.bd.get_text_file_size(), 12765) - - def testHasCorrectDefaultBinaryFileSize(self): - self.failUnlessEqual(self.bd.get_binary_file_size(), - genbackupdata.DEFAULT_BINARY_FILE_SIZE) - - def testCorrectlySetsBinaryFileSize(self): - self.bd.set_binary_file_size(12765) - self.failUnlessEqual(self.bd.get_binary_file_size(), 12765) - - def testHasCorrectDefaultTextDataPercentage(self): - self.failUnlessEqual(self.bd.get_text_data_percentage(), - genbackupdata.DEFAULT_TEXT_DATA_PERCENTAGE) - - def testCorrectlySetsTextDataPercentage(self): - self.bd.set_text_data_percentage(42.0) - self.failUnlessEqual(self.bd.get_text_data_percentage(), 42.0) - - def testHasCorrectDefaultMaxFilesPerDirectory(self): - self.failUnlessEqual(self.bd.get_max_files_per_directory(), - genbackupdata.DEFAULT_MAX_FILES_PER_DIRECTORY) - - def testCorrectlySetsMaxFilesPerDirectory(self): - self.bd.set_max_files_per_directory(12765) - self.failUnlessEqual(self.bd.get_max_files_per_directory(), 12765) - - def testSetsPreExistingFileCountToZeroByDefault(self): - self.failUnlessEqual(self.bd.get_preexisting_file_count(), 0) - - def testCanFakePreExistingFileCount(self): - self.bd.set_preexisting_file_count(12765) - self.failUnlessEqual(self.bd.get_preexisting_file_count(), 12765) - - def testSetsPreExistingDataSizeToZeroByDefault(self): - self.failUnlessEqual(self.bd.get_preexisting_data_size(), 0) - - def testCanFakePreExistingDataSize(self): - self.bd.set_preexisting_data_size(12765) - self.failUnlessEqual(self.bd.get_preexisting_data_size(), 12765) - - def testFindsPreExistingFilesAndDAtaCorrectly(self): - file_count = 10 - file_size = self.bd.get_text_file_size() - data = self.bd.generate_text_data(file_size) - for i in range(file_count): - self.create(self.bd.next_filename(), data) - self.bd.find_preexisting_files() - self.failUnlessEqual(self.bd.get_preexisting_file_count(), file_count) - self.failUnlessEqual(self.bd.get_preexisting_data_size(), - file_count * file_size) - - def testComputesRelativeFileCountCorrectly(self): - self.bd.set_preexisting_file_count(12765) - self.failUnlessEqual(self.bd.get_relative_file_count(10), 1276) - - def testComputesRelativeDataSizeCorrectly(self): - self.bd.set_preexisting_data_size(12765) - self.failUnlessEqual(self.bd.get_relative_data_size(10), 1276) - - def testFindsNoPreExistingFilesWhenDirectoryDoesNotExist(self): - self.bd.find_preexisting_files() - self.failUnlessEqual(self.bd.get_preexisting_file_count(), 0) - - def testFindsNoPreExistingDataWhenDirectoryDoesNotExist(self): - self.bd.find_preexisting_files() - self.failUnlessEqual(self.bd.get_preexisting_data_size(), 0) - - def testChoosesFirstFilenameCorrectly(self): - filename = self.bd.next_filename() - self.failUnless(filename.startswith(self.dirname)) - - def testChoosesFirstFilenameCorrectlyTwice(self): - filename1 = self.bd.next_filename() - filename2 = self.bd.next_filename() - self.failUnlessEqual(filename1, filename2) - - def testChoosesFilenameCorrectlyWhenFirstOneExistsAlready(self): - self.bd.create_directory() - filename1 = self.bd.next_filename() - self.create(filename1, "") - filename2 = self.bd.next_filename() - self.failIfEqual(filename1, filename2) - - def testChoosesSameDirectoryUntilMaxFileLimitIsReached(self): - self.bd.set_max_files_per_directory(10) # For speed - self.bd.create_directory() - chosen = self.bd._choose_directory() - for i in range(self.bd.get_max_files_per_directory()): - self.failUnlessEqual(self.bd._choose_directory(), chosen) - self.create(self.bd.next_filename(), "") - - def testChoosesNewDirectoryWhenMaxFileLimitIsReached(self): - self.bd.set_max_files_per_directory(10) # For speed - self.bd.create_directory() - chosen = self.bd._choose_directory() - for i in range(self.bd.get_max_files_per_directory()): - self.create(self.bd.next_filename(), "") - self.failIfEqual(self.bd._choose_directory(), chosen) - - def testGeneratesSmallAmountOfTextDataCorrectly(self): - n = 128 - self.failUnlessEqual(self.bd.generate_text_data(n), - genbackupdata.LOREM_IPSUM[:n]) - - def testGeneratesLargeAmountOfTextDataCorrectly(self): - n = len(genbackupdata.LOREM_IPSUM) - self.failUnlessEqual(self.bd.generate_text_data(n * 2), - genbackupdata.LOREM_IPSUM * 2) - - def testGeneratesRequestedAmountOfBinaryDataWell(self): - n = 37 - self.failUnlessEqual(len(self.bd.generate_binary_data_well(n)), n) - - def testGeneratesRequestedAmountOfBinaryDataQuickly(self): - n = 128 - self.failUnlessEqual(len(self.bd.generate_binary_data(n)), n) - - def testGeneratesRequestedLargeAmountOfBinaryData(self): - n = self.bd._binary_blob_size + 1 - self.failUnlessEqual(len(self.bd.generate_binary_data(n)), n) - - def testGeneratesBinaryDataWhichDoesNotCompressWell(self): - n = self.bd._binary_blob_size * 4 - data = zlib.compress(self.bd.generate_binary_data(n)) - self.failUnless(len(data) > 0.95* n) - - def testCreatesSubdirectoriesCorrectly(self): - filename = os.path.join(self.dirname, "subdir", "filename") - self.bd.create_subdirectories(filename) - self.failUnless(os.path.isdir(os.path.dirname(filename))) - - def testCreatesTextFileCorrectly(self): - size = self.bd.get_text_file_size() - filename = self.bd.next_filename() - self.bd.create_text_file(size) - self.failUnless(os.path.isfile(filename)) - self.failUnlessEqual(self.read_file(filename), - self.bd.generate_text_data(size)) - - def testCreatesBinaryFileCorrectly(self): - size = self.bd.get_binary_chunk_size() + 1 - filename = self.bd.next_filename() - self.bd.create_binary_file(size) - self.failUnless(os.path.isfile(filename)) - self.failUnlessEqual(os.path.getsize(filename), size) - - def failUnlessTextFile(self, filename): - data = self.read_file(filename) - self.failUnlessEqual(data, self.bd.generate_text_data(len(data))) - - def testCreatesTextFilesOnlyCorrectly(self): - self.bd.set_text_data_percentage(100) - count = 10 - size = count * self.bd.get_text_file_size() - self.bd.create_files(size) - self.bd.find_preexisting_files() - self.failUnlessEqual(self.bd.get_preexisting_file_count(), count) - self.failUnlessEqual(self.bd.get_preexisting_data_size(), size) - for root, dirs, filenames in os.walk(self.dirname): - for filename in filenames: - pathname = os.path.join(root, filename) - self.failUnlessTextFile(pathname) - - def failIfTextFile(self, filename): - data = self.read_file(filename) - self.failIfEqual(data, self.bd.generate_text_data(len(data))) - - def testCreatesNoTextFilesCorrectly(self): - self.bd.set_text_data_percentage(0) - count = 1 - size = count * self.bd.get_text_file_size() - self.bd.create_files(size) - self.bd.find_preexisting_files() - self.failUnlessEqual(self.bd.get_preexisting_file_count(), 1) - self.failUnlessEqual(self.bd.get_preexisting_data_size(), size) - for root, dirs, filenames in os.walk(self.dirname): - for filename in filenames: - pathname = os.path.join(root, filename) - self.failIfTextFile(pathname) - - def testDeletesFilesCorrectly(self): - size = 100 - self.bd.set_text_file_size(1) - self.bd.set_binary_file_size(1) - self.bd.create_files(size) - self.bd.find_preexisting_files() - count = self.bd.get_preexisting_file_count() - to_delete = count/3 - remaining = count - to_delete - self.bd.delete_files(to_delete) - self.bd.find_preexisting_files() - self.failUnlessEqual(self.bd.get_preexisting_file_count(), remaining) - - def testRenamesFilesCorrectly(self): - self.bd.create_directory() - filename = self.bd.next_filename() - self.create(filename, "") - new_filename = self.bd.next_filename() - self.bd.rename_files(1) - self.failIf(os.path.exists(filename)) - self.failUnless(os.path.exists(new_filename)) - - def testCreatesLinksCorrectly(self): - self.bd.create_directory() - filename = self.bd.next_filename() - self.create(filename, "") - new_filename = self.bd.next_filename() - self.bd.link_files(1) - self.failUnless(os.path.samefile(filename, new_filename)) - - def testHasCorrectDefaultModifyPercentage(self): - self.failUnlessEqual(self.bd.get_modify_percentage(), - genbackupdata.DEFAULT_MODIFY_PERCENTAGE) - - def testCorrectlySetsModifyPercentage(self): - self.bd.set_modify_percentage(42.0) - self.failUnlessEqual(self.bd.get_modify_percentage(), 42.0) - - def testModifyFiles(self): - size = 100 - self.bd.create_directory() - filename = self.bd.next_filename() - orig_data = "x" * size - self.create(filename, orig_data) - self.bd.modify_files(size) - self.failUnlessEqual(len(self.read_file(filename)), 2 * size) - - -class CommandLineParserTests(unittest.TestCase): - - dirname = "tests.dir" - - def setUp(self): - self.bd = genbackupdata.BackupData() - self.bd.set_directory(self.dirname) - self.clp = genbackupdata.CommandLineParser(self.bd) - - def tearDown(self): - del self.bd - del self.clp - - def testDoesNotTouchDefaultsWithEmptyCommandLine(self): - self.failUnlessEqual(self.bd.get_seed(), genbackupdata.DEFAULT_SEED) - self.failUnlessEqual(self.bd.get_binary_chunk_size(), - genbackupdata.DEFAULT_BINARY_CHUNK_SIZE) - self.failUnlessEqual(self.bd.get_text_file_size(), - genbackupdata.DEFAULT_TEXT_FILE_SIZE) - self.failUnlessEqual(self.bd.get_binary_file_size(), - genbackupdata.DEFAULT_BINARY_FILE_SIZE) - self.failUnlessEqual(self.bd.get_text_data_percentage(), - genbackupdata.DEFAULT_TEXT_DATA_PERCENTAGE) - self.failUnlessEqual(self.bd.get_max_files_per_directory(), - genbackupdata.DEFAULT_MAX_FILES_PER_DIRECTORY) - self.failUnlessEqual(self.bd.get_modify_percentage(), - genbackupdata.DEFAULT_MODIFY_PERCENTAGE) - - def testParsesPlainSizeCorrectly(self): - self.failUnlessEqual(self.clp.parse_size("12765"), 12765) - - def testParsesAbsoluteSizeSuffixesCorrectly(self): - self.failUnlessEqual(self.clp.parse_size("3k"), 3 * genbackupdata.KiB) - self.failUnlessEqual(self.clp.parse_size("3K"), 3 * genbackupdata.KiB) - self.failUnlessEqual(self.clp.parse_size("3m"), 3 * genbackupdata.MiB) - self.failUnlessEqual(self.clp.parse_size("3M"), 3 * genbackupdata.MiB) - self.failUnlessEqual(self.clp.parse_size("3g"), 3 * genbackupdata.GiB) - self.failUnlessEqual(self.clp.parse_size("3G"), 3 * genbackupdata.GiB) - self.failUnlessEqual(self.clp.parse_size("3t"), 3 * genbackupdata.TiB) - self.failUnlessEqual(self.clp.parse_size("3T"), 3 * genbackupdata.TiB) - - def testParsesRelativeSizeSuffixCorrectly(self): - self.failUnlessEqual(self.clp.parse_size("10%", 12765), 1276) - - def testParsesRelativeSizeSuffixCorrectlyWithMissingBaseSize(self): - self.failUnlessEqual(self.clp.parse_size("10%"), 0) - - def testParsesPlainCountCorrectly(self): - self.failUnlessEqual(self.clp.parse_count("12765"), 12765) - - def testParsesAbsoluteCountSuffixesCorrectly(self): - self.failUnlessEqual(self.clp.parse_count("3k"), 3 * 10**3) - self.failUnlessEqual(self.clp.parse_count("3K"), 3 * 10**3) - self.failUnlessEqual(self.clp.parse_count("3m"), 3 * 10**6) - self.failUnlessEqual(self.clp.parse_count("3M"), 3 * 10**6) - self.failUnlessEqual(self.clp.parse_count("3g"), 3 * 10**9) - self.failUnlessEqual(self.clp.parse_count("3G"), 3 * 10**9) - self.failUnlessEqual(self.clp.parse_count("3t"), 3 * 10**12) - self.failUnlessEqual(self.clp.parse_count("3T"), 3 * 10**12) - - def testParsesRelativeCountSuffixCorrectly(self): - self.failUnlessEqual(self.clp.parse_count("10%", 12765), 1276) - - def testParsesRelativeCountSuffixCorrectlyWithMissingBaseSize(self): - self.failUnlessEqual(self.clp.parse_count("10%"), 0) - - def testHandlesOptionForSeed(self): - optons, args = self.clp.parse(["--seed=12765"]) - self.failUnlessEqual(args, []) - self.failUnlessEqual(self.bd.get_seed(), 12765) - - def testHandlesOptionForMaxCount(self): - options, args = self.clp.parse(["--max-count=12765"]) - self.failUnlessEqual(args, []) - self.failUnlessEqual(self.bd.get_max_files_per_directory(), 12765) - - def testHandlesOptionForPercentageTextData(self): - options, args = self.clp.parse(["--percentage-text-data=4.2"]) - self.failUnlessEqual(args, []) - self.failUnlessEqual(self.bd.get_text_data_percentage(), 4.2) - - def testHandlesOptionForTextFileSize(self): - options, args = self.clp.parse(["--text-file-size=12765"]) - self.failUnlessEqual(args, []) - self.failUnlessEqual(self.bd.get_text_file_size(), 12765) - - def testHandlesOptionForTextFileSizeWithSuffix(self): - options, args = self.clp.parse(["--text-file-size=1t"]) - self.failUnlessEqual(args, []) - self.failUnlessEqual(self.bd.get_text_file_size(), genbackupdata.TiB) - - def testHandlesOptionForBinaryFileSizeWithSuffix(self): - options, args = self.clp.parse(["--binary-file-size=1t"]) - self.failUnlessEqual(args, []) - self.failUnlessEqual(self.bd.get_binary_file_size(), - genbackupdata.TiB) - - def testHandlesOptionForCreate(self): - options, args = self.clp.parse(["--create=1t"]) - self.failUnlessEqual(args, []) - self.failUnlessEqual(options.create, genbackupdata.TiB) - - def testHandlesOptionForCreateWithRelativeSize(self): - self.bd.set_preexisting_data_size(12765) - options, args = self.clp.parse(["--create=10%"]) - self.failUnlessEqual(args, []) - self.failUnlessEqual(options.create, 1276) - - def testHandlesOptionForDelete(self): - options, args = self.clp.parse(["--delete=12765"]) - self.failUnlessEqual(args, []) - self.failUnlessEqual(options.delete, 12765) - - def testHandlesOptionForDeleteWithRelativeCount(self): - self.bd.set_preexisting_file_count(12765) - options, args = self.clp.parse(["--delete=10%"]) - self.failUnlessEqual(args, []) - self.failUnlessEqual(options.delete, 1276) - - def testHandlesOptionForRename(self): - options, args = self.clp.parse(["--rename=12765"]) - self.failUnlessEqual(args, []) - self.failUnlessEqual(options.rename, 12765) - - def testHandlesOptionForLink(self): - options, args = self.clp.parse(["--link=12765"]) - self.failUnlessEqual(args, []) - self.failUnlessEqual(options.link, 12765) - - def testHandlesOptionForModify(self): - options, args = self.clp.parse(["--modify=12765"]) - self.failUnlessEqual(args, []) - self.failUnlessEqual(options.modify, 12765) - - def testHandlesOptionForModifyPercentage(self): - options, args = self.clp.parse(["--modify-percentage=4.2"]) - self.failUnlessEqual(args, []) - self.failUnlessEqual(self.bd.get_modify_percentage(), 4.2) - - -class ApplicationTests(unittest.TestCase): - - dirname = "tests.dir" - - def remove_dir(self): - """Remove a directory, if it exists""" - if os.path.exists(self.dirname): - shutil.rmtree(self.dirname) - - def setUp(self): - self.remove_dir() - - def tearDown(self): - self.remove_dir() - - def file_count(self): - count = 0 - for root, dirs, filenames in os.walk(self.dirname): - count += len(filenames) - return count - - def data_size(self): - size = 0 - for root, dirs, filenames in os.walk(self.dirname): - for filename in filenames: - size += os.path.getsize(os.path.join(root, filename)) - return size - - def file_list(self): - files = [] - for root, dirs, filenames in os.walk(self.dirname): - for filename in filenames: - files.append(os.path.join(root, filename)) - return files - - def nop(self, *args): - pass - - def testTerminatesWithoutDirectory(self): - app = genbackupdata.Application([]) - app.set_error_writer(self.nop) - self.failUnlessRaises(SystemExit, app.run) - - def apprun(self, args): - app = genbackupdata.Application(args) - app.run() - - def testCreatesFirstGenerationCorrectly(self): - self.apprun(["-c10k", self.dirname]) - self.failUnlessEqual(self.data_size(), 10 * genbackupdata.KiB) - - def testIncreasesSecondGenerationCorrectly(self): - self.apprun(["-c10k", self.dirname]) - self.apprun(["-c10k", self.dirname]) - self.failUnlessEqual(self.data_size(), 20 * genbackupdata.KiB) - - def testModifiesSecondGenerationCorrectly(self): - self.apprun(["-c10k", self.dirname]) - count = self.file_count() - self.apprun(["-m1k", self.dirname]) - self.failUnlessEqual(self.data_size(), 11 * genbackupdata.KiB) - self.failUnlessEqual(self.file_count(), count) - - def testDeletesFilesForSecondGenerationCorrectly(self): - self.apprun(["-c10k", self.dirname]) - count = self.file_count() - self.apprun(["-d2", self.dirname]) - self.failUnlessEqual(self.file_count(), count - 2) - - def testRenamesFilesForSecondGenerationCorrectly(self): - self.apprun(["-c10k", self.dirname]) - files1 = self.file_list() - self.apprun(["-r2", self.dirname]) - files2 = self.file_list() - self.failIfEqual(sorted(files1), sorted(files2)) - self.failUnlessEqual(len(files1), len(files2)) - - def testLinksFilesForSecondGenerationCorrectly(self): - self.apprun(["-c10k", self.dirname]) - files1 = self.file_list() - self.apprun(["-l2", self.dirname]) - files2 = self.file_list() - self.failUnlessEqual(len(files1) + 2, len(files2)) - - -if __name__ == "__main__": - unittest.main() |