mirror of
https://git.launchpad.net/ubuntu-dev-tools
synced 2025-03-12 15:41:09 +00:00
236 lines
8.6 KiB
Python
236 lines
8.6 KiB
Python
# test_config.py - Test suite for ubuntutools.config
|
|
# -*- coding: utf-8 -*-
|
|
#
|
|
# Copyright (C) 2010, Stefano Rivera <stefanor@ubuntu.com>
|
|
#
|
|
# Permission to use, copy, modify, and/or distribute this software for any
|
|
# purpose with or without fee is hereby granted, provided that the above
|
|
# copyright notice and this permission notice appear in all copies.
|
|
#
|
|
# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
|
|
# REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
|
# AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
|
|
# INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
|
|
# LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
|
|
# OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
|
# PERFORMANCE OF THIS SOFTWARE.
|
|
|
|
import locale
|
|
import os
|
|
import unittest
|
|
from io import StringIO
|
|
from unittest import mock
|
|
|
|
from ubuntutools.config import UDTConfig, ubu_email
|
|
|
|
|
|
class ConfigTestCase(unittest.TestCase):
|
|
_config_files = {"system": "", "user": ""}
|
|
|
|
def _fake_open(self, filename, mode="r"):
|
|
if mode != "r":
|
|
raise IOError("Read only fake-file")
|
|
files = {
|
|
"/etc/devscripts.conf": self._config_files["system"],
|
|
os.path.expanduser("~/.devscripts"): self._config_files["user"],
|
|
}
|
|
if filename not in files:
|
|
raise IOError("No such file or directory: '%s'" % filename)
|
|
return StringIO(files[filename])
|
|
|
|
def setUp(self):
|
|
super(ConfigTestCase, self).setUp()
|
|
open_mock = mock.mock_open()
|
|
open_mock.side_effect = self._fake_open
|
|
patcher = mock.patch("builtins.open", open_mock)
|
|
self.addCleanup(patcher.stop)
|
|
patcher.start()
|
|
|
|
# Logger.stdout = StringIO()
|
|
# Logger.stderr = StringIO()
|
|
|
|
self.clean_environment()
|
|
|
|
def tearDown(self):
|
|
# self.assertEqual(Logger.stdout.getvalue(), '')
|
|
# self.assertEqual(Logger.stderr.getvalue(), '')
|
|
# Logger.stdout = sys.stdout
|
|
# Logger.stderr = sys.stderr
|
|
|
|
self.clean_environment()
|
|
|
|
def clean_environment(self):
|
|
self._config_files["system"] = ""
|
|
self._config_files["user"] = ""
|
|
for k in list(os.environ.keys()):
|
|
if k.startswith(("UBUNTUTOOLS_", "TEST_")):
|
|
del os.environ[k]
|
|
|
|
def test_config_parsing(self):
|
|
self._config_files[
|
|
"user"
|
|
] = """#COMMENT=yes
|
|
\tTAB_INDENTED=yes
|
|
SPACE_INDENTED=yes
|
|
SPACE_SUFFIX=yes
|
|
SINGLE_QUOTE='yes no'
|
|
DOUBLE_QUOTE="yes no"
|
|
QUOTED_QUOTE="it's"
|
|
PAIR_QUOTES="yes "a' no'
|
|
COMMAND_EXECUTION=a b
|
|
INHERIT=user
|
|
REPEAT=no
|
|
REPEAT=yes
|
|
"""
|
|
self._config_files["system"] = "INHERIT=system"
|
|
self.assertEqual(
|
|
UDTConfig(prefix="TEST").config,
|
|
{
|
|
"TAB_INDENTED": "yes",
|
|
"SPACE_INDENTED": "yes",
|
|
"SPACE_SUFFIX": "yes",
|
|
"SINGLE_QUOTE": "yes no",
|
|
"DOUBLE_QUOTE": "yes no",
|
|
"QUOTED_QUOTE": "it's",
|
|
"PAIR_QUOTES": "yes a no",
|
|
"COMMAND_EXECUTION": "a",
|
|
"INHERIT": "user",
|
|
"REPEAT": "yes",
|
|
},
|
|
)
|
|
# errs = Logger.stderr.getvalue().strip()
|
|
# Logger.stderr = StringIO()
|
|
# self.assertEqual(len(errs.splitlines()), 1)
|
|
# self.assertRegex(errs,
|
|
# r'Warning: Cannot parse.*\bCOMMAND_EXECUTION=a')
|
|
|
|
def get_value(self, *args, **kwargs):
|
|
config = UDTConfig(prefix="TEST")
|
|
return config.get_value(*args, **kwargs)
|
|
|
|
def test_defaults(self):
|
|
self.assertEqual(self.get_value("BUILDER"), "pbuilder")
|
|
|
|
def test_provided_default(self):
|
|
self.assertEqual(self.get_value("BUILDER", default="foo"), "foo")
|
|
|
|
def test_scriptname_precedence(self):
|
|
self._config_files[
|
|
"user"
|
|
] = """TEST_BUILDER=foo
|
|
UBUNTUTOOLS_BUILDER=bar"""
|
|
self.assertEqual(self.get_value("BUILDER"), "foo")
|
|
|
|
def test_configfile_precedence(self):
|
|
self._config_files["system"] = "UBUNTUTOOLS_BUILDER=foo"
|
|
self._config_files["user"] = "UBUNTUTOOLS_BUILDER=bar"
|
|
self.assertEqual(self.get_value("BUILDER"), "bar")
|
|
|
|
def test_environment_precedence(self):
|
|
self._config_files["user"] = "UBUNTUTOOLS_BUILDER=bar"
|
|
os.environ["UBUNTUTOOLS_BUILDER"] = "baz"
|
|
self.assertEqual(self.get_value("BUILDER"), "baz")
|
|
|
|
def test_general_environment_specific_config_precedence(self):
|
|
self._config_files["user"] = "TEST_BUILDER=bar"
|
|
os.environ["UBUNTUTOOLS_BUILDER"] = "foo"
|
|
self.assertEqual(self.get_value("BUILDER"), "bar")
|
|
|
|
def test_compat_keys(self):
|
|
self._config_files["user"] = "COMPATFOOBAR=bar"
|
|
self.assertEqual(self.get_value("QUX", compat_keys=["COMPATFOOBAR"]), "bar")
|
|
# errs = Logger.stderr.getvalue().strip()
|
|
# Logger.stderr = StringIO()
|
|
# self.assertEqual(len(errs.splitlines()), 1)
|
|
# self.assertRegex(errs,
|
|
# r'deprecated.*\bCOMPATFOOBAR\b.*\bTEST_QUX\b')
|
|
|
|
def test_boolean(self):
|
|
self._config_files["user"] = "TEST_BOOLEAN=yes"
|
|
self.assertEqual(self.get_value("BOOLEAN", boolean=True), True)
|
|
self._config_files["user"] = "TEST_BOOLEAN=no"
|
|
self.assertEqual(self.get_value("BOOLEAN", boolean=True), False)
|
|
self._config_files["user"] = "TEST_BOOLEAN=true"
|
|
self.assertEqual(self.get_value("BOOLEAN", boolean=True), None)
|
|
|
|
def test_nonpackagewide(self):
|
|
self._config_files["user"] = "UBUNTUTOOLS_FOOBAR=a"
|
|
self.assertEqual(self.get_value("FOOBAR"), None)
|
|
|
|
|
|
class UbuEmailTestCase(unittest.TestCase):
|
|
def setUp(self):
|
|
self.clean_environment()
|
|
|
|
def tearDown(self):
|
|
self.clean_environment()
|
|
|
|
def clean_environment(self):
|
|
for k in ("UBUMAIL", "DEBEMAIL", "DEBFULLNAME"):
|
|
if k in os.environ:
|
|
del os.environ[k]
|
|
|
|
def test_pristine(self):
|
|
os.environ["DEBFULLNAME"] = name = "Joe Developer"
|
|
os.environ["DEBEMAIL"] = email = "joe@example.net"
|
|
self.assertEqual(ubu_email(), (name, email))
|
|
|
|
def test_two_hat(self):
|
|
os.environ["DEBFULLNAME"] = name = "Joe Developer"
|
|
os.environ["DEBEMAIL"] = "joe@debian.org"
|
|
os.environ["UBUMAIL"] = email = "joe@ubuntu.com"
|
|
self.assertEqual(ubu_email(), (name, email))
|
|
self.assertEqual(os.environ["DEBFULLNAME"], name)
|
|
self.assertEqual(os.environ["DEBEMAIL"], email)
|
|
|
|
def test_two_hat_cmdlineoverride(self):
|
|
os.environ["DEBFULLNAME"] = "Joe Developer"
|
|
os.environ["DEBEMAIL"] = "joe@debian.org"
|
|
os.environ["UBUMAIL"] = "joe@ubuntu.com"
|
|
name = "Foo Bar"
|
|
email = "joe@example.net"
|
|
self.assertEqual(ubu_email(name, email), (name, email))
|
|
self.assertEqual(os.environ["DEBFULLNAME"], name)
|
|
self.assertEqual(os.environ["DEBEMAIL"], email)
|
|
|
|
def test_two_hat_noexport(self):
|
|
os.environ["DEBFULLNAME"] = name = "Joe Developer"
|
|
os.environ["DEBEMAIL"] = demail = "joe@debian.org"
|
|
os.environ["UBUMAIL"] = uemail = "joe@ubuntu.com"
|
|
self.assertEqual(ubu_email(export=False), (name, uemail))
|
|
self.assertEqual(os.environ["DEBFULLNAME"], name)
|
|
self.assertEqual(os.environ["DEBEMAIL"], demail)
|
|
|
|
def test_two_hat_with_name(self):
|
|
os.environ["DEBFULLNAME"] = "Joe Developer"
|
|
os.environ["DEBEMAIL"] = "joe@debian.org"
|
|
name = "Joe Ubuntunista"
|
|
email = "joe@ubuntu.com"
|
|
os.environ["UBUMAIL"] = "%s <%s>" % (name, email)
|
|
self.assertEqual(ubu_email(), (name, email))
|
|
self.assertEqual(os.environ["DEBFULLNAME"], name)
|
|
self.assertEqual(os.environ["DEBEMAIL"], email)
|
|
|
|
def test_debemail_with_name(self):
|
|
name = "Joe Developer"
|
|
email = "joe@example.net"
|
|
os.environ["DEBEMAIL"] = orig = "%s <%s>" % (name, email)
|
|
self.assertEqual(ubu_email(), (name, email))
|
|
self.assertEqual(os.environ["DEBEMAIL"], orig)
|
|
|
|
def test_unicode_name(self):
|
|
encoding = locale.getdefaultlocale()[1]
|
|
if not encoding:
|
|
encoding = "utf-8"
|
|
name = "Jöe Déveloper"
|
|
env_name = name
|
|
if isinstance(name, bytes):
|
|
name = "Jöe Déveloper".decode("utf-8")
|
|
env_name = name.encode(encoding)
|
|
try:
|
|
os.environ["DEBFULLNAME"] = env_name
|
|
except UnicodeEncodeError:
|
|
self.skipTest("python interpreter is not running in an unicode capable locale")
|
|
os.environ["DEBEMAIL"] = email = "joe@example.net"
|
|
self.assertEqual(ubu_email(), (name, email))
|