blob: 08a910b14adb70372ae7ba6522fcbe14499e02f6 [file] [log] [blame]
// Copyright 2013 Google Inc.
//
// Licensed 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.
//
// Author: jmarantz@google.com (Joshua Marantz)
#include "pagespeed/apache/header_util.h"
#include "pagespeed/apache/mock_apache.h"
#include "pagespeed/kernel/base/callback.h"
#include "pagespeed/kernel/base/gtest.h"
#include "pagespeed/kernel/http/http_names.h"
#include "pagespeed/kernel/http/request_headers.h"
#include "http_request.h" // NOLINT
namespace net_instaweb {
class HeaderUtilTest : public testing::Test {
public:
void PredicateMatchingA(StringPiece name, bool* ok) {
*ok = (name == "a");
}
protected:
virtual void SetUp() {
MockApache::Initialize();
MockApache::PrepareRequest(&request_);
}
virtual void TearDown() {
MockApache::CleanupRequest(&request_);
MockApache::Terminate();
}
void SetLastModified(const char* last_modified) {
apr_table_set(request_.headers_out, HttpAttributes::kLastModified,
last_modified);
}
const char* GetLastModified() {
return apr_table_get(request_.headers_out, HttpAttributes::kLastModified);
}
void SetCacheControl(const char* cache_control) {
apr_table_set(request_.headers_out, HttpAttributes::kCacheControl,
cache_control);
}
const char* GetCacheControl() {
return apr_table_get(request_.headers_out, HttpAttributes::kCacheControl);
}
request_rec request_;
};
TEST_F(HeaderUtilTest, DisableEmpty) {
DisableCacheControlHeader(&request_);
EXPECT_STREQ(HttpAttributes::kNoCacheMaxAge0, GetCacheControl());
}
TEST_F(HeaderUtilTest, DisableCaching) {
SetCacheControl("max-age=60");
DisableCacheControlHeader(&request_);
EXPECT_STREQ(HttpAttributes::kNoCacheMaxAge0, GetCacheControl());
}
TEST_F(HeaderUtilTest, DisablePrivateCaching) {
SetCacheControl("private, max-age=60");
DisableCacheControlHeader(&request_);
EXPECT_STREQ(HttpAttributes::kNoCacheMaxAge0, GetCacheControl());
}
TEST_F(HeaderUtilTest, DisablePublicCaching) {
SetCacheControl("public, max-age=60");
DisableCacheControlHeader(&request_);
EXPECT_STREQ(HttpAttributes::kNoCacheMaxAge0, GetCacheControl());
}
TEST_F(HeaderUtilTest, DisableNostore) {
SetCacheControl("must-revalidate, private, no-store");
DisableCacheControlHeader(&request_);
EXPECT_STREQ(StrCat(HttpAttributes::kNoCacheMaxAge0,
", must-revalidate, ",
HttpAttributes::kNoStore),
GetCacheControl());
}
TEST_F(HeaderUtilTest, DisableNostoreRetainNoCache) {
SetCacheControl("no-cache, must-revalidate, private, no-store");
SetLastModified("some random string");
DisableCacheControlHeader(&request_);
EXPECT_STREQ(StrCat(HttpAttributes::kNoCacheMaxAge0,
", must-revalidate, ",
HttpAttributes::kNoStore),
GetCacheControl());
EXPECT_STREQ("some random string", GetLastModified());
}
TEST_F(HeaderUtilTest, DisableCachingRelatedHeaders) {
SetCacheControl("no-cache, must-revalidate, private, no-store");
SetLastModified("some random string");
DisableCachingRelatedHeaders(&request_);
DisableCacheControlHeader(&request_);
EXPECT_EQ(NULL, GetLastModified());
EXPECT_STREQ(StrCat(HttpAttributes::kNoCacheMaxAge0,
", must-revalidate, ",
HttpAttributes::kNoStore),
GetCacheControl());
}
TEST_F(HeaderUtilTest, SelectiveRequestHeaders) {
apr_table_set(request_.headers_in, "a", "b");
apr_table_set(request_.headers_in, "c", "d");
RequestHeaders all, selective;
ApacheRequestToRequestHeaders(request_, &all);
EXPECT_STREQ("b", all.Lookup1("a"));
EXPECT_STREQ("d", all.Lookup1("c"));
EXPECT_EQ(2, all.NumAttributes());
HeaderUtilTest* test = this;
scoped_ptr<HeaderPredicateFn> predicate(NewPermanentCallback(
test, &HeaderUtilTest::PredicateMatchingA));
ApacheRequestToRequestHeaders(request_, &selective, predicate.get());
EXPECT_STREQ("b", selective.Lookup1("a"));
EXPECT_TRUE(selective.Lookup1("c") == NULL);
EXPECT_EQ(1, selective.NumAttributes());
}
} // namespace net_instaweb