Exemple #1
0
    def test_plugin_bad_config_file(plugin_config_file):
        with pytest.raises(exceptions.UserError) as err_info:
            validator = PluginValidator(plugin_config_file,
                                        const.PLUGIN_CONFIG_SCHEMA)
            validator.validate_plugin_config()

        message = err_info.value.message
        assert message == ("Unable to read plugin config file '{}'"
                           "\nError code: 2. Error message: No such file or"
                           " directory".format(plugin_config_file))
Exemple #2
0
    def test_direct_plugin(fake_direct_plugin_config):
        with pytest.raises(exceptions.UserError) as err_info:
            validator = PluginValidator(fake_direct_plugin_config,
                                        util_classes.PLUGIN_CONFIG_SCHEMA,
                                        ValidationMode.ERROR, True)
            validator.validate()

        message = err_info.value.message
        assert validator.result.warnings.items() > 0
        assert 'Named argument mismatch in method' in message
        assert 'Number of arguments do not match' in message
        assert 'Implementation missing for required method' in message
Exemple #3
0
    def test_staged_plugin(mock_file_util, fake_staged_plugin_config):
        src_dir = os.path.dirname(fake_staged_plugin_config)
        mock_file_util.return_value = os.path.join(src_dir, 'src/')

        with pytest.raises(exceptions.UserError) as err_info:
            validator = PluginValidator(fake_staged_plugin_config,
                                        util_classes.PLUGIN_CONFIG_SCHEMA,
                                        ValidationMode.ERROR, True)
            validator.validate()

        message = err_info.value.message
        assert validator.result.warnings.items() > 0
        assert 'Named argument mismatch in method' in message
        assert 'Number of arguments do not match' in message
        assert 'Implementation missing for required method' in message
def get_plugin_manifest(plugin_config_file,
                        plugin_config_content,
                        stop_build,
                        skip_id_validation=False):
    """
    Validates the given plugin config content using a pre-defined schema.
    Plugin config file name is used to get the absolute path of plugin source
    directory. Returns a manifest which indicates method implemented in the
    plugin module.
    """
    validation_mode = (ValidationMode.ERROR
                       if stop_build else ValidationMode.WARNING)
    src_dir = file_util.get_src_dir_path(plugin_config_file,
                                         plugin_config_content['srcDir'])
    entry_point_module, entry_point_object = PluginValidator.split_entry_point(
        plugin_config_content['entryPoint'])
    plugin_type = plugin_config_content['pluginType']

    importer = PluginImporter(src_dir, entry_point_module, entry_point_object,
                              plugin_type, True)

    with validate_error_handler(plugin_config_file, validation_mode):
        importer.validate_plugin_module()

    return importer.result
Exemple #5
0
 def test_plugin_missing_field(plugin_config_file, plugin_config_content):
     with pytest.raises(exceptions.SchemaValidationError) as err_info:
         validator = PluginValidator.from_config_content(
             plugin_config_file, plugin_config_content,
             const.PLUGIN_CONFIG_SCHEMA)
         validator.validate_plugin_config()
     message = err_info.value.message
     assert "'srcDir' is a required property" in message
Exemple #6
0
 def test_plugin_id(plugin_config_file, plugin_config_content, expected):
     try:
         validator = PluginValidator.from_config_content(
             plugin_config_file, plugin_config_content,
             const.PLUGIN_CONFIG_SCHEMA)
         validator.validate_plugin_config()
     except exceptions.SchemaValidationError as err_info:
         message = err_info.message
         assert expected in message
Exemple #7
0
def validate_plugin_config_file(plugin_config, stop_build):
    """
    Reads a plugin config file and validates the contents using a
    pre-defined schema. If stop_build is True, will report exception
    back, otherwise warnings.
    Returns:
        On successful validation, returns content of the plugin
        config.
    """
    validation_mode = (ValidationMode.ERROR
                       if stop_build else ValidationMode.WARNING)

    validator = PluginValidator(plugin_config, const.PLUGIN_CONFIG_SCHEMA)

    with validate_error_handler(plugin_config, validation_mode):
        validator.validate_plugin_config()

    return validator.result
Exemple #8
0
 def test_multiple_validation_errors(plugin_config_file,
                                     plugin_config_content):
     with pytest.raises(exceptions.SchemaValidationError) as err_info:
         validator = PluginValidator.from_config_content(
             plugin_config_file, plugin_config_content,
             const.PLUGIN_CONFIG_SCHEMA)
         validator.validate_plugin_config()
     message = err_info.value.message
     assert "'srcDir' is a required property" in message
     assert "'xxx' is not one of ['UNIX', 'WINDOWS']" in message
