1868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
51320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "media/blink/cache_util.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/format_macros.h"
10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/strings/string_number_conversions.h"
117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/strings/string_util.h"
127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/strings/stringprintf.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
14868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebString.h"
15868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebURLResponse.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebString;
18f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebURLResponse;
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccinamespace media {
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Inputs & expected output for GetReasonsForUncacheability.
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct GRFUTestCase {
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebURLResponse::HTTPVersion version;
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int status_code;
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char* headers;
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint32 expected_reasons;
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Create a new WebURLResponse object.
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static WebURLResponse CreateResponse(const GRFUTestCase& test) {
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebURLResponse response;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  response.initialize();
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  response.setHTTPVersion(test.version);
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  response.setHTTPStatusCode(test.status_code);
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<std::string> lines;
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Tokenize(test.headers, "\n", &lines);
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < lines.size(); ++i) {
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    size_t colon = lines[i].find(": ");
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    response.addHTTPHeaderField(
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        WebString::fromUTF8(lines[i].substr(0, colon)),
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        WebString::fromUTF8(lines[i].substr(colon + 2)));
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return response;
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(CacheUtilTest, GetReasonsForUncacheability) {
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  enum { kNoReasons = 0 };
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GRFUTestCase tests[] = {
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WebURLResponse::HTTP_1_1, 206, "ETag: 'fooblort'", kNoReasons
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WebURLResponse::HTTP_1_1, 206, "", kNoStrongValidatorOnPartialResponse
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WebURLResponse::HTTP_1_0, 206, "",
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kPre11PartialResponse | kNoStrongValidatorOnPartialResponse
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WebURLResponse::HTTP_1_1, 200, "cache-control: max-Age=42", kShortMaxAge
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WebURLResponse::HTTP_1_1, 200, "cache-control: max-Age=4200", kNoReasons
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WebURLResponse::HTTP_1_1, 200,
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "Date: Tue, 22 May 2012 23:46:08 GMT\n"
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "Expires: Tue, 22 May 2012 23:56:08 GMT", kExpiresTooSoon
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WebURLResponse::HTTP_1_1, 200, "cache-control: must-revalidate",
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kHasMustRevalidate
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WebURLResponse::HTTP_1_1, 200, "cache-control: no-cache", kNoCache
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WebURLResponse::HTTP_1_1, 200, "cache-control: no-store", kNoStore
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WebURLResponse::HTTP_1_1, 200,
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "cache-control: no-cache\ncache-control: no-store", kNoCache | kNoStore
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < arraysize(tests); ++i) {
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SCOPED_TRACE(base::StringPrintf("case: %" PRIuS
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                    ", version: %d, code: %d, headers: %s",
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                    i, tests[i].version, tests[i].status_code,
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                    tests[i].headers));
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(GetReasonsForUncacheability(CreateResponse(tests[i])),
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              tests[i].expected_reasons);
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}  // namespace media
98