def test_setup_logger(patch_logging_levels, patch_blacklist_filter,
                      patch_logging, patch_kms_key_redacting_formatter):
    patch_logging_levels.return_value = sentinel.local_level, sentinel.root_level
    mock_local_logger = MagicMock()
    mock_root_logger = MagicMock()
    patch_logging.getLogger.side_effect = (mock_local_logger, mock_root_logger)
    mock_local_handler = MagicMock()
    mock_root_handler = MagicMock()
    patch_logging.StreamHandler.side_effect = (mock_local_handler,
                                               mock_root_handler)
    logging_utils.setup_logger(sentinel.verbosity, sentinel.quiet)

    patch_logging_levels.assert_called_once_with(sentinel.verbosity,
                                                 sentinel.quiet)
    patch_kms_key_redacting_formatter.assert_called_once_with(
        logging_utils.FORMAT_STRING)
    patch_logging.StreamHandler.assert_has_calls(calls=(call(), call()),
                                                 any_order=True)
    mock_local_handler.setFormatter.assert_called_once_with(
        patch_kms_key_redacting_formatter.return_value)
    patch_logging.getLogger.assert_has_calls(calls=(call(
        logging_utils.LOGGER_NAME), call()),
                                             any_order=False)
    patch_blacklist_filter.assert_called_once_with(logging_utils.LOGGER_NAME)
    mock_root_handler.setFormatter.assert_called_once_with(
        patch_kms_key_redacting_formatter.return_value)
    mock_root_handler.addFilter.assert_called_once_with(
        patch_blacklist_filter.return_value)
    mock_local_logger.setLevel.assert_called_once_with(sentinel.local_level)
    mock_local_logger.addHandler.assert_called_once_with(mock_local_handler)
    mock_root_logger.setLevel.assert_called_once_with(sentinel.root_level)
    mock_root_logger.addHandler.assert_called_once_with(mock_root_handler)
Esempio n. 2
0
def cli(raw_args=None):
    # type: (List[str]) -> Union[str, None]
    """CLI entry point.  Processes arguments, sets up the key provider, and processes requested action.

    :returns: Execution return value intended for ``sys.exit()``
    """
    try:
        args = parse_args(raw_args)

        setup_logger(args.verbosity, args.quiet)  # pylint: disable=no-member

        _LOGGER.debug("Encryption mode: %s", args.action)  # pylint: disable=no-member
        _LOGGER.debug("Encryption source: %s", args.input)  # pylint: disable=no-member
        _LOGGER.debug("Encryption destination: %s", args.output)  # pylint: disable=no-member
        _LOGGER.debug("Wrapping key provider configuration: %s", args.wrapping_keys)  # pylint: disable=no-member
        _LOGGER.debug("Suffix requested: %s", args.suffix)  # pylint: disable=no-member

        _warn_deprecated_python()

        crypto_materials_manager = build_crypto_materials_manager_from_args(
            key_providers_config=args.wrapping_keys, caching_config=args.caching
        )

        stream_args = stream_kwargs_from_args(args, crypto_materials_manager)

        process_cli_request(stream_args, args)

        return None
    except AWSEncryptionSDKCLIError as error:
        return error.args[0]
    except Exception as error:  # pylint: disable=broad-except
        message = os.linesep.join(
            [
                "Encountered unexpected error: increase verbosity to see details.",
                "{cls}({args})".format(
                    cls=error.__class__.__name__, args=", ".join(['"{}"'.format(arg) for arg in error.args])
                ),
            ]
        )
        _LOGGER.debug(message)
        # copy.deepcopy can't handle raw exc_info objects, so format it first
        formatted_traceback = traceback.format_exc()
        _LOGGER.debug(formatted_traceback)
        return message