Exemple #9
0
def read_and_validate_plugin_config_file(plugin_config,
                                         stop_build,
                                         run_all_validations,
                                         skip_id_validation=False):
    """
    Reads a plugin config file and validates the contents using a
    pre-defined schema. If stop_build is True, will report exception
    back, otherwise warnings.
    Returns:
        On successful validation, returns content of the plugin
        config.
    """
    validation_mode = ValidationMode.ERROR if stop_build else ValidationMode.WARNING
    plugin_config_schema_file = (
        util_classes.PLUGIN_CONFIG_SCHEMA_NO_ID_VALIDATION
        if skip_id_validation else util_classes.PLUGIN_CONFIG_SCHEMA)
    validator = PluginValidator(plugin_config, plugin_config_schema_file,
                                validation_mode, run_all_validations)
    validator.validate()
    return validator.result
Exemple #10
0
 def test_plugin_minimum_lua_version_without_lua_name(
         plugin_config_file, plugin_config_content):
     try:
         validator = PluginValidator.from_config_content(
             plugin_config_file, plugin_config_content,
             const.PLUGIN_CONFIG_SCHEMA)
         validator.validate_plugin_config()
     except exceptions.ValidationFailedError as err_info:
         message = err_info.message
         assert ('Failed to process property "minimumLuaVersion" without '
                 '"luaName" set in the plugin config.' in message)
Exemple #11
0
    def test_plugin_bad_schema(plugin_config_file, plugin_config_content,
                               schema_file):
        with pytest.raises(exceptions.UserError) as err_info:
            validator = PluginValidator.from_config_content(
                plugin_config_file, plugin_config_content, schema_file)
            validator.validate_plugin_config()

        message = err_info.value.message
        assert ('Failed to load schemas because {} is not a valid json file.'
                ' Error: Extra data: line 2 column 1 - line 2 column 9'
                ' (char 19 - 27)'.format(schema_file)) in message
Exemple #12
0
    def test_plugin_additional_properties(src_dir, plugin_config_file,
                                          plugin_config_content):
        # Adding an unknown key
        plugin_config_content['unknown_key'] = 'unknown_value'

        try:
            validator = PluginValidator.from_config_content(
                plugin_config_file, plugin_config_content,
                const.PLUGIN_CONFIG_SCHEMA)
            validator.validate_plugin_config()
        except exceptions.SchemaValidationError as err_info:
            message = err_info.message
            assert ("Additional properties are not allowed"
                    " ('unknown_key' was unexpected)" in message)
Exemple #13
0
    def test_plugin_missing_field(plugin_config_file):
        plugin_config_content = OrderedDict([
            ('name', 'staged'.encode('utf-8')), ('version', '0.1.0'),
            ('language', 'PYTHON27'), ('hostTypes', ['UNIX']),
            ('pluginType', 'STAGED'.encode('utf-8')),
            ('manualDiscovery', True),
            ('entryPoint', 'staged_plugin:staged'.encode('utf-8')),
            ('schemaFile', 'schema.json'.encode('utf-8'))
        ])

        with pytest.raises(exceptions.SchemaValidationError) as err_info:
            validator = PluginValidator.from_config_content(
                plugin_config_file, plugin_config_content,
                util_classes.PLUGIN_CONFIG_SCHEMA, ValidationMode.ERROR)
            validator.validate()
        message = err_info.value.message
        assert "'srcDir' is a required property" in message
Exemple #14
0
    def test_plugin_valid_content(mock_import_plugin, mock_relative_path,
                                  src_dir, plugin_config_file):
        plugin_config_content = OrderedDict([
            ('id', str(uuid.uuid4())), ('name', 'staged'.encode('utf-8')),
            ('version', '0.1.0'), ('language', 'PYTHON27'),
            ('hostTypes', ['UNIX']), ('pluginType', 'STAGED'.encode('utf-8')),
            ('manualDiscovery', True),
            ('entryPoint', 'staged_plugin:staged'.encode('utf-8')),
            ('srcDir', src_dir), ('schemaFile', 'schema.json'.encode('utf-8'))
        ])

        validator = PluginValidator.from_config_content(
            plugin_config_file, plugin_config_content,
            util_classes.PLUGIN_CONFIG_SCHEMA, ValidationMode.ERROR)
        validator.validate()

        mock_import_plugin.assert_called()
Exemple #15
0
    def test_plugin_info_warn_mode(plugin_config_file, validation_mode):
        plugin_config_content = OrderedDict([
            ('id', str(uuid.uuid4())), ('name', 'staged'.encode('utf-8')),
            ('version', '0.1.0'), ('language', 'PYTHON27'),
            ('hostTypes', ['UNIX']), ('pluginType', 'STAGED'.encode('utf-8')),
            ('manualDiscovery', True),
            ('entryPoint', 'staged_plugin:staged'.encode('utf-8')),
            ('schemaFile', 'schema.json'.encode('utf-8'))
        ])
        err_info = None
        try:
            validator = PluginValidator.from_config_content(
                plugin_config_file, plugin_config_content,
                util_classes.PLUGIN_CONFIG_SCHEMA, validation_mode)
            validator.validate()
        except Exception as e:
            err_info = e

        assert err_info is None
