214 lines
7.9 KiB
Python
Raw Normal View History

# test_config.py - Test suite for ubuntutools.config
#
# 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.
2010-12-27 13:37:40 +01:00
import __builtin__
import os
import os.path
2010-12-22 21:24:35 +02:00
import sys
from StringIO import StringIO
2010-12-27 13:37:40 +01:00
import mox
from ubuntutools.config import UDTConfig, ubu_email
2010-12-22 21:24:35 +02:00
from ubuntutools.logger import Logger
from ubuntutools.test import unittest
class ConfigTestCase(mox.MoxTestBase, 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):
2010-12-27 13:37:40 +01:00
super(ConfigTestCase, self).setUp()
self.mox.stubs.Set(__builtin__, 'open', self._fake_open)
2010-12-22 21:24:35 +02:00
Logger.stdout = StringIO()
Logger.stderr = StringIO()
2010-12-22 02:09:04 +02:00
2010-12-27 13:37:40 +01:00
self.clean_environment()
def tearDown(self):
2010-12-22 21:24:35 +02:00
self.assertEqual(Logger.stdout.getvalue(), '')
self.assertEqual(Logger.stderr.getvalue(), '')
Logger.stdout = sys.stdout
Logger.stderr = sys.stderr
2010-12-22 02:09:04 +02:00
2010-12-27 13:37:40 +01:00
self.clean_environment()
2010-12-27 13:37:40 +01:00
def clean_environment(self):
self._config_files['system'] = ''
self._config_files['user'] = ''
for k in 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',
})
2010-12-22 21:24:35 +02:00
errs = Logger.stderr.getvalue().strip()
Logger.stderr = StringIO()
self.assertEqual(len(errs.splitlines()), 1)
self.assertRegexpMatches(errs,
r'Warning: Cannot parse.*\bCOMMAND_EXECUTION=a')
2010-12-21 01:51:10 +02:00
def get_value(self, *args, **kwargs):
config = UDTConfig(prefix='TEST')
2010-12-21 01:51:10 +02:00
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')
2010-12-22 21:24:35 +02:00
errs = Logger.stderr.getvalue().strip()
Logger.stderr = StringIO()
self.assertEqual(len(errs.splitlines()), 1)
self.assertRegexpMatches(errs,
2010-12-22 02:09:04 +02:00
r'deprecated.*\bCOMPATFOOBAR\b.*\bTEST_QUX\b')
def test_boolean(self):
self._config_files['user'] = "TEST_BOOLEAN=yes"
2010-12-21 01:51:10 +02:00
self.assertEqual(self.get_value('BOOLEAN', boolean=True), True)
self._config_files['user'] = "TEST_BOOLEAN=no"
2010-12-21 01:51:10 +02:00
self.assertEqual(self.get_value('BOOLEAN', boolean=True), False)
self._config_files['user'] = "TEST_BOOLEAN=true"
2010-12-21 01:51:10 +02:00
self.assertEqual(self.get_value('BOOLEAN', boolean=True), None)
def test_nonpackagewide(self):
self._config_files['user'] = 'UBUNTUTOOLS_FOOBAR=a'
self.assertEquals(self.get_value('FOOBAR'), None)
2010-12-20 22:38:36 +02:00
class UbuEmailTestCase(unittest.TestCase):
def setUp(self):
2010-12-27 13:37:40 +01:00
self.clean_environment()
def tearDown(self):
2010-12-27 13:37:40 +01:00
self.clean_environment()
2010-12-27 13:37:40 +01:00
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)
2010-12-20 22:38:36 +02:00
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'
2010-12-20 22:38:36 +02:00
os.environ['DEBEMAIL'] = orig = '%s <%s>' % (name, email)
self.assertEqual(ubu_email(), (name, email))
2010-12-20 22:38:36 +02:00
self.assertEqual(os.environ['DEBEMAIL'], orig)