From 3c042b52fd05c337e44af9fdcbe659089711d64b Mon Sep 17 00:00:00 2001 From: Calen Pennington Date: Thu, 21 Nov 2013 23:06:08 -0500 Subject: [PATCH] Clear out the cache xmodule_instance after an exception in XModule init This guarantees that the ErrorModule will be created, instead of potentially using a partially instatiated broken module. Fixes [LMS-1532]. --- common/lib/xmodule/xmodule/tests/test_error_module.py | 2 -- common/lib/xmodule/xmodule/x_module.py | 4 ++++ 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/common/lib/xmodule/xmodule/tests/test_error_module.py b/common/lib/xmodule/xmodule/tests/test_error_module.py index ff824b5130..341bca4d05 100644 --- a/common/lib/xmodule/xmodule/tests/test_error_module.py +++ b/common/lib/xmodule/xmodule/tests/test_error_module.py @@ -119,7 +119,6 @@ class TestErrorModuleConstruction(unittest.TestCase): self.descriptor.xmodule_runtime.error_descriptor_class = ErrorDescriptor self.descriptor.xmodule_runtime.xmodule_instance = None - @unittest.expectedFailure def test_broken_module(self): """ Test that when an XModule throws an error during __init__, we @@ -136,7 +135,6 @@ class TestErrorModuleConstruction(unittest.TestCase): with self.assertRaises(TestException): module = self.descriptor._xmodule - @unittest.expectedFailure @patch.object(ErrorModule, '__init__', Mock(side_effect=TestException)) def test_broken_error_module(self): """ diff --git a/common/lib/xmodule/xmodule/x_module.py b/common/lib/xmodule/xmodule/x_module.py index e644185c8c..77f6874d59 100644 --- a/common/lib/xmodule/xmodule/x_module.py +++ b/common/lib/xmodule/xmodule/x_module.py @@ -746,6 +746,10 @@ class XModuleDescriptor(XModuleMixin, HTMLSnippet, ResourceTemplates, XBlock): ) self.xmodule_runtime.xmodule_instance.save() except Exception: # pylint: disable=broad-except + # xmodule_instance is set by the XModule.__init__. If we had an error after that, + # we need to clean it out so that we can set up the ErrorModule instead + self.xmodule_runtime.xmodule_instance = None + if isinstance(self, self.xmodule_runtime.error_descriptor_class): log.exception('Error creating an ErrorModule from an ErrorDescriptor') raise