#  Licensed to the Apache Software Foundation (ASF) under one
#  or more contributor license agreements.  See the NOTICE file
#  distributed with this work for additional information
#  regarding copyright ownership.  The ASF licenses this file
#  to you under the Apache License, Version 2.0 (the
#  "License"); you may not use this file except in compliance
#  with the License.  You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
#  Unless required by applicable law or agreed to in writing, software
#  distributed under the License is distributed on an "AS IS" BASIS,
#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
#  See the License for the specific language governing permissions and
#  limitations under the License.

#
# Verify negative_revalidating disabled behavior. This replay file assumes:
#   * ATS is configured with negative_revalidating disabled.
#   * max_stale_age is set to 6 seconds.
#

meta:
  version: "1.0"

sessions:
- transactions:

  #
  # Test 1: Negative revalidating for a cached content-length response.
  #
  - client-request:
      method: "GET"
      version: "1.1"
      scheme: "http"
      url: /path/reques_item
      headers:
        fields:
        - [ Host, example.com ]
        - [ uuid, 11 ]

    # Populate the cache with a 200 response.
    server-response:
      status: 200
      reason: "OK"
      headers:
        fields:
        - [ Content-Length, 32 ]
        - [ Cache-Control, max-age=2 ]

    proxy-response:
      status: 200

  # Verify we serve the 200 OK out of the cache if it is not stale.
  - client-request:
      method: "GET"
      version: "1.1"
      scheme: "http"
      url: /path/reques_item
      headers:
        fields:
        - [ Host, example.com ]
        - [ uuid, 12 ]

      # Give cache IO enough time to finish.
      delay: 100ms

    # This should not reach the origin server.
    server-response:
      status: 503
      reason: "Service Unavailable"
      headers:
        fields:
        - [ Content-Length, 32 ]

    # Again, we should serve this out of the cache.
    proxy-response:
      status: 200

  # Verify that with negative_revalidating enabled, we serve the 200 OK out of
  # the cache even though it is stale (but younger than max_stale_age).
  - client-request:
      method: "GET"
      version: "1.1"
      scheme: "http"
      url: /path/reques_item
      headers:
        fields:
        - [ Host, example.com ]
        - [ uuid, 13 ]

      # Make sure the item is stale per it's 2 second max-age.
      delay: 4s

    server-response:
      status: 503
      reason: "Service Unavailable"
      headers:
        fields:
        - [ Content-Length, 32 ]

    # With negative_revalidating enabled, the cached response should be served
    # even though it is stale.
    proxy-response:
      status: 200

  # Verify that max_stale_age is respected.
  - client-request:
      method: "GET"
      version: "1.1"
      scheme: "http"
      url: /path/reques_item
      headers:
        fields:
        - [ Host, example.com ]
        - [ uuid, 14 ]

          # After this delay, the item is 8 seconds old. This makes it:
          #  6 seconds beyond the server's max-age of 2 seconds and
          #  2 seconds beyond ATS's max_stale_age of 6 seconds.
      delay: 4s

    server-response:
      status: 503
      reason: "Service Unavailable"
      headers:
        fields:
        - [ Content-Length, 32 ]

    # negative_revalidating is enabled, but now the cached item is older than
    # max_stale_age.
    proxy-response:
      status: 503

  #
  # Test 2: Negative revalidating for a cached chunk encoded response.
  #
  # This serves as a Regression test for:
  # https://github.com/apache/trafficserver/issues/7880
  #
  - client-request:
      method: "GET"
      version: "1.1"
      url: /HTTP/p
      headers:
        fields:
        - [ Host, example.com ]
        - [ uuid, 21 ]

    # Populate the cache with a 200, chunked response.
    server-response:
      status: 200
      reason: "OK"
      headers:
        fields:
        - [ cache-control, max-age=2 ]
        - [ Transfer-Encoding, chunked ]

      content:
        size: 2072

    proxy-response:
      status: 200

  # Verify we serve the 200 OK out of the cache if it is not stale.
  - client-request:
      method: "GET"
      version: "1.1"
      url: /HTTP/p
      headers:
        fields:
        - [ Host, example.com ]
        - [ uuid, 22 ]

    # This should not reach the origin server.
    server-response:
      status: 503
      reason: "Service Unavailable"
      headers:
        fields:
        - [ Content-Length, 32 ]

    # Again, we should serve this out of the cache.
    proxy-response:
      status: 200

  # Verify that with negative_revalidating enabled, we serve the 200 OK out of
  # the cache even though it is stale (but younger than max_stale_age).
  - client-request:
      method: "GET"
      version: "1.1"
      url: /HTTP/p
      headers:
        fields:
        - [ Host, example.com ]
        - [ uuid, 23 ]

      # Make sure the item is stale per it's 2 second max-age.
      delay: 4s

    server-response:
      status: 503
      reason: "Service Unavailable"
      headers:
        fields:
        - [ Content-Length, 32 ]
        - [ Cache-Control, max-age=2 ]

    # With negative_revalidating enabled, the cached response should be served
    # even though it is stale.
    proxy-response:
      status: 200

  # Verify that max_stale_age is respected.
  - client-request:
      method: "GET"
      version: "1.1"
      url: /HTTP/p
      headers:
        fields:
        - [ Host, example.com ]
        - [ uuid, 24 ]

          # After this delay, the item is 8 seconds old. This makes it:
          #  6 seconds beyond the server's max-age of 2 seconds and
          #  2 seconds beyond ATS's max_stale_age of 6 seconds.
      delay: 4s

    server-response:
      status: 503
      reason: "Service Unavailable"
      headers:
        fields:
        - [ Content-Length, 32 ]

    # negative_revalidating is enabled, but now the cached item is older than
    # max_stale_age.
    proxy-response:
      status: 503
