def server(db, request): """ Require a CherryPy embedded server. Provides a started CherryPy embedded server with a request method for performing local requests against it. Note: this fixture requires the db fixture. """ # The event daemon cannot be restarted since it is a threading.Thread object, however # all references to girder.events.daemon are a singular global daemon due to its side # effect on import. We have to hack around this by creating a unique event daemon # each time we startup the server and assigning it to the global. import girder.events from girder.api import docs from girder.constants import SettingKey from girder.models.setting import Setting from girder.utility import plugin_utilities from girder.utility.server import setup as setupServer oldPluginDir = plugin_utilities.getPluginDir girder.events.daemon = girder.events.AsyncEventsThread() enabledPlugins = [] testPluginMarkers = request.node.get_marker('testPlugin') if testPluginMarkers is not None: for testPluginMarker in testPluginMarkers: pluginName = testPluginMarker.args[0] enabledPlugins.append(pluginName) # testFilePath is a py.path.local object that we *assume* lives in 'test/', # with 'test/test_plugins' nearby testFilePath = request.node.fspath testPluginsPath = testFilePath.dirpath('test_plugins').strpath plugin_utilities.getPluginDir = mock.Mock(return_value=testPluginsPath) Setting().set(SettingKey.PLUGINS_ENABLED, enabledPlugins) server = setupServer(test=True, plugins=enabledPlugins) server.request = restRequest cherrypy.server.unsubscribe() cherrypy.config.update({'environment': 'embedded', 'log.screen': False, 'request.throw_errors': True}) cherrypy.engine.start() yield server cherrypy.engine.unsubscribe('start', girder.events.daemon.start) cherrypy.engine.unsubscribe('stop', girder.events.daemon.stop) cherrypy.engine.stop() cherrypy.engine.exit() cherrypy.tree.apps = {} plugin_utilities.getPluginDir = oldPluginDir plugin_utilities.getPluginWebroots().clear() plugin_utilities.getPluginFailureInfo().clear() docs.routes.clear()
def testPluginLoadFailure(self): failureInfo = plugin_utilities.getPluginFailureInfo() self.assertIn('bad_server', failureInfo) self.assertIn('traceback', failureInfo['bad_server']) self.assertIn('Traceback', failureInfo['bad_server']['traceback']) self.assertIn('Exception: Bad server', failureInfo['bad_server']['traceback'])
def testFindEntryPointPluginsBadJSONConfig(self, iter_entry_points, resource_exists, resource_stream): iter_entry_points.return_value = [ FakeEntryPoint(name='entry_point_plugin_bad_json') ] # Load as JSON resource_exists.return_value = True @contextmanager def resource_stream_json_value(): yield BytesIO(b'{"name": "Plugin name from JSON", bad_json') resource_stream.return_value = resource_stream_json_value() plugins = {} findEntryPointPlugins(plugins) iter_entry_points.assert_called_once_with(group='girder.plugin') self.assertIn('entry_point_plugin_bad_json', plugins) failures = getPluginFailureInfo() self.assertIn('entry_point_plugin_bad_json', failures) self.assertIn('traceback', failures['entry_point_plugin_bad_json']) self.assertIn('ValueError', failures['entry_point_plugin_bad_json']['traceback'])
def testFindEntryPointPluginsBadYAMLConfig(self, iter_entry_points, resource_exists, resource_stream): iter_entry_points.return_value = [ FakeEntryPoint(name='entry_point_plugin_bad_yaml') ] # Load as YAML resource_exists.side_effect = [False, True] @contextmanager def resource_stream_yaml_value(): yield BytesIO(b'"name": "Plugin name from YAML"\nbad_yaml\n}') resource_stream.return_value = resource_stream_yaml_value() plugins = {} findEntryPointPlugins(plugins) iter_entry_points.assert_called_once_with(group='girder.plugin') self.assertIn('entry_point_plugin_bad_yaml', plugins) failures = getPluginFailureInfo() self.assertIn('entry_point_plugin_bad_yaml', failures) self.assertIn('traceback', failures['entry_point_plugin_bad_yaml']) self.assertIn('ScannerError', failures['entry_point_plugin_bad_yaml']['traceback'])
def testFindEntryPointPluginsBadJSONConfig(self, iter_entry_points, resource_exists, resource_stream): iter_entry_points.return_value = [FakeEntryPoint(name='entry_point_plugin_bad_json')] # Load as JSON resource_exists.return_value = True @contextmanager def resource_stream_json_value(): yield BytesIO(b'{"name": "Plugin name from JSON", bad_json') resource_stream.return_value = resource_stream_json_value() plugins = {} findEntryPointPlugins(plugins) iter_entry_points.assert_called_once_with(group='girder.plugin') self.assertIn('entry_point_plugin_bad_json', plugins) failures = getPluginFailureInfo() self.assertIn('entry_point_plugin_bad_json', failures) self.assertIn('traceback', failures['entry_point_plugin_bad_json']) self.assertIn( 'JSONDecodeError' if six.PY3 else 'ValueError', failures['entry_point_plugin_bad_json']['traceback'])
def testFindEntryPointPluginsBadYAMLConfig(self, iter_entry_points, resource_exists, resource_stream): iter_entry_points.return_value = [FakeEntryPoint(name='entry_point_plugin_bad_yaml')] # Load as YAML resource_exists.side_effect = [False, True] @contextmanager def resource_stream_yaml_value(): yield BytesIO(b'"name": "Plugin name from YAML"\nbad_yaml\n}') resource_stream.return_value = resource_stream_yaml_value() plugins = {} with mock.patch('girder.utility.plugin_utilities.logprint.exception') as logprint: findEntryPointPlugins(plugins) logprint.assert_called_once() iter_entry_points.assert_called_once_with(group='girder.plugin') self.assertIn('entry_point_plugin_bad_yaml', plugins) failures = getPluginFailureInfo() self.assertIn('entry_point_plugin_bad_yaml', failures) self.assertIn('traceback', failures['entry_point_plugin_bad_yaml']) self.assertIn('ScannerError', failures['entry_point_plugin_bad_yaml']['traceback'])
def getPlugins(self): plugins = { 'all': plugin_utilities.findAllPlugins(), 'enabled': Setting().get(SettingKey.PLUGINS_ENABLED) } failureInfo = plugin_utilities.getPluginFailureInfo() if failureInfo: plugins['failed'] = failureInfo return plugins
def testFindEntryPointPluginsBadLoad(self, iter_entry_points, resource_exists, _clearPluginFailureInfo): iter_entry_points.return_value = [FakeEntryPoint( name='entry_point_plugin_bad_load', goodLoad=False)] resource_exists.return_value = False _clearPluginFailureInfo.return_value = None plugins = {} findEntryPointPlugins(plugins) iter_entry_points.assert_called_once_with(group='girder.plugin') self.assertIn('entry_point_plugin_bad_load', plugins) failures = getPluginFailureInfo() self.assertIn('entry_point_plugin_bad_load', failures) self.assertIn('traceback', failures['entry_point_plugin_bad_load']) self.assertIn('SystemError', failures['entry_point_plugin_bad_load']['traceback'])