summaryrefslogtreecommitdiff
path: root/tests/unittests/test_util.py
diff options
context:
space:
mode:
Diffstat (limited to 'tests/unittests/test_util.py')
-rw-r--r--tests/unittests/test_util.py82
1 files changed, 76 insertions, 6 deletions
diff --git a/tests/unittests/test_util.py b/tests/unittests/test_util.py
index 5d21b4b7..014aa6a3 100644
--- a/tests/unittests/test_util.py
+++ b/tests/unittests/test_util.py
@@ -44,7 +44,7 @@ class TestGetCfgOptionListOrStr(helpers.TestCase):
"""None is returned if key is not found and no default given."""
config = {}
result = util.get_cfg_option_list(config, "key")
- self.assertEqual(None, result)
+ self.assertIsNone(result)
def test_not_found_with_default(self):
"""Default is returned if key is not found."""
@@ -432,13 +432,13 @@ class TestReadDMIData(helpers.FilesystemMockingTestCase):
def test_none_returned_if_neither_source_has_data(self):
self.patch_mapping({})
self._configure_dmidecode_return('key', 'value')
- self.assertEqual(None, util.read_dmi_data('expect-fail'))
+ self.assertIsNone(util.read_dmi_data('expect-fail'))
def test_none_returned_if_dmidecode_not_in_path(self):
self.patched_funcs.enter_context(
mock.patch.object(util, 'which', lambda _: False))
self.patch_mapping({})
- self.assertEqual(None, util.read_dmi_data('expect-fail'))
+ self.assertIsNone(util.read_dmi_data('expect-fail'))
def test_dots_returned_instead_of_foxfox(self):
# uninitialized dmi values show as \xff, return those as .
@@ -596,7 +596,8 @@ class TestSubp(helpers.TestCase):
def test_subp_capture_stderr(self):
data = b'hello world'
(out, err) = util.subp(self.stdin2err, capture=True,
- decode=False, data=data)
+ decode=False, data=data,
+ update_env={'LC_ALL': 'C'})
self.assertEqual(err, data)
self.assertEqual(out, b'')
@@ -625,8 +626,8 @@ class TestSubp(helpers.TestCase):
def test_returns_none_if_no_capture(self):
(out, err) = util.subp(self.stdin2out, data=b'', capture=False)
- self.assertEqual(err, None)
- self.assertEqual(out, None)
+ self.assertIsNone(err)
+ self.assertIsNone(out)
def test_bunch_of_slashes_in_path(self):
self.assertEqual("/target/my/path/",
@@ -711,4 +712,73 @@ class TestProcessExecutionError(helpers.TestCase):
)).format(description=self.empty_description,
empty_attr=self.empty_attr))
+
+class TestSystemIsSnappy(helpers.FilesystemMockingTestCase):
+ def test_id_in_os_release_quoted(self):
+ """os-release containing ID="ubuntu-core" is snappy."""
+ orcontent = '\n'.join(['ID="ubuntu-core"', ''])
+ root_d = self.tmp_dir()
+ helpers.populate_dir(root_d, {'etc/os-release': orcontent})
+ self.reRoot(root_d)
+ self.assertTrue(util.system_is_snappy())
+
+ def test_id_in_os_release(self):
+ """os-release containing ID=ubuntu-core is snappy."""
+ orcontent = '\n'.join(['ID=ubuntu-core', ''])
+ root_d = self.tmp_dir()
+ helpers.populate_dir(root_d, {'etc/os-release': orcontent})
+ self.reRoot(root_d)
+ self.assertTrue(util.system_is_snappy())
+
+ @mock.patch('cloudinit.util.get_cmdline')
+ def test_bad_content_in_os_release_no_effect(self, m_cmdline):
+ """malformed os-release should not raise exception."""
+ m_cmdline.return_value = 'root=/dev/sda'
+ orcontent = '\n'.join(['IDubuntu-core', ''])
+ root_d = self.tmp_dir()
+ helpers.populate_dir(root_d, {'etc/os-release': orcontent})
+ self.reRoot()
+ self.assertFalse(util.system_is_snappy())
+
+ @mock.patch('cloudinit.util.get_cmdline')
+ def test_snap_core_in_cmdline_is_snappy(self, m_cmdline):
+ """The string snap_core= in kernel cmdline indicates snappy."""
+ cmdline = (
+ "BOOT_IMAGE=(loop)/kernel.img root=LABEL=writable "
+ "snap_core=core_x1.snap snap_kernel=pc-kernel_x1.snap ro "
+ "net.ifnames=0 init=/lib/systemd/systemd console=tty1 "
+ "console=ttyS0 panic=-1")
+ m_cmdline.return_value = cmdline
+ self.assertTrue(util.system_is_snappy())
+ self.assertTrue(m_cmdline.call_count > 0)
+
+ @mock.patch('cloudinit.util.get_cmdline')
+ def test_nothing_found_is_not_snappy(self, m_cmdline):
+ """If no positive identification, then not snappy."""
+ m_cmdline.return_value = 'root=/dev/sda'
+ self.reRoot()
+ self.assertFalse(util.system_is_snappy())
+ self.assertTrue(m_cmdline.call_count > 0)
+
+ @mock.patch('cloudinit.util.get_cmdline')
+ def test_channel_ini_with_snappy_is_snappy(self, m_cmdline):
+ """A Channel.ini file with 'ubuntu-core' indicates snappy."""
+ m_cmdline.return_value = 'root=/dev/sda'
+ root_d = self.tmp_dir()
+ content = '\n'.join(["[Foo]", "source = 'ubuntu-core'", ""])
+ helpers.populate_dir(
+ root_d, {'etc/system-image/channel.ini': content})
+ self.reRoot(root_d)
+ self.assertTrue(util.system_is_snappy())
+
+ @mock.patch('cloudinit.util.get_cmdline')
+ def test_system_image_config_dir_is_snappy(self, m_cmdline):
+ """Existence of /etc/system-image/config.d indicates snappy."""
+ m_cmdline.return_value = 'root=/dev/sda'
+ root_d = self.tmp_dir()
+ helpers.populate_dir(
+ root_d, {'etc/system-image/config.d/my.file': "_unused"})
+ self.reRoot(root_d)
+ self.assertTrue(util.system_is_snappy())
+
# vi: ts=4 expandtab