From 8b17caade46cf84050961e24a0006386dbe96669 Mon Sep 17 00:00:00 2001 From: Mike Milner Date: Tue, 21 Feb 2012 15:26:08 -0400 Subject: Add test and fix for catching exceptions. --- cloudinit/__init__.py | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) (limited to 'cloudinit/__init__.py') diff --git a/cloudinit/__init__.py b/cloudinit/__init__.py index 7a34e053..4338b46f 100644 --- a/cloudinit/__init__.py +++ b/cloudinit/__init__.py @@ -572,10 +572,14 @@ def handler_handle_part(mod, data, ctype, filename, payload, frequency): if not (modfreq == per_always or (frequency == per_instance and modfreq == per_instance)): return - if mod.handler_version == 1: - mod.handle_part(data, ctype, filename, payload) - else: - mod.handle_part(data, ctype, filename, payload, frequency) + try: + if mod.handler_version == 1: + mod.handle_part(data, ctype, filename, payload) + else: + mod.handle_part(data, ctype, filename, payload, frequency) + except: + util.logexc(log) + traceback.print_exc(file=sys.stderr) def partwalker_handle_handler(pdata, _ctype, _filename, payload): @@ -594,7 +598,6 @@ def partwalker_handle_handler(pdata, _ctype, _filename, payload): except: util.logexc(log) traceback.print_exc(file=sys.stderr) - return def partwalker_callback(pdata, ctype, filename, payload): -- cgit v1.2.3 From e8a3e39c1a6356460418d45f5b24f29b3fe6f20b Mon Sep 17 00:00:00 2001 From: Mike Milner Date: Tue, 21 Feb 2012 15:35:04 -0400 Subject: Lint fixes. --- cloudinit/__init__.py | 1 - tests/unittests/test__init__.py | 95 ++++++++++++++++++++++++++--------------- 2 files changed, 60 insertions(+), 36 deletions(-) (limited to 'cloudinit/__init__.py') diff --git a/cloudinit/__init__.py b/cloudinit/__init__.py index 4338b46f..82390eeb 100644 --- a/cloudinit/__init__.py +++ b/cloudinit/__init__.py @@ -60,7 +60,6 @@ import cPickle import sys import os.path import errno -import pwd import subprocess import yaml import logging diff --git a/tests/unittests/test__init__.py b/tests/unittests/test__init__.py index f1818e9c..d273748a 100644 --- a/tests/unittests/test__init__.py +++ b/tests/unittests/test__init__.py @@ -1,12 +1,8 @@ -from unittest import TestCase from mocker import MockerTestCase, ANY, ARGS, KWARGS -from tempfile import mkdtemp -from shutil import rmtree import os -import stat -import sys -from cloudinit import partwalker_handle_handler, handler_handle_part, handler_register +from cloudinit import (partwalker_handle_handler, handler_handle_part, + handler_register) from cloudinit.util import write_file, logexc @@ -19,9 +15,11 @@ class TestPartwalkerHandleHandler(MockerTestCase): "handlers": [], "data": None} - self.expected_module_name = "part-handler-%03d" % self.data["handlercount"] + self.expected_module_name = "part-handler-%03d" % ( + self.data["handlercount"],) expected_file_name = "%s.py" % self.expected_module_name - expected_file_fullname = os.path.join(self.data["handlerdir"], expected_file_name) + expected_file_fullname = os.path.join(self.data["handlerdir"], + expected_file_name) self.module_fake = "fake module handle" self.ctype = None self.filename = None @@ -38,12 +36,15 @@ class TestPartwalkerHandleHandler(MockerTestCase): import_mock(self.expected_module_name) self.mocker.result(self.module_fake) # Mock the handle_register function - handle_reg_mock = self.mocker.replace(handler_register, passthrough=False) - handle_reg_mock(self.module_fake, self.data["handlers"], self.data["data"], self.data["frequency"]) + handle_reg_mock = self.mocker.replace(handler_register, + passthrough=False) + handle_reg_mock(self.module_fake, self.data["handlers"], + self.data["data"], self.data["frequency"]) # Activate mocks self.mocker.replay() - partwalker_handle_handler(self.data, self.ctype, self.filename, self.payload) + partwalker_handle_handler(self.data, self.ctype, self.filename, + self.payload) self.assertEqual(1, self.data["handlercount"]) @@ -57,12 +58,14 @@ class TestPartwalkerHandleHandler(MockerTestCase): logexc_mock = self.mocker.replace(logexc, passthrough=False) logexc_mock(ANY) # Mock the print_exc function - print_exc_mock = self.mocker.replace("traceback.print_exc", passthrough=False) + print_exc_mock = self.mocker.replace("traceback.print_exc", + passthrough=False) print_exc_mock(ARGS, KWARGS) # Activate mocks self.mocker.replay() - partwalker_handle_handler(self.data, self.ctype, self.filename, self.payload) + partwalker_handle_handler(self.data, self.ctype, self.filename, + self.payload) def test_attribute_error(self): """Payload gets written to file and added to C{pdata}.""" @@ -71,19 +74,23 @@ class TestPartwalkerHandleHandler(MockerTestCase): import_mock(self.expected_module_name) self.mocker.result(self.module_fake) # Mock the handle_register function - handle_reg_mock = self.mocker.replace(handler_register, passthrough=False) - handle_reg_mock(self.module_fake, self.data["handlers"], self.data["data"], self.data["frequency"]) + handle_reg_mock = self.mocker.replace(handler_register, + passthrough=False) + handle_reg_mock(self.module_fake, self.data["handlers"], + self.data["data"], self.data["frequency"]) self.mocker.throw(AttributeError()) # Mock log function logexc_mock = self.mocker.replace(logexc, passthrough=False) logexc_mock(ANY) # Mock the print_exc function - print_exc_mock = self.mocker.replace("traceback.print_exc", passthrough=False) + print_exc_mock = self.mocker.replace("traceback.print_exc", + passthrough=False) print_exc_mock(ARGS, KWARGS) # Activate mocks self.mocker.replay() - partwalker_handle_handler(self.data, self.ctype, self.filename, self.payload) + partwalker_handle_handler(self.data, self.ctype, self.filename, + self.payload) class TestHandlerHandlePart(MockerTestCase): @@ -95,33 +102,45 @@ class TestHandlerHandlePart(MockerTestCase): self.frequency = "once-per-instance" def test_normal_version_1(self): - """C{handle_part} is called without frequency for C{handler_version} == 1""" + """ + C{handle_part} is called without C{frequency} for + C{handler_version} == 1. + """ # Build a mock part-handler module mod_mock = self.mocker.mock() getattr(mod_mock, "frequency") self.mocker.result("once-per-instance") getattr(mod_mock, "handler_version") self.mocker.result(1) - mod_mock.handle_part(self.data, self.ctype, self.filename, self.payload) + mod_mock.handle_part(self.data, self.ctype, self.filename, + self.payload) self.mocker.replay() - - handler_handle_part(mod_mock, self.data, self.ctype, self.filename, self.payload, self.frequency) + + handler_handle_part(mod_mock, self.data, self.ctype, self.filename, + self.payload, self.frequency) def test_normal_version_2(self): - """C{handle_part} is called with frequency for C{handler_version} == 2""" + """ + C{handle_part} is called with C{frequency} for + C{handler_version} == 2. + """ # Build a mock part-handler module mod_mock = self.mocker.mock() getattr(mod_mock, "frequency") self.mocker.result("once-per-instance") getattr(mod_mock, "handler_version") self.mocker.result(2) - mod_mock.handle_part(self.data, self.ctype, self.filename, self.payload, self.frequency) + mod_mock.handle_part(self.data, self.ctype, self.filename, + self.payload, self.frequency) self.mocker.replay() - - handler_handle_part(mod_mock, self.data, self.ctype, self.filename, self.payload, self.frequency) + + handler_handle_part(mod_mock, self.data, self.ctype, self.filename, + self.payload, self.frequency) def test_modfreq_per_always(self): - """C{handle_part} is called regardless of frequency if nofreq is always.""" + """ + C{handle_part} is called regardless of frequency if nofreq is always. + """ self.frequency = "once" # Build a mock part-handler module mod_mock = self.mocker.mock() @@ -129,10 +148,12 @@ class TestHandlerHandlePart(MockerTestCase): self.mocker.result("always") getattr(mod_mock, "handler_version") self.mocker.result(2) - mod_mock.handle_part(self.data, self.ctype, self.filename, self.payload, self.frequency) + mod_mock.handle_part(self.data, self.ctype, self.filename, + self.payload, self.frequency) self.mocker.replay() - - handler_handle_part(mod_mock, self.data, self.ctype, self.filename, self.payload, self.frequency) + + handler_handle_part(mod_mock, self.data, self.ctype, self.filename, + self.payload, self.frequency) def test_no_handle_when_modfreq_once(self): """C{handle_part} is not called if frequency is once""" @@ -142,8 +163,9 @@ class TestHandlerHandlePart(MockerTestCase): getattr(mod_mock, "frequency") self.mocker.result("once-per-instance") self.mocker.replay() - - handler_handle_part(mod_mock, self.data, self.ctype, self.filename, self.payload, self.frequency) + + handler_handle_part(mod_mock, self.data, self.ctype, self.filename, + self.payload, self.frequency) def test_exception_is_caught(self): """Exceptions within C{handle_part} are caught and logged.""" @@ -153,14 +175,17 @@ class TestHandlerHandlePart(MockerTestCase): self.mocker.result("once-per-instance") getattr(mod_mock, "handler_version") self.mocker.result(1) - mod_mock.handle_part(self.data, self.ctype, self.filename, self.payload) + mod_mock.handle_part(self.data, self.ctype, self.filename, + self.payload) self.mocker.throw(Exception()) # Mock log function logexc_mock = self.mocker.replace(logexc, passthrough=False) logexc_mock(ANY) # Mock the print_exc function - print_exc_mock = self.mocker.replace("traceback.print_exc", passthrough=False) + print_exc_mock = self.mocker.replace("traceback.print_exc", + passthrough=False) print_exc_mock(ARGS, KWARGS) self.mocker.replay() - - handler_handle_part(mod_mock, self.data, self.ctype, self.filename, self.payload, self.frequency) + + handler_handle_part(mod_mock, self.data, self.ctype, self.filename, + self.payload, self.frequency) -- cgit v1.2.3 From f54e9394e9d9dd0496d8084f9ca9ff5abee5f41c Mon Sep 17 00:00:00 2001 From: Mike Milner Date: Tue, 21 Feb 2012 15:43:53 -0400 Subject: Cleanups. --- cloudinit/__init__.py | 3 +-- tests/unittests/test__init__.py | 12 ++++++++---- 2 files changed, 9 insertions(+), 6 deletions(-) (limited to 'cloudinit/__init__.py') diff --git a/cloudinit/__init__.py b/cloudinit/__init__.py index 82390eeb..f3541ee5 100644 --- a/cloudinit/__init__.py +++ b/cloudinit/__init__.py @@ -589,11 +589,10 @@ def partwalker_handle_handler(pdata, _ctype, _filename, payload): modfname = modname + ".py" util.write_file("%s/%s" % (pdata['handlerdir'], modfname), payload, 0600) - pdata['handlercount'] = curcount + 1 - try: mod = __import__(modname) handler_register(mod, pdata['handlers'], pdata['data'], frequency) + pdata['handlercount'] = curcount + 1 except: util.logexc(log) traceback.print_exc(file=sys.stderr) diff --git a/tests/unittests/test__init__.py b/tests/unittests/test__init__.py index d273748a..e157fa77 100644 --- a/tests/unittests/test__init__.py +++ b/tests/unittests/test__init__.py @@ -49,7 +49,7 @@ class TestPartwalkerHandleHandler(MockerTestCase): self.assertEqual(1, self.data["handlercount"]) def test_import_error(self): - """Payload gets written to file and added to C{pdata}.""" + """Module import errors are logged. No handler added to C{pdata}""" # Mock the __import__ builtin import_mock = self.mocker.replace("__builtin__.__import__") import_mock(self.expected_module_name) @@ -67,8 +67,10 @@ class TestPartwalkerHandleHandler(MockerTestCase): partwalker_handle_handler(self.data, self.ctype, self.filename, self.payload) + self.assertEqual(0, self.data["handlercount"]) + def test_attribute_error(self): - """Payload gets written to file and added to C{pdata}.""" + """Attribute errors are logged. No handler added to C{pdata}""" # Mock the __import__ builtin import_mock = self.mocker.replace("__builtin__.__import__") import_mock(self.expected_module_name) @@ -92,6 +94,8 @@ class TestPartwalkerHandleHandler(MockerTestCase): partwalker_handle_handler(self.data, self.ctype, self.filename, self.payload) + self.assertEqual(0, self.data["handlercount"]) + class TestHandlerHandlePart(MockerTestCase): def setUp(self): @@ -147,9 +151,9 @@ class TestHandlerHandlePart(MockerTestCase): getattr(mod_mock, "frequency") self.mocker.result("always") getattr(mod_mock, "handler_version") - self.mocker.result(2) + self.mocker.result(1) mod_mock.handle_part(self.data, self.ctype, self.filename, - self.payload, self.frequency) + self.payload) self.mocker.replay() handler_handle_part(mod_mock, self.data, self.ctype, self.filename, -- cgit v1.2.3