Esempio n. 1
0
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()
Esempio n. 2
0
 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'])
Esempio n. 7
0
 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
Esempio n. 8
0
 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'])
Esempio n. 10
0
    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'])
 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'])