diff options
Diffstat (limited to 'tests/unittests/test_handler')
10 files changed, 269 insertions, 198 deletions
| diff --git a/tests/unittests/test_handler/test_handler_apt_configure.py b/tests/unittests/test_handler/test_handler_apt_configure.py index 203dd2aa..d8fe9a4f 100644 --- a/tests/unittests/test_handler/test_handler_apt_configure.py +++ b/tests/unittests/test_handler/test_handler_apt_configure.py @@ -1,27 +1,27 @@ -from mocker import MockerTestCase -  from cloudinit import util  from cloudinit.config import cc_apt_configure +from ..helpers import TestCase  import os  import re +import shutil +import tempfile +import unittest -class TestAptProxyConfig(MockerTestCase): +class TestAptProxyConfig(TestCase):      def setUp(self):          super(TestAptProxyConfig, self).setUp() -        self.tmp = self.makeDir() +        self.tmp = tempfile.mkdtemp() +        self.addCleanup(shutil.rmtree, self.tmp)          self.pfile = os.path.join(self.tmp, "proxy.cfg")          self.cfile = os.path.join(self.tmp, "config.cfg")      def _search_apt_config(self, contents, ptype, value): -        print( -            r"acquire::%s::proxy\s+[\"']%s[\"'];\n" % (ptype, value), -            contents, "flags=re.IGNORECASE") -        return(re.search( +        return re.search(              r"acquire::%s::proxy\s+[\"']%s[\"'];\n" % (ptype, value), -            contents, flags=re.IGNORECASE)) +            contents, flags=re.IGNORECASE)      def test_apt_proxy_written(self):          cfg = {'apt_proxy': 'myproxy'} @@ -60,7 +60,7 @@ class TestAptProxyConfig(MockerTestCase):          contents = str(util.read_file_or_url(self.pfile)) -        for ptype, pval in values.iteritems(): +        for ptype, pval in values.items():              self.assertTrue(self._search_apt_config(contents, ptype, pval))      def test_proxy_deleted(self): diff --git a/tests/unittests/test_handler/test_handler_ca_certs.py b/tests/unittests/test_handler/test_handler_ca_certs.py index 0558023a..a6b9c0fd 100644 --- a/tests/unittests/test_handler/test_handler_ca_certs.py +++ b/tests/unittests/test_handler/test_handler_ca_certs.py @@ -1,15 +1,26 @@ -from mocker import MockerTestCase -  from cloudinit import cloud  from cloudinit import helpers  from cloudinit import util  from cloudinit.config import cc_ca_certs +from ..helpers import TestCase  import logging +import shutil +import tempfile +import unittest + +try: +    from unittest import mock +except ImportError: +    import mock +try: +    from contextlib import ExitStack +except ImportError: +    from contextlib2 import ExitStack -class TestNoConfig(MockerTestCase): +class TestNoConfig(unittest.TestCase):      def setUp(self):          super(TestNoConfig, self).setUp()          self.name = "ca-certs" @@ -22,15 +33,20 @@ class TestNoConfig(MockerTestCase):          Test that nothing is done if no ca-certs configuration is provided.          """          config = util.get_builtin_cfg() -        self.mocker.replace(util.write_file, passthrough=False) -        self.mocker.replace(cc_ca_certs.update_ca_certs, passthrough=False) -        self.mocker.replay() +        with ExitStack() as mocks: +            util_mock = mocks.enter_context( +                mock.patch.object(util, 'write_file')) +            certs_mock = mocks.enter_context( +                mock.patch.object(cc_ca_certs, 'update_ca_certs')) -        cc_ca_certs.handle(self.name, config, self.cloud_init, self.log, -                           self.args) +            cc_ca_certs.handle(self.name, config, self.cloud_init, self.log, +                               self.args) +            self.assertEqual(util_mock.call_count, 0) +            self.assertEqual(certs_mock.call_count, 0) -class TestConfig(MockerTestCase): + +class TestConfig(TestCase):      def setUp(self):          super(TestConfig, self).setUp()          self.name = "ca-certs" @@ -39,16 +55,16 @@ class TestConfig(MockerTestCase):          self.log = logging.getLogger("TestNoConfig")          self.args = [] -        # Mock out the functions that actually modify the system -        self.mock_add = self.mocker.replace(cc_ca_certs.add_ca_certs, -                                            passthrough=False) -        self.mock_update = self.mocker.replace(cc_ca_certs.update_ca_certs, -                                               passthrough=False) -        self.mock_remove = self.mocker.replace( -            cc_ca_certs.remove_default_ca_certs, passthrough=False) +        self.mocks = ExitStack() +        self.addCleanup(self.mocks.close) -        # Order must be correct -        self.mocker.order() +        # Mock out the functions that actually modify the system +        self.mock_add = self.mocks.enter_context( +            mock.patch.object(cc_ca_certs, 'add_ca_certs')) +        self.mock_update = self.mocks.enter_context( +            mock.patch.object(cc_ca_certs, 'update_ca_certs')) +        self.mock_remove = self.mocks.enter_context( +            mock.patch.object(cc_ca_certs, 'remove_default_ca_certs'))      def test_no_trusted_list(self):          """ @@ -57,86 +73,88 @@ class TestConfig(MockerTestCase):          """          config = {"ca-certs": {}} -        # No functions should be called -        self.mock_update() -        self.mocker.replay() -          cc_ca_certs.handle(self.name, config, self.cloud, self.log, self.args) +        self.assertEqual(self.mock_add.call_count, 0) +        self.assertEqual(self.mock_update.call_count, 1) +        self.assertEqual(self.mock_remove.call_count, 0) +      def test_empty_trusted_list(self):          """Test that no certificate are written if 'trusted' list is empty."""          config = {"ca-certs": {"trusted": []}} -        # No functions should be called -        self.mock_update() -        self.mocker.replay() -          cc_ca_certs.handle(self.name, config, self.cloud, self.log, self.args) +        self.assertEqual(self.mock_add.call_count, 0) +        self.assertEqual(self.mock_update.call_count, 1) +        self.assertEqual(self.mock_remove.call_count, 0) +      def test_single_trusted(self):          """Test that a single cert gets passed to add_ca_certs."""          config = {"ca-certs": {"trusted": ["CERT1"]}} -        self.mock_add(["CERT1"]) -        self.mock_update() -        self.mocker.replay() -          cc_ca_certs.handle(self.name, config, self.cloud, self.log, self.args) +        self.mock_add.assert_called_once_with(['CERT1']) +        self.assertEqual(self.mock_update.call_count, 1) +        self.assertEqual(self.mock_remove.call_count, 0) +      def test_multiple_trusted(self):          """Test that multiple certs get passed to add_ca_certs."""          config = {"ca-certs": {"trusted": ["CERT1", "CERT2"]}} -        self.mock_add(["CERT1", "CERT2"]) -        self.mock_update() -        self.mocker.replay() -          cc_ca_certs.handle(self.name, config, self.cloud, self.log, self.args) +        self.mock_add.assert_called_once_with(['CERT1', 'CERT2']) +        self.assertEqual(self.mock_update.call_count, 1) +        self.assertEqual(self.mock_remove.call_count, 0) +      def test_remove_default_ca_certs(self):          """Test remove_defaults works as expected."""          config = {"ca-certs": {"remove-defaults": True}} -        self.mock_remove() -        self.mock_update() -        self.mocker.replay() -          cc_ca_certs.handle(self.name, config, self.cloud, self.log, self.args) +        self.assertEqual(self.mock_add.call_count, 0) +        self.assertEqual(self.mock_update.call_count, 1) +        self.assertEqual(self.mock_remove.call_count, 1) +      def test_no_remove_defaults_if_false(self):          """Test remove_defaults is not called when config value is False."""          config = {"ca-certs": {"remove-defaults": False}} -        self.mock_update() -        self.mocker.replay() -          cc_ca_certs.handle(self.name, config, self.cloud, self.log, self.args) +        self.assertEqual(self.mock_add.call_count, 0) +        self.assertEqual(self.mock_update.call_count, 1) +        self.assertEqual(self.mock_remove.call_count, 0) +      def test_correct_order_for_remove_then_add(self):          """Test remove_defaults is not called when config value is False."""          config = {"ca-certs": {"remove-defaults": True, "trusted": ["CERT1"]}} -        self.mock_remove() -        self.mock_add(["CERT1"]) -        self.mock_update() -        self.mocker.replay() -          cc_ca_certs.handle(self.name, config, self.cloud, self.log, self.args) +        self.mock_add.assert_called_once_with(['CERT1']) +        self.assertEqual(self.mock_update.call_count, 1) +        self.assertEqual(self.mock_remove.call_count, 1) -class TestAddCaCerts(MockerTestCase): + +class TestAddCaCerts(TestCase):      def setUp(self):          super(TestAddCaCerts, self).setUp() +        tmpdir = tempfile.mkdtemp() +        self.addCleanup(shutil.rmtree, tmpdir)          self.paths = helpers.Paths({ -            'cloud_dir': self.makeDir() +            'cloud_dir': tmpdir,          })      def test_no_certs_in_list(self):          """Test that no certificate are written if not provided.""" -        self.mocker.replace(util.write_file, passthrough=False) -        self.mocker.replay() -        cc_ca_certs.add_ca_certs([]) +        with mock.patch.object(util, 'write_file') as mockobj: +            cc_ca_certs.add_ca_certs([]) +        self.assertEqual(mockobj.call_count, 0)      def test_single_cert_trailing_cr(self):          """Test adding a single certificate to the trusted CAs @@ -146,19 +164,21 @@ class TestAddCaCerts(MockerTestCase):          ca_certs_content = "line1\nline2\ncloud-init-ca-certs.crt\nline3\n"          expected = "line1\nline2\nline3\ncloud-init-ca-certs.crt\n" -        mock_write = self.mocker.replace(util.write_file, passthrough=False) -        mock_load = self.mocker.replace(util.load_file, passthrough=False) - -        mock_write("/usr/share/ca-certificates/cloud-init-ca-certs.crt", -                   cert, mode=0644) - -        mock_load("/etc/ca-certificates.conf") -        self.mocker.result(ca_certs_content) +        with ExitStack() as mocks: +            mock_write = mocks.enter_context( +                mock.patch.object(util, 'write_file')) +            mock_load = mocks.enter_context( +                mock.patch.object(util, 'load_file', +                                  return_value=ca_certs_content)) -        mock_write("/etc/ca-certificates.conf", expected, omode="wb") -        self.mocker.replay() +            cc_ca_certs.add_ca_certs([cert]) -        cc_ca_certs.add_ca_certs([cert]) +            mock_write.assert_has_calls([ +                mock.call("/usr/share/ca-certificates/cloud-init-ca-certs.crt", +                          cert, mode=0o644), +                mock.call("/etc/ca-certificates.conf", expected, omode="wb"), +                ]) +            mock_load.assert_called_once_with("/etc/ca-certificates.conf")      def test_single_cert_no_trailing_cr(self):          """Test adding a single certificate to the trusted CAs @@ -167,75 +187,89 @@ class TestAddCaCerts(MockerTestCase):          ca_certs_content = "line1\nline2\nline3" -        mock_write = self.mocker.replace(util.write_file, passthrough=False) -        mock_load = self.mocker.replace(util.load_file, passthrough=False) +        with ExitStack() as mocks: +            mock_write = mocks.enter_context( +                mock.patch.object(util, 'write_file')) +            mock_load = mocks.enter_context( +                mock.patch.object(util, 'load_file', +                                  return_value=ca_certs_content)) -        mock_write("/usr/share/ca-certificates/cloud-init-ca-certs.crt", -                   cert, mode=0644) +            cc_ca_certs.add_ca_certs([cert]) -        mock_load("/etc/ca-certificates.conf") -        self.mocker.result(ca_certs_content) +            mock_write.assert_has_calls([ +                mock.call("/usr/share/ca-certificates/cloud-init-ca-certs.crt", +                          cert, mode=0o644), +                mock.call("/etc/ca-certificates.conf", +                          "%s\n%s\n" % (ca_certs_content, +                                        "cloud-init-ca-certs.crt"), +                          omode="wb"), +                ]) -        mock_write("/etc/ca-certificates.conf", -                   "%s\n%s\n" % (ca_certs_content, "cloud-init-ca-certs.crt"), -                   omode="wb") -        self.mocker.replay() - -        cc_ca_certs.add_ca_certs([cert]) +            mock_load.assert_called_once_with("/etc/ca-certificates.conf")      def test_multiple_certs(self):          """Test adding multiple certificates to the trusted CAs."""          certs = ["CERT1\nLINE2\nLINE3", "CERT2\nLINE2\nLINE3"]          expected_cert_file = "\n".join(certs) - -        mock_write = self.mocker.replace(util.write_file, passthrough=False) -        mock_load = self.mocker.replace(util.load_file, passthrough=False) - -        mock_write("/usr/share/ca-certificates/cloud-init-ca-certs.crt", -                   expected_cert_file, mode=0644) -          ca_certs_content = "line1\nline2\nline3" -        mock_load("/etc/ca-certificates.conf") -        self.mocker.result(ca_certs_content) -        out = "%s\n%s\n" % (ca_certs_content, "cloud-init-ca-certs.crt") -        mock_write("/etc/ca-certificates.conf", out, omode="wb") +        with ExitStack() as mocks: +            mock_write = mocks.enter_context( +                mock.patch.object(util, 'write_file')) +            mock_load = mocks.enter_context( +                mock.patch.object(util, 'load_file', +                                  return_value=ca_certs_content)) -        self.mocker.replay() +            cc_ca_certs.add_ca_certs(certs) -        cc_ca_certs.add_ca_certs(certs) +            mock_write.assert_has_calls([ +                mock.call("/usr/share/ca-certificates/cloud-init-ca-certs.crt", +                          expected_cert_file, mode=0o644), +                mock.call("/etc/ca-certificates.conf", +                          "%s\n%s\n" % (ca_certs_content, +                                        "cloud-init-ca-certs.crt"), +                          omode='wb'), +                ]) +            mock_load.assert_called_once_with("/etc/ca-certificates.conf") -class TestUpdateCaCerts(MockerTestCase): -    def test_commands(self): -        mock_check_call = self.mocker.replace(util.subp, -                                              passthrough=False) -        mock_check_call(["update-ca-certificates"], capture=False) -        self.mocker.replay() -        cc_ca_certs.update_ca_certs() +class TestUpdateCaCerts(unittest.TestCase): +    def test_commands(self): +        with mock.patch.object(util, 'subp') as mockobj: +            cc_ca_certs.update_ca_certs() +            mockobj.assert_called_once_with( +                ["update-ca-certificates"], capture=False) -class TestRemoveDefaultCaCerts(MockerTestCase): +class TestRemoveDefaultCaCerts(TestCase):      def setUp(self):          super(TestRemoveDefaultCaCerts, self).setUp() +        tmpdir = tempfile.mkdtemp() +        self.addCleanup(shutil.rmtree, tmpdir)          self.paths = helpers.Paths({ -            'cloud_dir': self.makeDir() +            'cloud_dir': tmpdir,          })      def test_commands(self): -        mock_delete_dir_contents = self.mocker.replace( -            util.delete_dir_contents, passthrough=False) -        mock_write = self.mocker.replace(util.write_file, passthrough=False) -        mock_subp = self.mocker.replace(util.subp, -                                        passthrough=False) - -        mock_delete_dir_contents("/usr/share/ca-certificates/") -        mock_delete_dir_contents("/etc/ssl/certs/") -        mock_write("/etc/ca-certificates.conf", "", mode=0644) -        mock_subp(('debconf-set-selections', '-'), -                  "ca-certificates ca-certificates/trust_new_crts select no") -        self.mocker.replay() - -        cc_ca_certs.remove_default_ca_certs() +        with ExitStack() as mocks: +            mock_delete = mocks.enter_context( +                mock.patch.object(util, 'delete_dir_contents')) +            mock_write = mocks.enter_context( +                mock.patch.object(util, 'write_file')) +            mock_subp = mocks.enter_context(mock.patch.object(util, 'subp')) + +            cc_ca_certs.remove_default_ca_certs() + +            mock_delete.assert_has_calls([ +                mock.call("/usr/share/ca-certificates/"), +                mock.call("/etc/ssl/certs/"), +                ]) + +            mock_write.assert_called_once_with( +                "/etc/ca-certificates.conf", "", mode=0o644) + +            mock_subp.assert_called_once_with( +                ('debconf-set-selections', '-'), +                "ca-certificates ca-certificates/trust_new_crts select no") diff --git a/tests/unittests/test_handler/test_handler_chef.py b/tests/unittests/test_handler/test_handler_chef.py index ef1aa208..edad88cb 100644 --- a/tests/unittests/test_handler/test_handler_chef.py +++ b/tests/unittests/test_handler/test_handler_chef.py @@ -11,15 +11,21 @@ from cloudinit.sources import DataSourceNone  from .. import helpers as t_help +import six  import logging +import shutil +import tempfile  LOG = logging.getLogger(__name__) +CLIENT_TEMPL = os.path.sep.join(["templates", "chef_client.rb.tmpl"]) +  class TestChef(t_help.FilesystemMockingTestCase):      def setUp(self):          super(TestChef, self).setUp() -        self.tmp = self.makeDir(prefix="unittest_") +        self.tmp = tempfile.mkdtemp() +        self.addCleanup(shutil.rmtree, self.tmp)      def fetch_cloud(self, distro_kind):          cls = distros.fetch(distro_kind) @@ -37,9 +43,13 @@ class TestChef(t_help.FilesystemMockingTestCase):          for d in cc_chef.CHEF_DIRS:              self.assertFalse(os.path.isdir(d)) +    @t_help.skipIf(not os.path.isfile(CLIENT_TEMPL), +                   CLIENT_TEMPL + " is not available")      def test_basic_config(self): -        # This should create a file of the format...          """ +        test basic config looks sane + +        # This should create a file of the format...          # Created by cloud-init v. 0.7.6 on Sat, 11 Oct 2014 23:57:21 +0000          log_level              :info          ssl_verify_mode        :verify_none @@ -74,7 +84,7 @@ class TestChef(t_help.FilesystemMockingTestCase):          for k, v in cfg['chef'].items():              self.assertIn(v, c)          for k, v in cc_chef.CHEF_RB_TPL_DEFAULTS.items(): -            if isinstance(v, basestring): +            if isinstance(v, six.string_types):                  self.assertIn(v, c)          c = util.load_file(cc_chef.CHEF_FB_PATH)          self.assertEqual({}, json.loads(c)) @@ -101,6 +111,8 @@ class TestChef(t_help.FilesystemMockingTestCase):                  'c': 'd',              }, json.loads(c)) +    @t_help.skipIf(not os.path.isfile(CLIENT_TEMPL), +                   CLIENT_TEMPL + " is not available")      def test_template_deletes(self):          tpl_file = util.load_file('templates/chef_client.rb.tmpl')          self.patchUtils(self.tmp) diff --git a/tests/unittests/test_handler/test_handler_debug.py b/tests/unittests/test_handler/test_handler_debug.py index 8891ca04..80708d7b 100644 --- a/tests/unittests/test_handler/test_handler_debug.py +++ b/tests/unittests/test_handler/test_handler_debug.py @@ -26,6 +26,8 @@ from cloudinit.sources import DataSourceNone  from .. import helpers as t_help  import logging +import shutil +import tempfile  LOG = logging.getLogger(__name__) @@ -33,7 +35,8 @@ LOG = logging.getLogger(__name__)  class TestDebug(t_help.FilesystemMockingTestCase):      def setUp(self):          super(TestDebug, self).setUp() -        self.new_root = self.makeDir(prefix="unittest_") +        self.new_root = tempfile.mkdtemp() +        self.addCleanup(shutil.rmtree, self.new_root)      def _get_cloud(self, distro, metadata=None):          self.patchUtils(self.new_root) diff --git a/tests/unittests/test_handler/test_handler_growpart.py b/tests/unittests/test_handler/test_handler_growpart.py index 5d0636d1..bef0d80d 100644 --- a/tests/unittests/test_handler/test_handler_growpart.py +++ b/tests/unittests/test_handler/test_handler_growpart.py @@ -1,14 +1,23 @@ -from mocker import MockerTestCase -  from cloudinit import cloud  from cloudinit import util  from cloudinit.config import cc_growpart +from ..helpers import TestCase  import errno  import logging  import os  import re +import unittest + +try: +    from unittest import mock +except ImportError: +    import mock +try: +    from contextlib import ExitStack +except ImportError: +    from contextlib2 import ExitStack  # growpart:  #   mode: auto  # off, on, auto, 'growpart' @@ -42,7 +51,7 @@ growpart disk partition  """ -class TestDisabled(MockerTestCase): +class TestDisabled(unittest.TestCase):      def setUp(self):          super(TestDisabled, self).setUp()          self.name = "growpart" @@ -57,14 +66,14 @@ class TestDisabled(MockerTestCase):          # this really only verifies that resizer_factory isn't called          config = {'growpart': {'mode': 'off'}} -        self.mocker.replace(cc_growpart.resizer_factory, -                            passthrough=False) -        self.mocker.replay() -        self.handle(self.name, config, self.cloud_init, self.log, self.args) +        with mock.patch.object(cc_growpart, 'resizer_factory') as mockobj: +            self.handle(self.name, config, self.cloud_init, self.log, +                        self.args) +            self.assertEqual(mockobj.call_count, 0) -class TestConfig(MockerTestCase): +class TestConfig(TestCase):      def setUp(self):          super(TestConfig, self).setUp()          self.name = "growpart" @@ -77,75 +86,76 @@ class TestConfig(MockerTestCase):          self.cloud_init = None          self.handle = cc_growpart.handle -        # Order must be correct -        self.mocker.order() -      def test_no_resizers_auto_is_fine(self): -        subp = self.mocker.replace(util.subp, passthrough=False) -        subp(['growpart', '--help'], env={'LANG': 'C'}) -        self.mocker.result((HELP_GROWPART_NO_RESIZE, "")) -        self.mocker.replay() +        with mock.patch.object( +                util, 'subp', +                return_value=(HELP_GROWPART_NO_RESIZE, "")) as mockobj: -        config = {'growpart': {'mode': 'auto'}} -        self.handle(self.name, config, self.cloud_init, self.log, self.args) +            config = {'growpart': {'mode': 'auto'}} +            self.handle(self.name, config, self.cloud_init, self.log, +                        self.args) + +            mockobj.assert_called_once_with( +                ['growpart', '--help'], env={'LANG': 'C'})      def test_no_resizers_mode_growpart_is_exception(self): -        subp = self.mocker.replace(util.subp, passthrough=False) -        subp(['growpart', '--help'], env={'LANG': 'C'}) -        self.mocker.result((HELP_GROWPART_NO_RESIZE, "")) -        self.mocker.replay() +        with mock.patch.object( +                util, 'subp', +                return_value=(HELP_GROWPART_NO_RESIZE, "")) as mockobj: +            config = {'growpart': {'mode': "growpart"}} +            self.assertRaises( +                ValueError, self.handle, self.name, config, +                self.cloud_init, self.log, self.args) -        config = {'growpart': {'mode': "growpart"}} -        self.assertRaises(ValueError, self.handle, self.name, config, -                          self.cloud_init, self.log, self.args) +            mockobj.assert_called_once_with( +                ['growpart', '--help'], env={'LANG': 'C'})      def test_mode_auto_prefers_growpart(self): -        subp = self.mocker.replace(util.subp, passthrough=False) -        subp(['growpart', '--help'], env={'LANG': 'C'}) -        self.mocker.result((HELP_GROWPART_RESIZE, "")) -        self.mocker.replay() +        with mock.patch.object( +                util, 'subp', +                return_value=(HELP_GROWPART_RESIZE, "")) as mockobj: +            ret = cc_growpart.resizer_factory(mode="auto") +            self.assertIsInstance(ret, cc_growpart.ResizeGrowPart) -        ret = cc_growpart.resizer_factory(mode="auto") -        self.assertTrue(isinstance(ret, cc_growpart.ResizeGrowPart)) +            mockobj.assert_called_once_with( +                ['growpart', '--help'], env={'LANG': 'C'})      def test_handle_with_no_growpart_entry(self):          # if no 'growpart' entry in config, then mode=auto should be used          myresizer = object() +        retval = (("/", cc_growpart.RESIZE.CHANGED, "my-message",),) + +        with ExitStack() as mocks: +            factory = mocks.enter_context( +                mock.patch.object(cc_growpart, 'resizer_factory', +                                  return_value=myresizer)) +            rsdevs = mocks.enter_context( +                mock.patch.object(cc_growpart, 'resize_devices', +                                  return_value=retval)) +            mocks.enter_context( +                mock.patch.object(cc_growpart, 'RESIZERS', +                                  (('mysizer', object),) +                                  )) -        factory = self.mocker.replace(cc_growpart.resizer_factory, -                                      passthrough=False) -        rsdevs = self.mocker.replace(cc_growpart.resize_devices, -                                     passthrough=False) -        factory("auto") -        self.mocker.result(myresizer) -        rsdevs(myresizer, ["/"]) -        self.mocker.result((("/", cc_growpart.RESIZE.CHANGED, "my-message",),)) -        self.mocker.replay() - -        try: -            orig_resizers = cc_growpart.RESIZERS -            cc_growpart.RESIZERS = (('mysizer', object),)              self.handle(self.name, {}, self.cloud_init, self.log, self.args) -        finally: -            cc_growpart.RESIZERS = orig_resizers +            factory.assert_called_once_with('auto') +            rsdevs.assert_called_once_with(myresizer, ['/']) -class TestResize(MockerTestCase): + +class TestResize(unittest.TestCase):      def setUp(self):          super(TestResize, self).setUp()          self.name = "growpart"          self.log = logging.getLogger("TestResize") -        # Order must be correct -        self.mocker.order() -      def test_simple_devices(self):          # test simple device list          # this patches out devent2dev, os.stat, and device_part_info          # so in the end, doesn't test a lot          devs = ["/dev/XXda1", "/dev/YYda2"] -        devstat_ret = Bunch(st_mode=25008, st_ino=6078, st_dev=5L, +        devstat_ret = Bunch(st_mode=25008, st_ino=6078, st_dev=5,                              st_nlink=1, st_uid=0, st_gid=6, st_size=0,                              st_atime=0, st_mtime=0, st_ctime=0)          enoent = ["/dev/NOENT"] diff --git a/tests/unittests/test_handler/test_handler_locale.py b/tests/unittests/test_handler/test_handler_locale.py index eb251636..de85eff6 100644 --- a/tests/unittests/test_handler/test_handler_locale.py +++ b/tests/unittests/test_handler/test_handler_locale.py @@ -29,9 +29,11 @@ from .. import helpers as t_help  from configobj import ConfigObj -from StringIO import StringIO +from six import BytesIO  import logging +import shutil +import tempfile  LOG = logging.getLogger(__name__) @@ -39,7 +41,8 @@ LOG = logging.getLogger(__name__)  class TestLocale(t_help.FilesystemMockingTestCase):      def setUp(self):          super(TestLocale, self).setUp() -        self.new_root = self.makeDir(prefix="unittest_") +        self.new_root = tempfile.mkdtemp() +        self.addCleanup(shutil.rmtree, self.new_root)      def _get_cloud(self, distro):          self.patchUtils(self.new_root) @@ -59,6 +62,6 @@ class TestLocale(t_help.FilesystemMockingTestCase):          cc = self._get_cloud('sles')          cc_locale.handle('cc_locale', cfg, cc, LOG, []) -        contents = util.load_file('/etc/sysconfig/language') -        n_cfg = ConfigObj(StringIO(contents)) +        contents = util.load_file('/etc/sysconfig/language', decode=False) +        n_cfg = ConfigObj(BytesIO(contents))          self.assertEquals({'RC_LANG': cfg['locale']}, dict(n_cfg)) diff --git a/tests/unittests/test_handler/test_handler_seed_random.py b/tests/unittests/test_handler/test_handler_seed_random.py index 40481f16..0bcdcb31 100644 --- a/tests/unittests/test_handler/test_handler_seed_random.py +++ b/tests/unittests/test_handler/test_handler_seed_random.py @@ -18,11 +18,10 @@  from cloudinit.config import cc_seed_random -import base64  import gzip  import tempfile -from StringIO import StringIO +from six import BytesIO  from cloudinit import cloud  from cloudinit import distros @@ -69,7 +68,7 @@ class TestRandomSeed(t_help.TestCase):          return      def _compress(self, text): -        contents = StringIO() +        contents = BytesIO()          gz_fh = gzip.GzipFile(mode='wb', fileobj=contents)          gz_fh.write(text)          gz_fh.close() @@ -96,7 +95,7 @@ class TestRandomSeed(t_help.TestCase):          self.assertEquals("tiny-tim-was-here", contents)      def test_append_random_unknown_encoding(self): -        data = self._compress("tiny-toe") +        data = self._compress(b"tiny-toe")          cfg = {              'random_seed': {                  'file': self._seed_file, @@ -108,7 +107,7 @@ class TestRandomSeed(t_help.TestCase):                            self._get_cloud('ubuntu'), LOG, [])      def test_append_random_gzip(self): -        data = self._compress("tiny-toe") +        data = self._compress(b"tiny-toe")          cfg = {              'random_seed': {                  'file': self._seed_file, @@ -121,7 +120,7 @@ class TestRandomSeed(t_help.TestCase):          self.assertEquals("tiny-toe", contents)      def test_append_random_gz(self): -        data = self._compress("big-toe") +        data = self._compress(b"big-toe")          cfg = {              'random_seed': {                  'file': self._seed_file, @@ -134,7 +133,7 @@ class TestRandomSeed(t_help.TestCase):          self.assertEquals("big-toe", contents)      def test_append_random_base64(self): -        data = base64.b64encode('bubbles') +        data = util.b64e('bubbles')          cfg = {              'random_seed': {                  'file': self._seed_file, @@ -147,7 +146,7 @@ class TestRandomSeed(t_help.TestCase):          self.assertEquals("bubbles", contents)      def test_append_random_b64(self): -        data = base64.b64encode('kit-kat') +        data = util.b64e('kit-kat')          cfg = {              'random_seed': {                  'file': self._seed_file, diff --git a/tests/unittests/test_handler/test_handler_set_hostname.py b/tests/unittests/test_handler/test_handler_set_hostname.py index e1530e30..d358b069 100644 --- a/tests/unittests/test_handler/test_handler_set_hostname.py +++ b/tests/unittests/test_handler/test_handler_set_hostname.py @@ -7,9 +7,11 @@ from cloudinit import util  from .. import helpers as t_help +import shutil +import tempfile  import logging -from StringIO import StringIO +from six import BytesIO  from configobj import ConfigObj @@ -19,7 +21,8 @@ LOG = logging.getLogger(__name__)  class TestHostname(t_help.FilesystemMockingTestCase):      def setUp(self):          super(TestHostname, self).setUp() -        self.tmp = self.makeDir(prefix="unittest_") +        self.tmp = tempfile.mkdtemp() +        self.addCleanup(shutil.rmtree, self.tmp)      def _fetch_distro(self, kind):          cls = distros.fetch(kind) @@ -38,8 +41,8 @@ class TestHostname(t_help.FilesystemMockingTestCase):          cc_set_hostname.handle('cc_set_hostname',                                 cfg, cc, LOG, [])          if not distro.uses_systemd(): -            contents = util.load_file("/etc/sysconfig/network") -            n_cfg = ConfigObj(StringIO(contents)) +            contents = util.load_file("/etc/sysconfig/network", decode=False) +            n_cfg = ConfigObj(BytesIO(contents))              self.assertEquals({'HOSTNAME': 'blah.blah.blah.yahoo.com'},                                dict(n_cfg)) diff --git a/tests/unittests/test_handler/test_handler_timezone.py b/tests/unittests/test_handler/test_handler_timezone.py index 874db340..e3df8759 100644 --- a/tests/unittests/test_handler/test_handler_timezone.py +++ b/tests/unittests/test_handler/test_handler_timezone.py @@ -29,8 +29,10 @@ from .. import helpers as t_help  from configobj import ConfigObj -from StringIO import StringIO +from six import BytesIO +import shutil +import tempfile  import logging  LOG = logging.getLogger(__name__) @@ -39,7 +41,8 @@ LOG = logging.getLogger(__name__)  class TestTimezone(t_help.FilesystemMockingTestCase):      def setUp(self):          super(TestTimezone, self).setUp() -        self.new_root = self.makeDir(prefix="unittest_") +        self.new_root = tempfile.mkdtemp() +        self.addCleanup(shutil.rmtree, self.new_root)      def _get_cloud(self, distro):          self.patchUtils(self.new_root) @@ -67,8 +70,8 @@ class TestTimezone(t_help.FilesystemMockingTestCase):          cc_timezone.handle('cc_timezone', cfg, cc, LOG, []) -        contents = util.load_file('/etc/sysconfig/clock') -        n_cfg = ConfigObj(StringIO(contents)) +        contents = util.load_file('/etc/sysconfig/clock', decode=False) +        n_cfg = ConfigObj(BytesIO(contents))          self.assertEquals({'TIMEZONE': cfg['timezone']}, dict(n_cfg))          contents = util.load_file('/etc/localtime') diff --git a/tests/unittests/test_handler/test_handler_yum_add_repo.py b/tests/unittests/test_handler/test_handler_yum_add_repo.py index 435c9787..3a8aa7c1 100644 --- a/tests/unittests/test_handler/test_handler_yum_add_repo.py +++ b/tests/unittests/test_handler/test_handler_yum_add_repo.py @@ -4,9 +4,11 @@ from cloudinit.config import cc_yum_add_repo  from .. import helpers +import shutil +import tempfile  import logging -from StringIO import StringIO +from six import BytesIO  import configobj @@ -16,7 +18,8 @@ LOG = logging.getLogger(__name__)  class TestConfig(helpers.FilesystemMockingTestCase):      def setUp(self):          super(TestConfig, self).setUp() -        self.tmp = self.makeDir(prefix="unittest_") +        self.tmp = tempfile.mkdtemp() +        self.addCleanup(shutil.rmtree, self.tmp)      def test_bad_config(self):          cfg = { @@ -52,8 +55,9 @@ class TestConfig(helpers.FilesystemMockingTestCase):          }          self.patchUtils(self.tmp)          cc_yum_add_repo.handle('yum_add_repo', cfg, None, LOG, []) -        contents = util.load_file("/etc/yum.repos.d/epel_testing.repo") -        contents = configobj.ConfigObj(StringIO(contents)) +        contents = util.load_file("/etc/yum.repos.d/epel_testing.repo", +                                  decode=False) +        contents = configobj.ConfigObj(BytesIO(contents))          expected = {              'epel_testing': {                  'name': 'Extra Packages for Enterprise Linux 5 - Testing', | 
