+
+TEST_F(HttpResponseHeadersCacheControlTest, AbsentMaxAgeReturnsFalse) {
+ InitializeHeadersWithCacheControl("nocache");
+ EXPECT_FALSE(headers()->GetMaxAgeValue(TimeDeltaPointer()));
+}
+
+TEST_F(HttpResponseHeadersCacheControlTest, MaxAgeWithNoParameterRejected) {
+ InitializeHeadersWithCacheControl("max-age=,private");
+ EXPECT_FALSE(headers()->GetMaxAgeValue(TimeDeltaPointer()));
+}
+
+TEST_F(HttpResponseHeadersCacheControlTest, MaxAgeWithSpaceParameterRejected) {
+ InitializeHeadersWithCacheControl("max-age= ,private");
+ EXPECT_FALSE(headers()->GetMaxAgeValue(TimeDeltaPointer()));
+}
+
+TEST_F(HttpResponseHeadersCacheControlTest,
+ MaxAgeWithSpaceBeforeEqualsIsRejected) {
+ InitializeHeadersWithCacheControl("max-age = 7");
+ EXPECT_FALSE(headers()->GetMaxAgeValue(TimeDeltaPointer()));
+}
+
+TEST_F(HttpResponseHeadersCacheControlTest, MaxAgeFirstMatchUsed) {
+ InitializeHeadersWithCacheControl("max-age=10, max-age=20");
+ EXPECT_EQ(TimeDelta::FromSeconds(10), GetMaxAgeValue());
+}
+
+TEST_F(HttpResponseHeadersCacheControlTest, MaxAgeBogusFirstMatchUsed) {
+ // max-age10 isn't parsed as max-age; max-age=now is parsed as max-age=0 and
+ // so max-age=20 is not used.
+ InitializeHeadersWithCacheControl("max-age10, max-age=now, max-age=20");
+ EXPECT_EQ(TimeDelta::FromSeconds(0), GetMaxAgeValue());
+}
+
+TEST_F(HttpResponseHeadersCacheControlTest, MaxAgeCaseInsensitive) {
+ InitializeHeadersWithCacheControl("Max-aGe=15");
+ EXPECT_EQ(TimeDelta::FromSeconds(15), GetMaxAgeValue());
+}
+
+TEST_F(HttpResponseHeadersCacheControlTest, MaxAgeEdgeCases) {
+ // This test doesn't use TEST_P() for consistency with the rest of the tests
+ // in this file.
+ // TODO(ricea): Port the tests in this file to use TEST_P().
+ const struct {
+ const char* max_age_string;
+ int64 expected_seconds;
+ } tests[] = {
+ {" 1 ", 1}, // Spaces are ignored
+ {"-1", -1}, // Negative numbers are passed through
+ {"--1", 0}, // Leading junk gives 0
+ {"2s", 2}, // trailing junk is ignored
+ {"3 days", 3},
+ {"'4'", 0}, // single quotes don't work
+ {"\"5\"", 0}, // double quotes don't work
+ {"0x6", 0}, // hex not parsed as hex
+ {"7F", 7}, // hex without 0x still not parsed as hex
+ {"010", 10}, // octal not parsed as octal
+ {"9223372036854", 9223372036854},
+ // {"9223372036855", -9223372036854}, // undefined behaviour
+ // {"9223372036854775806", -2}, // undefined behaviour
+ {"9223372036854775807", 9223372036854775807},
+ {"20000000000000000000",
+ std::numeric_limits<int64>::max()}, // overflow int64
+ };
+ std::string max_age = "max-age=";
+ for (size_t i = 0; i < arraysize(tests); ++i) {
+ InitializeHeadersWithCacheControl(
+ (max_age + tests[i].max_age_string).c_str());
+ EXPECT_EQ(tests[i].expected_seconds, GetMaxAgeValue().InSeconds())
+ << " for max-age=" << tests[i].max_age_string;
+ }
+}
+
+TEST_F(HttpResponseHeadersCacheControlTest,
+ AbsentStaleWhileRevalidateReturnsFalse) {
+ InitializeHeadersWithCacheControl("max-age=3600");
+ EXPECT_FALSE(headers()->GetStaleWhileRevalidateValue(TimeDeltaPointer()));
+}
+
+TEST_F(HttpResponseHeadersCacheControlTest,
+ StaleWhileRevalidateWithoutValueRejected) {
+ InitializeHeadersWithCacheControl("max-age=3600,stale-while-revalidate=");
+ EXPECT_FALSE(headers()->GetStaleWhileRevalidateValue(TimeDeltaPointer()));
+}
+
+TEST_F(HttpResponseHeadersCacheControlTest,
+ StaleWhileRevalidateWithInvalidValueTreatedAsZero) {
+ InitializeHeadersWithCacheControl("max-age=3600,stale-while-revalidate=true");
+ EXPECT_EQ(TimeDelta(), GetStaleWhileRevalidateValue());
+}
+
+TEST_F(HttpResponseHeadersCacheControlTest, StaleWhileRevalidateValueReturned) {
+ InitializeHeadersWithCacheControl("max-age=3600,stale-while-revalidate=7200");
+ EXPECT_EQ(TimeDelta::FromSeconds(7200), GetStaleWhileRevalidateValue());
+}
+
+TEST_F(HttpResponseHeadersCacheControlTest,
+ FirstStaleWhileRevalidateValueUsed) {
+ InitializeHeadersWithCacheControl(
+ "stale-while-revalidate=1,stale-while-revalidate=7200");
+ EXPECT_EQ(TimeDelta::FromSeconds(1), GetStaleWhileRevalidateValue());
+}