Source code for testing

# -*- Mode:Python; indent-tabs-mode:nil; tab-width:4; encoding:utf-8 -*-
# Copyright 2012 Canonical Ltd
# This file is part of duplicity.
# Duplicity 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.
# Duplicity is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# General Public License for more details.
# You should have received a copy of the GNU General Public License
# along with duplicity; if not, write to the Free Software Foundation,
# Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA

from __future__ import print_function
from future import standard_library

import gettext
import os
import platform
import subprocess
import sys
import time
import unittest

from duplicity import backend
from duplicity import config
from duplicity import log
from duplicity import util

# util.start_debugger()

if sys.version_info.major >= 3:
    gettext.install(u'duplicity', names=[u'ngettext'])
    gettext.install(u'duplicity', names=[u'ngettext'], unicode=True)  # pylint: disable=unexpected-keyword-arg

_testing_dir = os.path.dirname(os.path.abspath(__file__))
_top_dir = os.path.dirname(_testing_dir)
_overrides_dir = os.path.join(_testing_dir, u'overrides')
_bin_dir = os.path.join(_testing_dir, u'overrides', u'bin')

if platform.system().startswith(u'Darwin'):
    # Use temp space TMPDIR or from getconf, never /tmp
    _runtest_dir = (os.environ.get(u"TMPDIR", None) or
                    subprocess.check_output([u'getconf', u'DARWIN_USER_TEMP_DIR']))
    _runtest_dir = os.fsdecode(_runtest_dir).rstrip().rstrip(u'/')
    # be a little more flexible
    _runtest_dir = os.getenv(u'TMPDIR', False) or os.getenv(u'TEMP', False) or u'/tmp'

if not os.path.exists(_runtest_dir):

# Adjust python path for duplicity and override modules
sys.path = [_overrides_dir, _top_dir, _bin_dir] + sys.path

# Also set PYTHONPATH for any subprocesses
os.environ[u'PYTHONPATH'] = _overrides_dir + u":" + _top_dir + u":" + os.environ.get(u'PYTHONPATH', u'')

# And PATH for any subprocesses
os.environ[u'PATH'] = _bin_dir + u":" + os.environ.get(u'PATH', u'')

# Now set some variables that help standardize test behavior
os.environ[u'LANG'] = u''
os.environ[u'GNUPGHOME'] = os.path.join(_testing_dir, u'gnupg')

# bzr does not honor perms so fix the perms and avoid annoying error
os.system(u"chmod 700 %s" % os.path.join(_testing_dir, u'gnupg'))

# Standardize time
os.environ[u'TZ'] = u'US/Central'

# TODO: find place in to do this
# fix shebangs in _bin_dir to be current python
if sys.version_info.major == 2:
    files = os.listdir(_bin_dir)
    for file in files:
        print(u"converting %s to python2" % file, file=sys.stderr)
        with open(os.path.join(_bin_dir, file), u"r") as f:
            p2 ="python3", u"python")
        with open(os.path.join(_bin_dir, file), u"w") as f:
            p2 = f.write(p2)

[docs]class DuplicityTestCase(unittest.TestCase): sign_key = u'839E6A2856538CCF' sign_passphrase = u'test' encrypt_key1 = u'839E6A2856538CCF' encrypt_key2 = u'453005CE9B736B2A'
[docs] def setUp(self): super(DuplicityTestCase, self).setUp() self.savedEnviron = {} self.savedConfig = {} log.setup() log.setverbosity(log.WARNING) self.set_config(u'print_statistics', 0) backend.import_backends() self.remove_testfiles() self.unpack_testfiles() # Have all file references in tests relative to our runtest dir os.chdir(_runtest_dir)
[docs] def tearDown(self): for key in self.savedEnviron: self._update_env(key, self.savedEnviron[key]) for key in self.savedConfig: setattr(config, key, self.savedConfig[key]) self.remove_testfiles() os.chdir(_testing_dir) super(DuplicityTestCase, self).tearDown()
[docs] def unpack_testfiles(self): assert not os.system(u"rm -rf {0}/testfiles".format(_runtest_dir)) assert not os.system(u"tar xzf {0}/testfiles.tar.gz -C {1} > /dev/null 2>&1".format(_testing_dir, _runtest_dir)) assert not os.system(u"mkdir {0}/testfiles/output {0}/testfiles/cache".format(_runtest_dir))
[docs] def remove_testfiles(self): assert not os.system(u"rm -rf {0}/testfiles".format(_runtest_dir))
[docs] def _update_env(self, key, value): if value is not None: os.environ[key] = value elif key in os.environ: del os.environ[key]
[docs] def set_environ(self, key, value): if key not in self.savedEnviron: self.savedEnviron[key] = os.environ.get(key) self._update_env(key, value)
[docs] def set_config(self, key, value): assert hasattr(config, key) if key not in self.savedConfig: self.savedConfig[key] = getattr(config, key) setattr(config, key, value)