Exemple #16
0
    def test_plugin_bad_schema(plugin_config_file, schema_file):
        plugin_config_content = OrderedDict([
            ('name', 'staged'.encode('utf-8')),
            ('prettyName', 'StagedPlugin'.encode('utf-8')),
            ('version', '0.1.0'), ('language', 'PYTHON27'),
            ('hostTypes', ['UNIX']), ('pluginType', 'STAGED'.encode('utf-8')),
            ('manualDiscovery', True),
            ('entryPoint', 'staged_plugin:staged'.encode('utf-8')),
            ('srcDir', src_dir), ('schemaFile', 'schema.json'.encode('utf-8'))
        ])
        with pytest.raises(exceptions.UserError) as err_info:
            validator = PluginValidator.from_config_content(
                plugin_config_file, plugin_config_content, schema_file,
                ValidationMode.ERROR)
            validator.validate()

        message = err_info.value.message
        assert ('Failed to load schemas because {} is not a valid json file.'
                ' Error: Extra data: line 2 column 1 - line 2 column 9'
                ' (char 19 - 27)'.format(schema_file)) in message
Exemple #17
0
    def test_plugin_id(mock_import_plugin, mock_relative_path, src_dir,
                       plugin_config_file, plugin_id, expected):
        plugin_config_content = OrderedDict([
            ('id', plugin_id.encode('utf-8')), ('name', 'python_vfiles'),
            ('version', '1.0.0'), ('language', 'PYTHON27'),
            ('hostTypes', ['UNIX']), ('pluginType', 'STAGED'.encode('utf-8')),
            ('manualDiscovery', True),
            ('entryPoint', 'staged_plugin:staged'.encode('utf-8')),
            ('srcDir', src_dir), ('schemaFile', 'schema.json'.encode('utf-8'))
        ])

        try:
            validator = PluginValidator.from_config_content(
                plugin_config_file, plugin_config_content,
                util_classes.PLUGIN_CONFIG_SCHEMA, ValidationMode.ERROR)
            validator.validate()
            mock_import_plugin.assert_called()
        except exceptions.SchemaValidationError as err_info:
            message = err_info.message
            assert expected in message
Exemple #18
0
    def test_plugin_additional_properties(src_dir, plugin_config_file):
        plugin_config_content = OrderedDict([
            ('id', str(uuid.uuid4())), ('name', 'staged'.encode('utf-8')),
            ('version', '1.0.0'), ('language', 'PYTHON27'),
            ('hostTypes', ['UNIX']), ('pluginType', 'STAGED'.encode('utf-8')),
            ('manualDiscovery', True),
            ('entryPoint', 'staged_plugin:staged'.encode('utf-8')),
            ('unknown_key', 'unknown_value'.encode('utf-8')),
            ('srcDir', src_dir), ('schemaFile', 'schema.json'.encode('utf-8'))
        ])

        try:
            validator = PluginValidator.from_config_content(
                plugin_config_file, plugin_config_content,
                util_classes.PLUGIN_CONFIG_SCHEMA, ValidationMode.ERROR)
            validator.validate()
        except exceptions.SchemaValidationError as err_info:
            message = err_info.message
            assert "Additional properties are not allowed " \
                   "('unknown_key' was unexpected)" in message
Exemple #19
0
def get_plugin_manifest(plugin_config_file,
                        plugin_config_content,
                        stop_build,
                        skip_id_validation=False):
    """
    Validates the given plugin config content using a pre-defined schema.
    Plugin config file name is used to get the absolute path of plugin source
    directory. Returns a manifest which indicates method implemented in the
    plugin module.
    """
    validation_mode = (ValidationMode.ERROR
                       if stop_build else ValidationMode.WARNING)
    plugin_config_schema_file = (
        util_classes.PLUGIN_CONFIG_SCHEMA_NO_ID_VALIDATION
        if skip_id_validation else util_classes.PLUGIN_CONFIG_SCHEMA)
    validator = PluginValidator.from_config_content(plugin_config_file,
                                                    plugin_config_content,
                                                    plugin_config_schema_file,
                                                    validation_mode)
    validator.validate()
    return validator.result
Exemple #20
0
 def test_plugin_valid_content(src_dir, plugin_config_file,
                               plugin_config_content):
     validator = PluginValidator.from_config_content(
         plugin_config_file, plugin_config_content,
         const.PLUGIN_CONFIG_SCHEMA)
     validator.validate_plugin_config()