diff --git a/codegen/smithy-ruby-codegen-test/integration-specs/auth_spec.rb b/codegen/smithy-ruby-codegen-test/integration-specs/auth_spec.rb index 3d9bac12..6f6e27cf 100644 --- a/codegen/smithy-ruby-codegen-test/integration-specs/auth_spec.rb +++ b/codegen/smithy-ruby-codegen-test/integration-specs/auth_spec.rb @@ -215,7 +215,7 @@ module Auth Hearth::IdentityResolver.new(proc { identity }) end - let(:client) { Client.new(**{ stub_responses: true }.merge(config_hash)) } + let(:client) { Client.new(stub_responses: true, **config_hash) } describe '#http_api_key_auth' do let(:config_hash) do diff --git a/hearth/lib/hearth/http/middleware/content_length.rb b/hearth/lib/hearth/http/middleware/content_length.rb index 9edea361..46a8f36a 100644 --- a/hearth/lib/hearth/http/middleware/content_length.rb +++ b/hearth/lib/hearth/http/middleware/content_length.rb @@ -17,8 +17,16 @@ def call(input, context) request = context.request if request.body.respond_to?(:size) && !request.headers.key?('Content-Length') + context.logger.debug( + '[HTTP::Middleware::ContentLength] ' \ + 'Started setting Content-Length' + ) length = request.body.size request.headers['Content-Length'] = length + context.logger.debug( + '[HTTP::Middleware::ContentLength] ' \ + 'Finished setting Content-Length' + ) end @app.call(input, context) diff --git a/hearth/lib/hearth/http/middleware/content_md5.rb b/hearth/lib/hearth/http/middleware/content_md5.rb index 8cec3b5a..9bacf7c9 100644 --- a/hearth/lib/hearth/http/middleware/content_md5.rb +++ b/hearth/lib/hearth/http/middleware/content_md5.rb @@ -16,8 +16,14 @@ def initialize(app, _ = {}) def call(input, context) request = context.request unless request.headers.key?('Content-MD5') + context.logger.debug( + '[HTTP::Middleware::ContentMD5] Started setting Content-MD5' + ) md5 = Hearth::Checksums.md5(request.body) request.headers['Content-MD5'] = md5 + context.logger.debug( + '[HTTP::Middleware::ContentMD5] Finished setting Content-MD5' + ) end @app.call(input, context) diff --git a/hearth/lib/hearth/http/middleware/request_compression.rb b/hearth/lib/hearth/http/middleware/request_compression.rb index d85868d9..bd1dbd54 100644 --- a/hearth/lib/hearth/http/middleware/request_compression.rb +++ b/hearth/lib/hearth/http/middleware/request_compression.rb @@ -10,10 +10,17 @@ class RequestCompression SUPPORTED_ENCODINGS = %w[gzip].freeze CHUNK_SIZE = 1 * 1024 * 1024 # one MB - def initialize(app, - disable_request_compression:, - request_min_compression_size_bytes:, - encodings:, + # @param [Class] app The next middleware in the stack. + # @param [Boolean] disable_request_compression If true, the request + # body is not compressed. + # @param [Integer] request_min_compression_size_bytes The minimum size + # of the request body to be compressed. + # @param [Array] encodings The encodings to be used for + # compression. + # @param [Boolean] streaming If true, the request body is compressed + # in chunks. + def initialize(app, disable_request_compression:, + request_min_compression_size_bytes:, encodings:, streaming:) @app = app @disable_request_compression = disable_request_compression @@ -27,24 +34,34 @@ def initialize(app, # @param context # @return [Output] def call(input, context) - request = context.request - unless @disable_request_compression - selected_encoding = @encodings.find do |encoding| - SUPPORTED_ENCODINGS.include?(encoding) - end - if selected_encoding - if @streaming - process_streaming_compression(selected_encoding, request) - elsif request.body.size >= @request_min_compression_size_bytes - process_compression(selected_encoding, request) - end - end - end + compress_request(context) unless @disable_request_compression @app.call(input, context) end private + def compress_request(context) + selected_encoding = @encodings.find do |encoding| + SUPPORTED_ENCODINGS.include?(encoding) + end + return unless selected_encoding + + context.logger.debug( + '[HTTP::Middleware::RequestCompression] ' \ + 'Started compressing request' + ) + request = context.request + if @streaming + compress_streaming_body(selected_encoding, request) + elsif request.body.size >= @request_min_compression_size_bytes + compress_body(selected_encoding, request) + end + context.logger.debug( + '[HTTP::Middleware::RequestCompression] ' \ + 'Finished compressing request' + ) + end + def update_content_encoding(encoding, request) headers = request.headers if headers['Content-Encoding'] @@ -54,7 +71,7 @@ def update_content_encoding(encoding, request) end end - def process_compression(encoding, request) + def compress_body(encoding, request) case encoding when 'gzip' gzip_compress(request) @@ -85,7 +102,7 @@ def update_in_chunks(compressor, io) end end - def process_streaming_compression(encoding, request) + def compress_streaming_body(encoding, request) case encoding when 'gzip' request.body = GzipIO.new(request.body) diff --git a/hearth/lib/hearth/middleware/auth.rb b/hearth/lib/hearth/middleware/auth.rb index 102cac2c..d9c47098 100644 --- a/hearth/lib/hearth/middleware/auth.rb +++ b/hearth/lib/hearth/middleware/auth.rb @@ -33,8 +33,10 @@ def initialize(app, auth_resolver:, auth_params:, auth_schemes:, **kwargs) # @param context # @return [Output] def call(input, context) + context.logger.debug('[Middleware::Auth] Started resolving auth') auth_options = @auth_resolver.resolve(@auth_params) context.auth = resolve_auth(auth_options) + context.logger.debug('[Middleware::Auth] Finished resolving auth') @app.call(input, context) end diff --git a/hearth/lib/hearth/middleware/build.rb b/hearth/lib/hearth/middleware/build.rb index 1dcbacfd..53e0e9b3 100755 --- a/hearth/lib/hearth/middleware/build.rb +++ b/hearth/lib/hearth/middleware/build.rb @@ -36,7 +36,7 @@ def call(input, context) ) return Hearth::Output.new(error: interceptor_error) if interceptor_error - @builder.build(context.request, input: input) + build(input, context) interceptor_error = Interceptors.invoke( hook: Interceptor::READ_AFTER_SERIALIZATION, @@ -49,6 +49,14 @@ def call(input, context) @app.call(input, context) end + + private + + def build(input, context) + context.logger.debug('[Middleware::Build] Started building request') + @builder.build(context.request, input: input) + context.logger.debug('[Middleware::Build] Finished building request') + end end end end diff --git a/hearth/lib/hearth/middleware/host_prefix.rb b/hearth/lib/hearth/middleware/host_prefix.rb index 30271765..1d2e91c8 100644 --- a/hearth/lib/hearth/middleware/host_prefix.rb +++ b/hearth/lib/hearth/middleware/host_prefix.rb @@ -21,15 +21,19 @@ def initialize(app, disable_host_prefix:, host_prefix:) # @param context # @return [Output] def call(input, context) - unless @disable_host_prefix - prefix = apply_labels(@host_prefix, input) - context.request.prefix_host(prefix) - end + prefix_host(input, context) unless @disable_host_prefix @app.call(input, context) end private + def prefix_host(input, context) + context.logger.debug('[Middleware::HostPrefix] Started prefixing host') + prefix = apply_labels(@host_prefix, input) + context.request.prefix_host(prefix) + context.logger.debug('[Middleware::HostPrefix] Finished prefixing host') + end + def apply_labels(host_prefix, input) host_prefix.gsub(/\{.+?\}/) do |host_label| key = host_label.delete('{}') diff --git a/hearth/lib/hearth/middleware/initialize.rb b/hearth/lib/hearth/middleware/initialize.rb index 19787833..6ed515b2 100644 --- a/hearth/lib/hearth/middleware/initialize.rb +++ b/hearth/lib/hearth/middleware/initialize.rb @@ -27,6 +27,7 @@ def call(input, context) if interceptor_error Hearth::Output.new(error: interceptor_error) else + context.logger.debug('[Middleware::Initialize] Started request') @app.call(input, context) end @@ -39,6 +40,8 @@ def call(input, context) ) output.error = interceptor_error if interceptor_error + context.logger.debug('[Middleware::Initialize] Finished request') + interceptor_error = Interceptors.invoke( hook: Interceptor::READ_AFTER_EXECUTION, input: input, diff --git a/hearth/lib/hearth/middleware/parse.rb b/hearth/lib/hearth/middleware/parse.rb index efc6dd55..32ef683f 100755 --- a/hearth/lib/hearth/middleware/parse.rb +++ b/hearth/lib/hearth/middleware/parse.rb @@ -66,11 +66,15 @@ def call(input, context) private def parse_error(context, output) + context.logger.debug('[Middleware::Parse] Started parsing error') output.error = @error_parser.parse(context.response, output.metadata) + context.logger.debug('[Middleware::Parse] Finished parsing error') end def parse_data(context, output) + context.logger.debug('[Middleware::Parse] Started parsing data') output.data = @data_parser.parse(context.response) + context.logger.debug('[Middleware::Parse] Finished parsing data') end end end diff --git a/hearth/lib/hearth/middleware/retry.rb b/hearth/lib/hearth/middleware/retry.rb index 55d77a63..4666ca53 100755 --- a/hearth/lib/hearth/middleware/retry.rb +++ b/hearth/lib/hearth/middleware/retry.rb @@ -33,11 +33,10 @@ def call(input, context) ) return Hearth::Output.new(error: interceptor_error) if interceptor_error - token = @retry_strategy.acquire_initial_retry_token( - context.metadata[:retry_token_scope] - ) - + token_scope = context.metadata[:retry_token_scope] + token = @retry_strategy.acquire_initial_retry_token(token_scope) output = nil + context.logger.debug('[Middleware::Retry] Starting retry loop') loop do interceptor_error = Interceptors.invoke( hook: Interceptor::READ_BEFORE_ATTEMPT, @@ -51,6 +50,7 @@ def call(input, context) if interceptor_error Hearth::Output.new(error: interceptor_error) else + context.logger.debug('[Middleware::Retry] Trying request') @app.call(input, context) end @@ -73,13 +73,20 @@ def call(input, context) output.error = interceptor_error if interceptor_error if (error = output.error) + context.logger.debug( + "[Middleware::Retry] Request errored: #{error.class}" + ) error_info = @error_inspector_class.new(error, context.response) token = @retry_strategy.refresh_retry_token(token, error_info) break unless token + context.logger.debug( + "[Middleware::Retry] Sleeping #{token.retry_delay} before retry" + ) Kernel.sleep(token.retry_delay) else @retry_strategy.record_success(token) + context.logger.debug('[Middleware::Retry] Finished sending request') break end @@ -87,6 +94,7 @@ def call(input, context) reset_response(context, output) @retries += 1 end + context.logger.debug('[Middleware::Retry] Finished retry loop') output end diff --git a/hearth/lib/hearth/middleware/send.rb b/hearth/lib/hearth/middleware/send.rb index 2f003aaa..7f7f593a 100755 --- a/hearth/lib/hearth/middleware/send.rb +++ b/hearth/lib/hearth/middleware/send.rb @@ -70,19 +70,23 @@ def call(input, context) private def stub_response(input, context, output) + context.logger.debug('[Middleware::Send] Started stubbing response') stub = @stubs.next(context.operation_name) apply_stub(stub, input, context, output) + context.logger.debug('[Middleware::Send] Finished stubbing response') return unless context.response.body.respond_to?(:rewind) context.response.body.rewind end def send_request(context, output) + context.logger.debug('[Middleware::Send] Started sending request') @client.transmit( request: context.request, response: context.response, logger: context.logger ) + context.logger.debug('[Middleware::Send] Finished sending request') rescue Hearth::NetworkingError => e output.error = e end diff --git a/hearth/lib/hearth/middleware/sign.rb b/hearth/lib/hearth/middleware/sign.rb index e74ca794..9b098a79 100644 --- a/hearth/lib/hearth/middleware/sign.rb +++ b/hearth/lib/hearth/middleware/sign.rb @@ -50,13 +50,14 @@ def call(input, context) private def sign_request(context) + context.logger.debug('[Middleware::Sign] Started signing request') auth = context.auth - auth.signer.sign( request: context.request, identity: auth.identity, properties: auth.signer_properties ) + context.logger.debug('[Middleware::Sign] Finished signing request') end end end diff --git a/hearth/lib/hearth/middleware/validate.rb b/hearth/lib/hearth/middleware/validate.rb index 524435b8..58b89cd6 100644 --- a/hearth/lib/hearth/middleware/validate.rb +++ b/hearth/lib/hearth/middleware/validate.rb @@ -21,9 +21,17 @@ def initialize(app, validate_input:, validator:) # @param context # @return [Output] def call(input, context) - @validator.validate!(input, context: 'input') if @validate_input + validate_input(input, context) @app.call(input, context) end + + private + + def validate_input(input, context) + context.logger.debug('[Middleware::Validate] Started validating input') + @validator.validate!(input, context: 'input') if @validate_input + context.logger.debug('[Middleware::Validate] Finished validating input') + end end end end diff --git a/hearth/spec/hearth/http/middleware/content_length_spec.rb b/hearth/spec/hearth/http/middleware/content_length_spec.rb index 839231e1..a2bc52ca 100644 --- a/hearth/spec/hearth/http/middleware/content_length_spec.rb +++ b/hearth/spec/hearth/http/middleware/content_length_spec.rb @@ -5,25 +5,25 @@ module HTTP module Middleware describe ContentLength do let(:app) { double('app', call: output) } + let(:input) { double('input') } + let(:output) { double('output') } subject { ContentLength.new(app) } describe '#call' do - let(:input) { double('input') } - let(:output) { double('output') } - let(:request) do Request.new( http_method: 'GET', body: body ) end - let(:response) { double('response') } + let(:logger) { Logger.new(IO::NULL) } let(:context) do Context.new( request: request, - response: response + response: response, + logger: logger ) end diff --git a/hearth/spec/hearth/http/middleware/content_md5_spec.rb b/hearth/spec/hearth/http/middleware/content_md5_spec.rb index 23173a48..c56f46ce 100644 --- a/hearth/spec/hearth/http/middleware/content_md5_spec.rb +++ b/hearth/spec/hearth/http/middleware/content_md5_spec.rb @@ -5,27 +5,26 @@ module HTTP module Middleware describe ContentMD5 do let(:app) { double('app', call: output) } + let(:input) { double('input') } + let(:output) { double('output') } subject { ContentMD5.new(app) } describe '#call' do - let(:input) { double('input') } - let(:output) { double('output') } - let(:body) { StringIO.new('test-body') } - let(:request) do Request.new( http_method: 'GET', body: body ) end - let(:response) { double('response') } + let(:logger) { Logger.new(IO::NULL) } let(:context) do Context.new( request: request, - response: response + response: response, + logger: logger ) end diff --git a/hearth/spec/hearth/http/middleware/request_compression_spec.rb b/hearth/spec/hearth/http/middleware/request_compression_spec.rb index f6c76b54..3ba10d52 100644 --- a/hearth/spec/hearth/http/middleware/request_compression_spec.rb +++ b/hearth/spec/hearth/http/middleware/request_compression_spec.rb @@ -5,6 +5,8 @@ module HTTP module Middleware describe RequestCompression do let(:app) { double('app', call: output) } + let(:input) { double('input') } + let(:output) { double('output') } let(:disable_request_compression) { false } let(:request_min_compression_size_bytes) { 10_240 } # default min let(:encodings) { ['gzip'] } # currently supported @@ -27,22 +29,20 @@ def expect_uncompressed_body(request, body) end describe '#call' do - let(:input) { double('input') } - let(:output) { double('output') } let(:body) { 'a' * 10_241 } - let(:request) do Request.new( http_method: 'PUT', body: body ) end - let(:response) { double('response') } + let(:logger) { Logger.new(IO::NULL) } let(:context) do Context.new( request: request, - response: response + response: response, + logger: logger ) end diff --git a/hearth/spec/hearth/middleware/auth_spec.rb b/hearth/spec/hearth/middleware/auth_spec.rb index 1b82a4df..6adb2386 100644 --- a/hearth/spec/hearth/middleware/auth_spec.rb +++ b/hearth/spec/hearth/middleware/auth_spec.rb @@ -4,6 +4,8 @@ module Hearth module Middleware describe Auth do let(:app) { double('app', call: output) } + let(:input) { double('input') } + let(:output) { double('output') } let(:auth_resolver) { double('auth_resolver') } let(:auth_params) { double('auth_params') } @@ -83,15 +85,14 @@ module Middleware end describe '#call' do - let(:input) { double('input') } - let(:output) { double('output') } let(:request) { double('request') } let(:response) { double('response') } - + let(:logger) { Logger.new(IO::NULL) } let(:context) do Context.new( request: request, - response: response + response: response, + logger: logger ) end diff --git a/hearth/spec/hearth/middleware/build_spec.rb b/hearth/spec/hearth/middleware/build_spec.rb index 549cb479..d35e9262 100644 --- a/hearth/spec/hearth/middleware/build_spec.rb +++ b/hearth/spec/hearth/middleware/build_spec.rb @@ -4,6 +4,8 @@ module Hearth module Middleware describe Build do let(:app) { double('app', call: output) } + let(:input) { double('input') } + let(:output) { Hearth::Output.new } let(:builder) { double('builder') } subject do @@ -14,15 +16,15 @@ module Middleware end describe '#call' do - let(:input) { double('input') } - let(:output) { Hearth::Output.new } let(:request) { double('request') } let(:response) { double('response') } + let(:logger) { Logger.new(IO::NULL) } let(:interceptors) { double('interceptors', each: []) } let(:context) do Context.new( request: request, response: response, + logger: logger, interceptors: interceptors ) end diff --git a/hearth/spec/hearth/middleware/host_prefix_spec.rb b/hearth/spec/hearth/middleware/host_prefix_spec.rb index aeda0e41..5bd8a94f 100644 --- a/hearth/spec/hearth/middleware/host_prefix_spec.rb +++ b/hearth/spec/hearth/middleware/host_prefix_spec.rb @@ -4,6 +4,9 @@ module Hearth module Middleware describe HostPrefix do let(:app) { double('app', call: output) } + let(:struct) { Struct.new(:foo, keyword_init: true) } + let(:input) { struct.new } + let(:output) { double('output') } let(:host_prefix) { 'foo.' } subject do @@ -15,17 +18,15 @@ module Middleware end describe '#call' do - let(:struct) { Struct.new(:foo, keyword_init: true) } - let(:input) { struct.new } - - let(:output) { double('output') } let(:uri) { URI('https://example.com') } let(:request) { Hearth::HTTP::Request.new(uri: uri) } let(:response) { double('response') } + let(:logger) { Logger.new(IO::NULL) } let(:context) do Context.new( request: request, - response: response + response: response, + logger: logger ) end diff --git a/hearth/spec/hearth/middleware/initialize_spec.rb b/hearth/spec/hearth/middleware/initialize_spec.rb index df7ee9ba..96a5be68 100644 --- a/hearth/spec/hearth/middleware/initialize_spec.rb +++ b/hearth/spec/hearth/middleware/initialize_spec.rb @@ -4,22 +4,25 @@ module Hearth module Middleware describe Initialize do let(:app) { double('app', call: output) } - let(:input) { double('Type::OperationInput') } + let(:input) { double('input') } let(:output) { Hearth::Output.new } - let(:request) { double('request') } - let(:response) { double('response') } - let(:interceptors) { double('interceptors', each: []) } - let(:context) do - Context.new( - request: request, - response: response, - interceptors: interceptors - ) - end subject { Initialize.new(app) } describe '#call' do + let(:request) { double('request') } + let(:response) { double('response') } + let(:logger) { Logger.new(IO::NULL) } + let(:interceptors) { double('interceptors', each: []) } + let(:context) do + Context.new( + request: request, + response: response, + logger: logger, + interceptors: interceptors + ) + end + context 'no errors' do it 'calls all of the interceptor hooks and the app' do expect(Interceptors).to receive(:invoke) diff --git a/hearth/spec/hearth/middleware/parse_spec.rb b/hearth/spec/hearth/middleware/parse_spec.rb index 67e0c2bd..d2d52de3 100644 --- a/hearth/spec/hearth/middleware/parse_spec.rb +++ b/hearth/spec/hearth/middleware/parse_spec.rb @@ -4,6 +4,8 @@ module Hearth module Middleware describe Parse do let(:app) { double('app', call: output) } + let(:input) { double('input') } + let(:output) { Hearth::Output.new(metadata: metadata) } let(:error_parser) { double('error_parser') } let(:data_parser) { double('data_parser') } @@ -12,20 +14,21 @@ module Middleware end describe '#call' do - let(:metadata) { { key: 'value' } } - let(:input) { double('input') } - let(:output) { Hearth::Output.new(metadata: metadata) } let(:request) { double('request') } let(:response) { double('response') } + let(:logger) { Logger.new(IO::NULL) } let(:interceptors) { double('interceptors', each: []) } let(:context) do Context.new( request: request, response: response, + logger: logger, interceptors: interceptors ) end + let(:metadata) { { key: 'value' } } + it 'calls the next middleware then parses an error or data' do expect(app).to receive(:call).with(input, context).ordered diff --git a/hearth/spec/hearth/middleware/retry_spec.rb b/hearth/spec/hearth/middleware/retry_spec.rb index 6af0fadc..1f44442d 100644 --- a/hearth/spec/hearth/middleware/retry_spec.rb +++ b/hearth/spec/hearth/middleware/retry_spec.rb @@ -93,7 +93,7 @@ def setup_next_response(context, test_case) module Hearth module Middleware describe Retry do - let(:input) { double('Type::OperationInput') } + let(:input) { double('input') } let(:error) do Hearth::ApiError.new( @@ -105,10 +105,12 @@ module Middleware let(:request) { Hearth::HTTP::Request.new } let(:response) { Hearth::HTTP::Response.new } let(:interceptors) { double('interceptors', each: []) } + let(:logger) { Logger.new(IO::NULL) } let(:context) do Hearth::Context.new( request: request, response: response, + logger: logger, interceptors: interceptors ) end diff --git a/hearth/spec/hearth/middleware/send_spec.rb b/hearth/spec/hearth/middleware/send_spec.rb index 52b91287..2049da87 100644 --- a/hearth/spec/hearth/middleware/send_spec.rb +++ b/hearth/spec/hearth/middleware/send_spec.rb @@ -35,10 +35,11 @@ def self.stub(resp, stub:); end describe Send do let(:app) { double('app') } + let(:input) { double('input') } + let(:output) { Hearth::Output.new } let(:client) { double('client') } let(:stub_responses) { false } let(:stubs) { Hearth::Stubs.new } - let(:logger) { double('Logger') } subject do Send.new( @@ -52,12 +53,11 @@ def self.stub(resp, stub:); end end describe '#call' do - let(:operation) { :operation } - let(:input) { double('Type::OperationInput') } - let(:output) { Hearth::Output.new } let(:request) { double('request') } let(:body) { StringIO.new } let(:response) { double('response', body: body) } + let(:operation) { :operation } + let(:logger) { Logger.new(IO::NULL) } let(:interceptors) { double('interceptors', each: []) } let(:context) do Hearth::Context.new( diff --git a/hearth/spec/hearth/middleware/sign_spec.rb b/hearth/spec/hearth/middleware/sign_spec.rb index 81e69c4a..d780b1c4 100644 --- a/hearth/spec/hearth/middleware/sign_spec.rb +++ b/hearth/spec/hearth/middleware/sign_spec.rb @@ -4,19 +4,21 @@ module Hearth module Middleware describe Build do let(:app) { double('app', call: output) } + let(:input) { double('input') } + let(:output) { Hearth::Output.new } subject { Sign.new(app) } describe '#call' do - let(:input) { double('input') } - let(:output) { Hearth::Output.new } let(:request) { double('request') } let(:response) { double('response') } + let(:logger) { Logger.new(IO::NULL) } let(:interceptors) { double('interceptors', each: []) } let(:context) do Context.new( request: request, response: response, + logger: logger, interceptors: interceptors ) end diff --git a/hearth/spec/hearth/middleware/validate_spec.rb b/hearth/spec/hearth/middleware/validate_spec.rb index c82c3460..6c8fd4c3 100644 --- a/hearth/spec/hearth/middleware/validate_spec.rb +++ b/hearth/spec/hearth/middleware/validate_spec.rb @@ -5,8 +5,7 @@ module Middleware describe Validate do let(:app) { double('app') } let(:validator) { double('validator') } - let(:data) { { foo: 'bar' } } - let(:input) { double('Type::OperationInput') } + let(:input) { double('input') } subject do Validate.new( @@ -17,7 +16,10 @@ module Middleware end describe '#call' do - let(:context) { {} } + let(:logger) { Logger.new(IO::NULL) } + let(:context) do + Hearth::Context.new(logger: logger) + end context 'validate_input is true' do let(:validate_input) { true }