// META: global=window,worker
// META: title=HTTP Cache - Freshness
// META: timeout=long
// META: script=/common/utils.js
// META: script=/common/get-host-info.sub.js
// META: script=http-cache.js

var tests = [
  // response directives
  {
    name: "HTTP cache reuses a response with a future Expires",
    requests: [
      {
        response_headers: [
          ["Expires", (30 * 24 * 60 * 60)]
        ]
      },
      {
        expected_type: "cached"
      }
    ]
  },
  {
    name: "HTTP cache does not reuse a response with a past Expires",
    requests: [
      {
        response_headers: [
          ["Expires", (-30 * 24 * 60 * 60)]
        ]
      },
      {
        expected_type: "not_cached"
      }
    ]
  },
  {
    name: "HTTP cache does not reuse a response with a present Expires",
    requests: [
      {
        response_headers: [
          ["Expires", 0]
        ]
      },
      {
        expected_type: "not_cached"
      }
    ]
  },
  {
    name: "HTTP cache does not reuse a response with an invalid Expires",
    requests: [
      {
        response_headers: [
          ["Expires", "0"]
        ]
      },
      {
        expected_type: "not_cached"
      }
    ]
  },
  {
    name: "HTTP cache does not reuse a response with an invalid Expires with Last-Modified now",
    requests: [
      {
        response_headers: [
          ["Expires", "0"],
          ['Last-Modified', 0]
        ]
      },
      {
        expected_type: "not_cached"
      }
    ]
  },
  {
    name: "HTTP cache does not reuse a response with an invalid Expires with past Last-Modified",
    requests: [
      {
        response_headers: [
          ["Expires", "0"],
          ['Last-Modified', -100000]
        ]
      },
      {
        expected_type: "not_cached"
      }
    ]
  },
  {
    name: "HTTP cache reuses a response with positive Cache-Control: max-age",
    requests: [
      {
        response_headers: [
          ["Cache-Control", "max-age=3600"]
        ]
      },
      {
        expected_type: "cached"
      }
    ]
  },
  {
    name: "HTTP cache does not reuse a response with Cache-Control: max-age=0",
    requests: [
      {
        response_headers: [
          ["Cache-Control", "max-age=0"]
        ]
      },
      {
        expected_type: "not_cached"
      }
    ]
  },
  {
    name: "HTTP cache reuses a response with positive Cache-Control: max-age and a past Expires",
    requests: [
      {
        response_headers: [
          ["Cache-Control", "max-age=3600"],
          ["Expires", -10000]
        ]
      },
      {
        expected_type: "cached"
      }
    ]
  },
  {
    name: "HTTP cache reuses a response with positive Cache-Control: max-age and an invalid Expires",
    requests: [
      {
        response_headers: [
          ["Cache-Control", "max-age=3600"],
          ["Expires", "0"]
        ]
      },
      {
        expected_type: "cached"
      }
    ]
  },
  {
    name: "HTTP cache does not reuse a response with Cache-Control: max-age=0 and a future Expires",
    requests: [
      {
        response_headers: [
          ["Cache-Control", "max-age=0"],
          ["Expires", 10000]
        ]
      },
      {
        expected_type: "not_cached"
      }
    ]
  },
  {
    name: "HTTP cache does not prefer Cache-Control: s-maxage over Cache-Control: max-age",
    requests: [
      {
        response_headers: [
          ["Cache-Control", "max-age=1, s-maxage=3600"]
        ],
        pause_after: true,
      },
      {
        expected_type: "not_cached"
      }
    ]
  },
  {
    name: "HTTP cache does not reuse a response when the Age header is greater than its freshness lifetime",
    requests: [
      {
        response_headers: [
          ["Cache-Control", "max-age=3600"],
          ["Age", "12000"]
        ],
      },
      {
        expected_type: "not_cached"
      }
    ]
  },
  {
    name: "HTTP cache does not store a response with Cache-Control: no-store",
    requests: [
      {
        response_headers: [
          ["Cache-Control", "no-store"]
        ]
      },
      {
        expected_type: "not_cached"
      }
    ]
  },
  {
    name: "HTTP cache does not store a response with Cache-Control: no-store, even with max-age and Expires",
    requests: [
      {
        response_headers: [
          ["Cache-Control", "max-age=10000, no-store"],
          ["Expires", 10000]
        ]
      },
      {
        expected_type: "not_cached"
      }
    ]
  },
  {
    name: "HTTP cache stores a response with Cache-Control: no-cache, but revalidates upon use",
    requests: [
      {
        response_headers: [
          ["Cache-Control", "no-cache"],
          ["ETag", "abcd"]
        ]
      },
      {
        expected_type: "etag_validated"
      }
    ]
  },
  {
    name: "HTTP cache stores a response with Cache-Control: no-cache, but revalidates upon use, even with max-age and Expires",
    requests: [
      {
        response_headers: [
          ["Cache-Control", "max-age=10000, no-cache"],
          ["Expires", 10000],
          ["ETag", "abcd"]
        ]
      },
      {
        expected_type: "etag_validated"
      }
    ]
  },
];
run_tests(tests);
