/*
 * Copyright 2010 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)

// Unit-test the cache extender.

#include "net/instaweb/http/public/counting_url_async_fetcher.h"
#include "net/instaweb/http/public/log_record.h"
#include "net/instaweb/http/public/logging_proto.h"
#include "net/instaweb/http/public/logging_proto_impl.h"
#include "net/instaweb/http/public/request_context.h"
#include "net/instaweb/rewriter/public/cache_extender.h"
#include "net/instaweb/rewriter/public/css_outline_filter.h"
#include "net/instaweb/rewriter/public/domain_lawyer.h"
#include "net/instaweb/rewriter/public/javascript_code_block.h"
#include "net/instaweb/rewriter/public/rewrite_driver.h"
#include "net/instaweb/rewriter/public/rewrite_options.h"
#include "net/instaweb/rewriter/public/rewrite_stats.h"
#include "net/instaweb/rewriter/public/rewrite_test_base.h"
#include "net/instaweb/rewriter/public/server_context.h"
#include "net/instaweb/rewriter/public/test_url_namer.h"
#include "pagespeed/kernel/base/basictypes.h"
#include "pagespeed/kernel/base/gmock.h"
#include "pagespeed/kernel/base/gtest.h"
#include "pagespeed/kernel/base/hasher.h"
#include "pagespeed/kernel/base/mock_message_handler.h"
#include "pagespeed/kernel/base/ref_counted_ptr.h"
#include "pagespeed/kernel/base/statistics.h"
#include "pagespeed/kernel/base/string.h"
#include "pagespeed/kernel/base/string_util.h"
#include "pagespeed/kernel/base/timer.h"
#include "pagespeed/kernel/cache/lru_cache.h"
#include "pagespeed/kernel/html/html_parse_test_base.h"
#include "pagespeed/kernel/http/content_type.h"
#include "pagespeed/kernel/http/google_url.h"
#include "pagespeed/kernel/http/http_names.h"
#include "pagespeed/kernel/http/response_headers.h"
#include "pagespeed/kernel/http/semantic_type.h"

namespace net_instaweb {

namespace {

const char kCssFormat[] = "<link rel='stylesheet' href='%s' type='text/css'>\n";
const char kHtmlFormat[] =
    "<link rel='stylesheet' href='%s' type='text/css'>%s\n"
    "<img src='%s'/>%s\n"
    "<script type='text/javascript' src='%s'></script>%s\n";

// See Issue 295: cache_extender, which only rewrites content on
// fetch, failed to recognize a cache-extended CSS file specified with
// a query-param as CSS.  It failed to recognize it because its
// file-extension was obscured by a query-param.  Moreover, we should
// not be dependent on input resource extensions to determine
// content-type.  Thus it did not run its absolutification pass.
//
// Instead we must ensure that the content-type is discovered from the
// input resource response headers.
const char kCssFile[]       = "sub/a.css?v=1";
const char kCssTail[]       = "a.css?v=1";
const char kCssSubdir[]     = "sub/";
const char kCssDataFormat[] = ".blue {color: blue; src: url(%sembedded.png);}";
const char kFilterId[]      = "ce";
const char kImageData[]     = "Not really JPEG but irrelevant for this test";
const char kJsData[]        = "alert('hello, world!')";
const char kJsDataIntrospective[] = "$('script')";
const char kNewDomain[]     = "http://new.com/";
const int kShortTtlSec      = 100;
const int kMediumTtlSec     = 100000;
const int kLongTtlSec       = 100000000;

class CacheExtenderTest : public RewriteTestBase {
 protected:
  enum InputOrOutput { kInput, kOutput, kBoth };

  CacheExtenderTest()
      : kCssData(CssData("")),
        kCssPath(StrCat(kTestDomain, kCssSubdir)),
        last_modified_on_origin_(true) {
    num_cache_extended_ = statistics()->GetVariable(
        CacheExtender::kCacheExtensions);
  }

  // TODO(matterbury): Delete this method as it should be redundant.
  virtual void SetUp() {
    RewriteTestBase::SetUp();
  }

  void InitTest(int64 ttl) {
    options()->EnableExtendCacheFilters();
    InitTestWithoutFilters(ttl);
  }

  // Initializes a resource for mock fetching.  Similar to
  // RewriteTestBase::SetResponseWithDefaultHeaders(), but
  // retains Last-Modified header as that will propagate to the output.
  void InitResource(
      StringPiece resource_name,
      const ContentType& content_type,
      StringPiece content,
      int64 ttl_sec) {
    if (last_modified_on_origin_) {
      GoogleString url = AbsolutifyUrl(resource_name);
      ResponseHeaders response_headers;
      DefaultResponseHeaders(content_type, ttl_sec, &response_headers);
      SetFetchResponse(url, response_headers, content);
    } else {
      SetResponseWithDefaultHeaders(resource_name, content_type, content,
                                    ttl_sec);
    }
  }

  void InitTestWithoutFilters(int64 ttl) {
    rewrite_driver()->AddFilters();
    InitResource(kCssFile, kContentTypeCss, kCssData, ttl);
    InitResource("b.jpg", kContentTypeJpeg, kImageData, ttl);
    InitResource("c.js", kContentTypeJavascript, kJsData, ttl);
    InitResource("introspective.js", kContentTypeJavascript,
                 kJsDataIntrospective, ttl);
    // Reset stats.
    num_cache_extended_->Clear();
  }

  // Generate HTML loading 3 resources with the specified URLs
  GoogleString GenerateHtml(const GoogleString& a,
                            const GoogleString& b,
                            const GoogleString& c,
                            InputOrOutput input_or_output) {
    GoogleString a_debug, b_debug, c_debug;
    if (input_or_output == kOutput) {
      // We never generate debug messages on input html!
      a_debug = DebugMessage(a);
      b_debug = DebugMessage(b);
      c_debug = DebugMessage(c);
    }
    return StringPrintf(kHtmlFormat,
                        a.c_str(), a_debug.c_str(),
                        b.c_str(), b_debug.c_str(),
                        c.c_str(), c_debug.c_str());
  }

  // Helper to test for how we handle trailing junk in URLs
  void TestCorruptUrl(StringPiece junk, bool append_junk) {
    InitTest(kShortTtlSec);
    GoogleString a_ext = Encode(kCssSubdir, kFilterId, "0", kCssTail, "css");
    GoogleString b_ext = Encode("", kFilterId, "0", "b.jpg", "jpg");
    GoogleString c_ext = Encode("", kFilterId, "0", "c.js", "js");

    ValidateExpected("no_ext_corrupt_fetched",
                     GenerateHtml(kCssFile, "b.jpg", "c.js", kInput),
                     GenerateHtml(a_ext, b_ext, c_ext, kOutput));
    GoogleString output;
    EXPECT_TRUE(FetchResourceUrl(
        ChangeSuffix(StrCat(kTestDomain, a_ext), append_junk, ".css", junk),
        &output));
    EXPECT_TRUE(FetchResourceUrl(
        ChangeSuffix(StrCat(kTestDomain, b_ext), append_junk, ".jpg", junk),
        &output));
    EXPECT_TRUE(FetchResourceUrl(
        ChangeSuffix(StrCat(kTestDomain, c_ext), append_junk, ".js", junk),
        &output));
    ValidateExpected("no_ext_corrupt_cached",
                     GenerateHtml(kCssFile, "b.jpg", "c.js", kInput),
                     GenerateHtml(a_ext, b_ext, c_ext, kOutput));
  }

  static GoogleString CssData(StringPiece url) {
    return StringPrintf(kCssDataFormat, url.as_string().c_str());
  }

  void TestExtendFromHtml() {
    InitTest(kShortTtlSec);
    for (int i = 0; i < 3; i++) {
      const GoogleString input_html =
          GenerateHtml(kCssFile, "b.jpg", "c.js", kInput);
      if (lru_cache()->IsHealthy()) {
        AbstractLogRecord* log_record =
            rewrite_driver()->request_context()->log_record();
        log_record->SetAllowLoggingUrls(true);
        ValidateExpected(
            "do_extend",
            input_html,
            GenerateHtml(Encode(kCssSubdir, kFilterId, "0", kCssTail, "css"),
                         Encode("", kFilterId, "0", "b.jpg", "jpg"),
                         Encode("", kFilterId, "0", "c.js", "js"), kOutput));
        EXPECT_EQ((i + 1) * 3, num_cache_extended_->Get())
            << "Number of cache extended resources is wrong";
        EXPECT_STREQ("ec,ei,es", AppliedRewriterStringFromLog());
        VerifyRewriterInfoEntry(log_record, "ec", 0, (i * 3), (i + 1) * 3,
                                3, "http://test.com/sub/a.css?v=1");
        VerifyRewriterInfoEntry(log_record, "ei", 1, 1 + (i * 3), (i + 1) * 3,
                                3, "http://test.com/b.jpg");
        VerifyRewriterInfoEntry(log_record, "es", 2, 2 + (i * 3), (i + 1) * 3,
                                3, "http://test.com/c.js");
      } else {
        ValidateNoChanges("unhealthy", input_html);
        EXPECT_EQ(0, num_cache_extended_->Get())
            << "Number of cache extended resources is wrong";
        EXPECT_STREQ("", AppliedRewriterStringFromLog());
      }
    }
  }

  void TestServeFiles() {
    GoogleString content;

    InitTest(kShortTtlSec);
    int64 expected_last_modified_time_ms = last_modified_on_origin_
        ? timer()->NowMs() : 0;

    // To ensure there's no absolutification (below) of embedded.png's URL in
    // the served CSS file, we have to serve it from test.com and not from
    // cdn.com which TestUrlNamer does when it's being used.
    ResponseHeaders headers;
    AdvanceTimeMs(10 * Timer::kSecondMs);
    ASSERT_TRUE(FetchResourceUrl(
        EncodeNormal(kCssPath, kFilterId, "0", kCssTail, "css"), &content,
        &headers));
    int64 fetch1_time_ms = timer()->NowMs();
    EXPECT_EQ(expected_last_modified_time_ms, headers.last_modified_time_ms());
    EXPECT_EQ(last_modified_on_origin_,
              headers.Has(HttpAttributes::kLastModified));
    EXPECT_GT(fetch1_time_ms, expected_last_modified_time_ms);
    // No canonical on .css
    EXPECT_FALSE(headers.Has(HttpAttributes::kLink));

    AdvanceTimeMs(10 * Timer::kSecondMs);

    EXPECT_EQ(kCssData, content);  // no absolutification
    headers.Clear();
    ASSERT_TRUE(FetchResource(kTestDomain, kFilterId, "b.jpg", "jpg",
                              &content, &headers));
    const char* link = headers.Lookup1(HttpAttributes::kLink);
    ASSERT_TRUE(link != NULL);
    // .jpg should get a canonical link.
    EXPECT_STREQ("<http://test.com/b.jpg>; rel=\"canonical\"", link);
    int64 fetch2_time_ms = timer()->NowMs();
    EXPECT_GT(fetch2_time_ms, fetch1_time_ms);
    EXPECT_EQ(expected_last_modified_time_ms, headers.last_modified_time_ms());
    EXPECT_EQ(last_modified_on_origin_,
              headers.Has(HttpAttributes::kLastModified));
    headers.Clear();
    EXPECT_EQ(GoogleString(kImageData), content);
    ASSERT_TRUE(FetchResource(kTestDomain, kFilterId, "c.js", "js", &content,
                              &headers));
    EXPECT_EQ(expected_last_modified_time_ms, headers.last_modified_time_ms());
    EXPECT_EQ(last_modified_on_origin_,
              headers.Has(HttpAttributes::kLastModified));
    // No canonical on .js
    EXPECT_FALSE(headers.Has(HttpAttributes::kLink));
    headers.Clear();

    EXPECT_EQ(GoogleString(kJsData), content);
  }

  void VerifyUnauthorizedResourcesNotExtended() {
    EnableDebug();
    SetResponseWithDefaultHeaders("http://unauth.example.com/unauth.js",
                                  kContentTypeJavascript, kJsData,
                                  kShortTtlSec);
    SetResponseWithDefaultHeaders("http://unauth.example.com/unauth.css",
                                  kContentTypeCss, kCssData, kShortTtlSec);
    const char kJsReference[] =
        "<script src='http://unauth.example.com/unauth.js'></script>";
    GoogleUrl gurl("http://unauth.example.com/unauth.xxx");
    const GoogleString kDebugMessage = StrCat(
        "<!--", rewrite_driver()->GenerateUnauthorizedDomainDebugComment(
                    gurl, RewriteDriver::InputRole::kScript),
        "-->");
    const char kCssReference[] =
        "<link rel=stylesheet href='http://unauth.example.com/unauth.css'>";
    ValidateExpected("dont_extend_unauth_js",
                     StrCat(kJsReference, kCssReference),
                     StrCat(kJsReference, kDebugMessage,
                            kCssReference, kDebugMessage));
    EXPECT_EQ(0, num_cache_extended_->Get())
        << "Number of cache extended resources is wrong";
    EXPECT_STREQ("", AppliedRewriterStringFromLog());
  }

  void TestCanonicalOnFallback(bool fallback_to_pagespeed_resource);

  Variable* num_cache_extended_;
  const GoogleString kCssData;
  const GoogleString kCssPath;
  bool last_modified_on_origin_;
};

TEST_F(CacheExtenderTest, DoExtend) {
  TestExtendFromHtml();
  EXPECT_EQ(6, lru_cache()->num_hits()) << "3 metadata * 2 cached iterations";
  EXPECT_EQ(6, lru_cache()->num_misses()) << "3 metadata + 3 input resources";
  EXPECT_EQ(6, lru_cache()->num_inserts()) << "3 metadata + 3 input resources";
  EXPECT_EQ(3, counting_url_async_fetcher()->fetch_count());
}

TEST_F(CacheExtenderTest, ExtendUnhealthy) {
  lru_cache()->set_is_healthy(false);
  TestExtendFromHtml();
  EXPECT_EQ(0, lru_cache()->num_hits());
  EXPECT_EQ(0, lru_cache()->num_misses());
  EXPECT_EQ(0, lru_cache()->num_inserts());
  EXPECT_EQ(0, counting_url_async_fetcher()->fetch_count());
}

class CacheExtenderTestPreserveURLs : public CacheExtenderTest {
 public:
  virtual void SetUp() {}

  // This function should only be called once, as it sets the filters
  // and options.
  void TestExtend(bool img_extend, bool css_extend, bool js_extend) {
    options()->SoftEnableFilterForTesting(RewriteOptions::kExtendCacheCss);
    options()->SoftEnableFilterForTesting(RewriteOptions::kExtendCacheImages);
    options()->SoftEnableFilterForTesting(RewriteOptions::kExtendCacheScripts);
    if (!img_extend) {
      options()->set_image_preserve_urls(true);
    }
    if (!css_extend) {
      options()->set_css_preserve_urls(true);
    }
    if (!js_extend) {
      options()->set_js_preserve_urls(true);
    }
    CacheExtenderTest::SetUp();
    InitTestWithoutFilters(kShortTtlSec);

    GoogleString expected_img_html = "b.jpg";
    GoogleString expected_css_html = kCssFile;
    GoogleString expected_js_html = "c.js";

    if (img_extend) {
      expected_img_html = Encode("", kFilterId, "0", "b.jpg", "jpg");
    }
    if (css_extend) {
      expected_css_html = Encode(kCssSubdir, kFilterId, "0", kCssTail, "css");
    }
    if (js_extend) {
      expected_js_html = Encode("", kFilterId, "0", "c.js", "js");
    }
    ValidateExpected(
        "do_extend",
        GenerateHtml(kCssFile, "b.jpg", "c.js", kInput),
        GenerateHtml(
            expected_css_html, expected_img_html, expected_js_html, kOutput));
  }
};

TEST_F(CacheExtenderTestPreserveURLs, CacheExtenderPreserveImageURLsOn) {
  TestExtend(false,  // img_extend
             true,   // css_extend
             true);  // js_extend
}

TEST_F(CacheExtenderTestPreserveURLs, CacheExtenderPreserveCssURLsOn) {
  TestExtend(true,   // img_extend
             false,  // css_extend
             true);  // js_extend
}

TEST_F(CacheExtenderTestPreserveURLs, CacheExtenderPreserveJsURLsOn) {
  TestExtend(true,    // img_extend
             true,    // css_extend
             false);  // js_extend
}

TEST_F(CacheExtenderTestPreserveURLs, CacheExtenderPreserveAllURLsOn) {
  TestExtend(false,   // img_extend
             false,   // css_extend
             false);  // js_extend
}

TEST_F(CacheExtenderTest, DoNotExtendUnauthorizedResources) {
  InitTest(kShortTtlSec);
  VerifyUnauthorizedResourcesNotExtended();
}

TEST_F(CacheExtenderTest, DoNotExtendUnauthorizedResourcesWithUnauthEnabled) {
  InitTest(kShortTtlSec);
  options()->ClearSignatureForTesting();
  options()->AddInlineUnauthorizedResourceType(semantic_type::kStylesheet);
  options()->AddInlineUnauthorizedResourceType(semantic_type::kScript);
  server_context()->ComputeSignature(options());
  VerifyUnauthorizedResourcesNotExtended();
}

TEST_F(CacheExtenderTest,
       DontExtendIntrospectiveDefault) {
  InitTest(kShortTtlSec);
  const char kJsTemplate[] = "<script src=\"%s\"></script>";
  ValidateExpected(
      "dont_extend_introspective_js",
      StringPrintf(kJsTemplate, "introspective.js"),
      StringPrintf(kJsTemplate, "introspective.js"));
  EXPECT_EQ(0, num_cache_extended_->Get())
      << "Number of cache extended resources is wrong";
  EXPECT_STREQ("", AppliedRewriterStringFromLog());
}

TEST_F(CacheExtenderTest,
       DontExtendIntrospectiveDebug) {
  options()->EnableFilter(RewriteOptions::kDebug);
  InitTest(kShortTtlSec);
  const char kJsTemplate[] = "<script src=\"%s\"></script>";
  GoogleString kInsertComment(
      StrCat(StringPrintf(kJsTemplate, "introspective.js"), "<!--",
                          JavascriptCodeBlock::kIntrospectionComment, "-->"));
  Parse("dont_extend_introspective_js",
        StringPrintf(kJsTemplate, "introspective.js"));
  EXPECT_THAT(output_buffer_, ::testing::HasSubstr(kInsertComment));
  EXPECT_EQ(0, num_cache_extended_->Get())
      << "Number of cache extended resources is wrong";
  EXPECT_STREQ("", AppliedRewriterStringFromLog());
}

TEST_F(CacheExtenderTest, DoExtendIntrospectiveJavascript) {
  options()->ClearSignatureForTesting();
  options()->set_avoid_renaming_introspective_javascript(false);
  InitTest(kShortTtlSec);
  const char kJsTemplate[] = "<script src=\"%s\"></script>";
  ValidateExpected(
      "do_extend_introspective_js",
      StringPrintf(kJsTemplate, "introspective.js"),
      StringPrintf(kJsTemplate, Encode(
          "", kFilterId, "0", "introspective.js", "js").c_str()));
}

TEST_F(CacheExtenderTest, DoExtendLinkRelCaseInsensitive) {
  InitTest(kShortTtlSec);
  const char kMixedCaseTemplate[] = "<link rel=StyleSheet href='%s'>";
  ValidateExpected(
      "extend_ci",
      StringPrintf(kMixedCaseTemplate, kCssFile),
      StringPrintf(kMixedCaseTemplate, Encode(
          kCssSubdir, kFilterId, "0", kCssTail, "css").c_str()));
}

TEST_F(CacheExtenderTest, DoExtendForImagesOnly) {
  AddFilter(RewriteOptions::kExtendCacheImages);
  SetResponseWithDefaultHeaders(kCssFile, kContentTypeCss,
                                kCssData, kShortTtlSec);
  SetResponseWithDefaultHeaders("b.jpg", kContentTypeJpeg,
                                kImageData, kShortTtlSec);
  SetResponseWithDefaultHeaders("c.js", kContentTypeJavascript,
                                kJsData, kShortTtlSec);

  for (int i = 0; i < 3; i++) {
    ValidateExpected(
        "do_extend",
        GenerateHtml(kCssFile, "b.jpg", "c.js", kInput),
        GenerateHtml(kCssFile, Encode(
            "", kFilterId, "0", "b.jpg", "jpg"), "c.js", kOutput));
    EXPECT_EQ((i + 1), num_cache_extended_->Get())
        << "Number of cache extended resources is wrong";
    EXPECT_STREQ("ei", AppliedRewriterStringFromLog());
  }
}

TEST_F(CacheExtenderTest, Handle404) {
  // Test to make sure that a missing input is handled well.
  options()->EnableExtendCacheFilters();
  rewrite_driver()->AddFilters();
  DebugWithMessage("<!--4xx status code, preventing rewriting of %url%-->");
  SetFetchResponse404("404.css");
  static const char kLink[] = "<link rel=stylesheet href='404.css'>";
  for (int i = 0; i < 2; ++i) {
    // Validate twice to make sure caching doesn't break it.
    ValidateExpected("404", kLink, StrCat(kLink, DebugMessage("404.css")));
  }

  // Check with metadata cache flushed but not http cache.
  lru_cache()->DeleteWithPrefixForTesting(
      ServerContext::kCacheKeyResourceNamePrefix);
  ValidateExpected("404", kLink, StrCat(kLink, DebugMessage("404.css")));
}

TEST_F(CacheExtenderTest, Handle503) {
  // Test to make sure that a missing input is handled well.
  options()->EnableExtendCacheFilters();
  rewrite_driver()->AddFilters();
  DebugWithMessage("<!--Fetch failure, preventing rewriting of %url%-->");
  GoogleString url = AbsolutifyUrl("503.css");
  ResponseHeaders response_headers;
  response_headers.SetStatusAndReason(HttpStatus::kUnavailable);
  SetFetchResponse(url, response_headers, StringPiece());
  static const char kLink[] = "<link rel=stylesheet href='503.css'>";
  for (int i = 0; i < 2; ++i) {
    // Validate twice to make sure caching doesn't break it.
    ValidateExpected("503", kLink, StrCat(kLink, DebugMessage(url)));
  }

  // Check with metadata cache flushed but not http cache.
  lru_cache()->DeleteWithPrefixForTesting(
      ServerContext::kCacheKeyResourceNamePrefix);
  ValidateExpected("503", kLink, StrCat(kLink, DebugMessage(url)));
}

TEST_F(CacheExtenderTest, UrlTooLong) {
  options()->EnableExtendCacheFilters();
  rewrite_driver()->AddFilters();

  // Make the filename too long.
  GoogleString long_string(options()->max_url_segment_size() + 1, 'z');

  GoogleString css_name = StrCat("style.css?z=", long_string);
  GoogleString jpg_name = StrCat("image.jpg?z=", long_string);
  GoogleString js_name  = StrCat("script.js?z=", long_string);
  SetResponseWithDefaultHeaders(css_name, kContentTypeCss,
                                kCssData, kShortTtlSec);
  SetResponseWithDefaultHeaders(jpg_name, kContentTypeJpeg,
                                kImageData, kShortTtlSec);
  SetResponseWithDefaultHeaders(js_name, kContentTypeJavascript,
                                kJsData, kShortTtlSec);

  // If filename wasn't too long, this would be rewritten (like in DoExtend).
  ValidateNoChanges(
      "url_too_long", GenerateHtml(css_name, jpg_name, js_name, kBoth));
  EXPECT_EQ(0, num_cache_extended_->Get())
      << "Number of cache extended resources is wrong";
}

TEST_F(CacheExtenderTest, NoInputResource) {
  InitTest(kShortTtlSec);
  // Test for not crashing on bad/disallowed URL.
  ValidateNoChanges("bad url",
                    GenerateHtml("swly://example.com/sub/a.css",
                                 "http://evil.com/b.jpg",
                                 "http://moreevil.com/c.js", kBoth));
}

TEST_F(CacheExtenderTest, NoExtendAlreadyCachedProperly) {
  InitTest(kLongTtlSec);  // cached for a long time to begin with
  ValidateNoChanges("no_extend_cached_properly",
                    GenerateHtml(kCssFile, "b.jpg", "c.js", kBoth));
  EXPECT_EQ(0, num_cache_extended_->Get())
      << "Number of cache extended resources is wrong";
}

TEST_F(CacheExtenderTest, ExtendIfSharded) {
  InitTest(kLongTtlSec);  // cached for a long time to begin with
  EXPECT_TRUE(AddShard(kTestDomain, "shard0.com,shard1.com"));
  // shard0 is always selected in the test because of our mock hasher
  // that always returns 0.
  ValidateExpected(
      "extend_if_sharded",
      GenerateHtml(kCssFile, "b.jpg", "c.js", kOutput),
      GenerateHtml(
          Encode(StrCat("http://shard0.com/", kCssSubdir),
                 kFilterId, "0", kCssTail, "css"),
          Encode("http://shard0.com/", kFilterId, "0", "b.jpg", "jpg"),
          Encode("http://shard0.com/", kFilterId, "0", "c.js", "js"), kOutput));
}

TEST_F(CacheExtenderTest, ExtendIfOriginMappedHttps) {
  InitTest(kShortTtlSec);
  EXPECT_TRUE(AddOriginDomainMapping(kTestDomain, "https://cdn.com"));
  ValidateExpected(
      "extend_if_origin_mapped_https",
      GenerateHtml("https://cdn.com/sub/a.css?v=1",
                   "https://cdn.com/b.jpg",
                   "https://cdn.com/c.js", kInput),
      GenerateHtml(
          Encode("https://cdn.com/sub/", kFilterId, "0", kCssTail, "css"),
          Encode("https://cdn.com/", kFilterId, "0", "b.jpg", "jpg"),
          Encode("https://cdn.com/", kFilterId, "0", "c.js", "js"), kOutput));
}

TEST_F(CacheExtenderTest, ExtendIfRewritten) {
  InitTest(kLongTtlSec);  // cached for a long time to begin with

  EXPECT_TRUE(AddRewriteDomainMapping("cdn.com", kTestDomain));
  ValidateExpected(
      "extend_if_rewritten",
      GenerateHtml(kCssFile, "b.jpg", "c.js", kInput),
      GenerateHtml(
          Encode("http://cdn.com/sub/", kFilterId, "0", kCssTail, "css"),
          Encode("http://cdn.com/", kFilterId, "0", "b.jpg", "jpg"),
          Encode("http://cdn.com/", kFilterId, "0", "c.js", "js"), kOutput));
  EXPECT_EQ(3, num_cache_extended_->Get())
      << "Number of cache extended resources is wrong";
  EXPECT_STREQ("ec,ei,es", AppliedRewriterStringFromLog());
}

TEST_F(CacheExtenderTest, NoLinkCanonicalIfDomainMapComplexity) {
  InitTest(kShortTtlSec);
  EXPECT_TRUE(AddRewriteDomainMapping("cdn.com", kTestDomain));
  EXPECT_TRUE(AddOriginDomainMapping(kTestDomain, "http://cdn.com"));

  ValidateExpected(
      "extend_if_rewritten",
      GenerateHtml(kCssFile, "b.jpg", "c.js", kInput),
      GenerateHtml(
          Encode("http://cdn.com/sub/", kFilterId, "0", kCssTail, "css"),
          Encode("http://cdn.com/", kFilterId, "0", "b.jpg", "jpg"),
          Encode("http://cdn.com/", kFilterId, "0", "c.js", "js"), kOutput));

  // Make sure the resource doesn't get a link header, due to
  // the rewrite mapping.
  ResponseHeaders headers;
  GoogleString content;
  ASSERT_TRUE(FetchResourceUrl(
      Encode(kTestDomain, kFilterId, "0", "b.jpg", "jpg"),
      &content, &headers));
  EXPECT_FALSE(headers.Has(HttpAttributes::kLink));

  // Likewise for reconstruction.
  lru_cache()->Clear();
  ASSERT_TRUE(FetchResourceUrl(
      Encode("http://cdn.com/", kFilterId, "0", "b.jpg", "jpg"),
      &content, &headers));
  EXPECT_FALSE(headers.Has(HttpAttributes::kLink));
}

void CacheExtenderTest::TestCanonicalOnFallback(
    bool fallback_to_pagespeed_resource) {
  // Make sure canonical header is correct if we have to go through fallback
  // path. The fallback can be one of two things:
  // 1) Another .pagespeed. resource. We get there by requesting the wrong
  //    hash. In this case, the test is looking that we don't mess things up
  //    (by e.g. duplicating the header)
  // 2) The input. We get there by setting the resources to long TTL, so the
  //    cache extender rewrite fails (as no extension is needed). In this case
  //    this makes sure we add the proper header (since input doesn't have any).
  InitTest(fallback_to_pagespeed_resource ? kShortTtlSec : kLongTtlSec);
  const char* hash = fallback_to_pagespeed_resource ? "1" : "0";

  GoogleString out_css_url(Encode(StrCat(kTestDomain, kCssSubdir),
                           kFilterId, hash, kCssTail, "css"));
  GoogleString out_jpeg_url(Encode(
      kTestDomain, kFilterId, hash, "b.jpg", "jpg"));

  GoogleString content;
  ResponseHeaders headers;

  EXPECT_TRUE(
      RewriteTestBase::FetchResourceUrl(out_css_url, &content, &headers));

  // CSS isn't expected to get a Link: header.
  EXPECT_FALSE(headers.Has(HttpAttributes::kLink));

  EXPECT_TRUE(
      RewriteTestBase::FetchResourceUrl(out_jpeg_url, &content, &headers));

  // JPEG should get a Link: header.
  EXPECT_STREQ(ResponseHeaders::RelCanonicalHeaderValue(
                   StrCat(kTestDomain, "b.jpg")),
               headers.Lookup1(HttpAttributes::kLink));

  // Should also propagate existing ones (and not add incompatible ones).
  lru_cache()->Clear();
  AddToResponse(StrCat(kTestDomain, "b.jpg"),
                HttpAttributes::kLink,
                ResponseHeaders::RelCanonicalHeaderValue(
                    StrCat(kTestDomain, "notb.jpg")));
  EXPECT_TRUE(
      RewriteTestBase::FetchResourceUrl(out_jpeg_url, &content, &headers));

  EXPECT_STREQ(ResponseHeaders::RelCanonicalHeaderValue(
                   StrCat(kTestDomain, "notb.jpg")),
               headers.Lookup1(HttpAttributes::kLink));
}

TEST_F(CacheExtenderTest, CanonicalOnFallbackToOtherPageSpeed) {
  TestCanonicalOnFallback(true);
}

TEST_F(CacheExtenderTest, CanonicalOnFallbackToInput) {
  TestCanonicalOnFallback(false);
}

TEST_F(CacheExtenderTest, ExtendIfShardedAndRewritten) {
  InitTest(kLongTtlSec);  // cached for a long time to begin with

  EXPECT_TRUE(AddRewriteDomainMapping("cdn.com", kTestDomain));

  // Domain-rewriting is performed first.  Then we shard.
  EXPECT_TRUE(AddShard("cdn.com", "shard0.com,shard1.com"));
  // shard0 is always selected in the test because of our mock hasher
  // that always returns 0.
  ValidateExpected(
      "extend_if_sharded_and_rewritten",
      GenerateHtml(kCssFile, "b.jpg", "c.js", kInput),
      GenerateHtml(
          Encode("http://shard0.com/sub/", kFilterId, "0", kCssTail, "css"),
          Encode("http://shard0.com/", kFilterId, "0", "b.jpg", "jpg"),
          Encode("http://shard0.com/", kFilterId, "0", "c.js", "js"), kOutput));
}

TEST_F(CacheExtenderTest, ExtendIfShardedToHttps) {
  InitTest(kLongTtlSec);

  // This Origin Mapping ensures any fetches are converted to http so work.
  EXPECT_TRUE(AddOriginDomainMapping(kTestDomain, "https://test.com"));

  EXPECT_TRUE(AddShard("https://test.com",
                       "https://shard0.com,https://shard1.com"));
  // shard0 is always selected in the test because of our mock hasher
  // that always returns 0.
  ValidateExpected(
      "extend_if_sharded_to_https",
      GenerateHtml("https://test.com/sub/a.css?v=1",
                   "https://test.com/b.jpg",
                   "https://test.com/c.js", kInput),
      GenerateHtml(
          Encode("https://shard0.com/sub/", kFilterId, "0", kCssTail, "css"),
          Encode("https://shard0.com/", kFilterId, "0", "b.jpg", "jpg"),
          Encode("https://shard0.com/", kFilterId, "0", "c.js", "js"),
          kOutput));
}

TEST_F(CacheExtenderTest, ExtendIfShardedAndRewritingAndMappingHttps) {
  // This test started out trying to unit test mod_pagespeed issue #400 by
  // replicating the settings the poster used. They didn't work, basically
  // because the wildcard directive for *test.com conflicted with the later
  // non-wildcard ones. After much experimentation we came up with these
  // settings (without wildcards) that seem to do what the poster wants.
  InitTest(kLongTtlSec);
  SetResponseWithDefaultHeaders(StrCat("http://www.test.com/", kCssFile),
                                kContentTypeCss, kCssData, kLongTtlSec);
  SetResponseWithDefaultHeaders("http://www.test.com/b.jpg", kContentTypeJpeg,
                                kImageData, kLongTtlSec);
  SetResponseWithDefaultHeaders("http://www.test.com/c.js",
                                kContentTypeJavascript, kJsData, kLongTtlSec);

  // Set up the mappings that -should- work for issue 400.
  ASSERT_TRUE(AddRewriteDomainMapping("http://cdn.com",
                                      "http://test.com,http://www.test.com"));
  ASSERT_TRUE(AddRewriteDomainMapping("https://cdn.com",
                                      "https://test.com,https://www.test.com"));
  ASSERT_TRUE(AddShard("http://cdn.com",
                       "http://s1.cdn.com,http://s2.cdn.com"));
  ASSERT_TRUE(AddShard("https://cdn.com",
                       "https://s1.cdn.com,https://s2.cdn.com"));
  ASSERT_TRUE(AddOriginDomainMapping("http://test.com", "https://test.com"));
  ASSERT_TRUE(AddOriginDomainMapping("http://test.com",
                                     "https://www.test.com"));

  // shard0 is always selected in the test because of our mock hasher
  // that always returns 0.
  ValidateExpected(
      "extend_if_sharded_rewriting_mapping_bare_domain_http",
      GenerateHtml("http://test.com/sub/a.css?v=1",
                   "http://test.com/b.jpg",
                   "http://test.com/c.js", kInput),
      GenerateHtml(
          Encode("http://s1.cdn.com/sub/", kFilterId, "0", kCssTail, "css"),
          Encode("http://s1.cdn.com/", kFilterId, "0", "b.jpg", "jpg"),
          Encode("http://s1.cdn.com/", kFilterId, "0", "c.js", "js"), kOutput));
  ValidateExpected(
      "extend_if_sharded_rewriting_mapping_bare_domain_https",
      GenerateHtml("https://test.com/sub/a.css?v=1",
                   "https://test.com/b.jpg",
                   "https://test.com/c.js", kInput),
      GenerateHtml(
          Encode("https://s1.cdn.com/sub/", kFilterId, "0", kCssTail, "css"),
          Encode("https://s1.cdn.com/", kFilterId, "0", "b.jpg", "jpg"),
          Encode("https://s1.cdn.com/", kFilterId, "0", "c.js", "js"),
          kOutput));
  ValidateExpected(
      "extend_if_sharded_rewriting_mapping_www_domain_http",
      GenerateHtml("http://www.test.com/sub/a.css?v=1",
                   "http://www.test.com/b.jpg",
                   "http://www.test.com/c.js", kInput),
      GenerateHtml(
          Encode("http://s1.cdn.com/sub/", kFilterId, "0", kCssTail, "css"),
          Encode("http://s1.cdn.com/", kFilterId, "0", "b.jpg", "jpg"),
          Encode("http://s1.cdn.com/", kFilterId, "0", "c.js", "js"), kOutput));
  ValidateExpected(
      "extend_if_sharded_rewriting_mapping_www_domain_https",
      GenerateHtml("https://www.test.com/sub/a.css?v=1",
                   "https://www.test.com/b.jpg",
                   "https://www.test.com/c.js", kInput),
      GenerateHtml(
          Encode("https://s1.cdn.com/sub/", kFilterId, "0", kCssTail, "css"),
          Encode("https://s1.cdn.com/", kFilterId, "0", "b.jpg", "jpg"),
          Encode("https://s1.cdn.com/", kFilterId, "0", "c.js", "js"),
          kOutput));
}

// TODO(jmarantz): consider implementing and testing the sharding and
// domain-rewriting of uncacheable resources -- just don't sign the URLs.

TEST_F(CacheExtenderTest, NoExtendOriginUncacheable) {
  InitTest(0);  // origin not cacheable
  DebugWithMessage("<!--Uncacheable content, preventing rewriting of %url%-->");
  ValidateExpected(
      "no_extend_origin_not_cacheable",
      GenerateHtml(kCssFile, "b.jpg", "c.js", kInput),
      GenerateHtml(kCssFile, "b.jpg", "c.js", kOutput));
  EXPECT_EQ(0, num_cache_extended_->Get())
      << "Number of cache extended resources is wrong";
}

TEST_F(CacheExtenderTest, ServeFiles) {
  last_modified_on_origin_ = true;
  TestServeFiles();
}

TEST_F(CacheExtenderTest, ServeFilesNoLastModifiedOnOrigin) {
  last_modified_on_origin_ = false;
  TestServeFiles();
}

TEST_F(CacheExtenderTest, ServeFilesUnhealthy) {
  lru_cache()->set_is_healthy(false);
  TestServeFiles();
}

TEST_F(CacheExtenderTest, ConsistentHashWithRewrite) {
  // Since CacheExtend is an on-the-fly filter, ServeFilesWithRewrite, above,
  // verifies that we can decode a cache-extended CSS file and properly
  // domain-rewrite embedded images.  However, we go through the exercise
  // of generating the rewritten content in the HTML path too -- we just
  // don't cache it.  However, what we must do is generate the correct hash
  // code.  To test that we need to use the real hasher.
  UseMd5Hasher();
  AddRewriteDomainMapping(kNewDomain, kTestDomain);
  InitTest(kShortTtlSec);

  // First do the HTML rewrite.
  GoogleString hash = hasher()->Hash(kCssData);
  GoogleString extended_css =
      Encode(StrCat(kNewDomain, kCssSubdir), kFilterId, hash, kCssTail, "css");
  ValidateExpected("consistent_hash",
                   StringPrintf(kCssFormat, kCssFile),
                   StringPrintf(kCssFormat, extended_css.c_str()));

  // Note that the only output that gets cached is the MetaData insert, not
  // the rewritten content, because this is an on-the-fly filter and we
  // elect not to add cache pressure. We do of course also cache the original,
  // and under traditional flow also get it from the cache.
  EXPECT_EQ(2, lru_cache()->num_inserts());
  EXPECT_EQ(0, lru_cache()->num_hits());

  // TODO(jmarantz): To make this test pass we need to set up the mock
  // fetcher so it can find the resource in new.com, not just
  // test.com.  Functionally, this wouldn't be needed with a
  // functional installation where both test.com and new.com are the
  // same physical server.  However it does indicate that we are going
  // to fetch the resource using its original resolved name while
  // rewriting HTML, but then when we serve the cache-extended
  // resource we will not have it in our cache; we will have to fetch
  // it again using the new name.  We ought to be canonicalizing the
  // URLs we write into the cache so we don't need this.  This also
  // applies to sharding.
  SetResponseWithDefaultHeaders(StrCat(kNewDomain, kCssFile), kContentTypeCss,
                                kCssData, kShortTtlSec);

  // Now serve the resource, as in ServeFilesWithRewrite above.
  GoogleString content;
  ASSERT_TRUE(FetchResourceUrl(extended_css, &content));
  EXPECT_EQ(kCssData, content);
}

TEST_F(CacheExtenderTest, ConsistentHashWithShard) {
  // Similar to ConsistentHashWithRewrite, except that we've added sharding,
  // and the shard computed for the embedded image is (luckily for the test)
  // different than that for the .css file, thus the references within the
  // css file are rewritten as absolute.
  UseMd5Hasher();
  AddRewriteDomainMapping(kNewDomain, kTestDomain);
  AddShard(kNewDomain, "shard1.com,shard2.com");
  InitTest(kShortTtlSec);

  // First do the HTML rewrite.
  const char kHash[] = "MnXHB3ChUY";
  GoogleString extended_css = Encode("http://shard2.com/sub/", kFilterId, kHash,
                                     kCssTail, "css");
  ValidateExpected("consistent_hash",
                   StringPrintf(kCssFormat, kCssFile),
                   StringPrintf(kCssFormat, extended_css.c_str()));

  // Note that the only output that gets cached is the MetaData insert, not
  // the rewritten content, because this is an on-the-fly filter and we
  // elect not to add cache pressure. We do of course also cache the original,
  // and under traditional flow also get it from the cache.
  EXPECT_EQ(2, lru_cache()->num_inserts());
  EXPECT_EQ(0, lru_cache()->num_hits());

  // TODO(jmarantz): eliminate this when we canonicalize URLs before caching.
  SetResponseWithDefaultHeaders(StrCat("http://shard2.com/", kCssFile),
                                kContentTypeCss, kCssData, kShortTtlSec);

  // Now serve the resource, as in ServeFilesWithRewrite above.
  GoogleString content;
  ASSERT_TRUE(FetchResourceUrl(extended_css, &content));

  // Note that, through the luck of hashes, we've sharded the embedded
  // image differently than the css file.
  EXPECT_EQ(CssData("http://shard1.com/sub/"), content);
  EXPECT_EQ(kHash, hasher()->Hash(content));
}

TEST_F(CacheExtenderTest, ServeFilesWithRewriteDomainsEnabled) {
  GoogleString content;
  AddRewriteDomainMapping(kNewDomain, kTestDomain);
  InitTest(kShortTtlSec);
  ASSERT_TRUE(FetchResource(kCssPath, kFilterId, kCssTail, "css", &content));
  EXPECT_EQ(CssData("http://new.com/sub/"), content);
}

TEST_F(CacheExtenderTest, ServeFilesWithRewriteDomainAndPathEnabled) {
  GoogleString content;
  AddRewriteDomainMapping("http://new.com/test/", kTestDomain);
  InitTest(kShortTtlSec);
  ASSERT_TRUE(FetchResource(kCssPath, kFilterId, kCssTail, "css", &content));
  EXPECT_EQ(CssData("http://new.com/test/sub/"), content);
}

TEST_F(CacheExtenderTest, ServeFilesWithShard) {
  GoogleString content;
  AddRewriteDomainMapping(kNewDomain, kTestDomain);
  AddShard(kNewDomain, "shard1.com,shard2.com");
  InitTest(kShortTtlSec);
  ASSERT_TRUE(FetchResource(kCssPath, kFilterId, kCssTail, "css", &content));
  EXPECT_EQ(CssData("http://shard1.com/sub/"), content);
}

TEST_F(CacheExtenderTest, ServeFilesFromDelayedFetch) {
  InitTest(kShortTtlSec);
  // To ensure there's no absolutification (below) of embedded.png's URL in
  // the served CSS file, we have to serve it from test.com and not from
  // cdn.com which TestUrlNamer does when it's being used.
  ServeResourceFromManyContexts(
      EncodeNormal(kCssPath, kFilterId, "0", kCssTail, "css"), kCssData);
  ServeResourceFromManyContexts(Encode(
      kTestDomain, kFilterId, "0", "b.jpg", "jpg"), kImageData);
  ServeResourceFromManyContexts(Encode(
      kTestDomain, kFilterId, "0", "c.js", "js"), kJsData);

  // TODO(jmarantz): make ServeResourceFromManyContexts check:
  //  1. Gets the data from the cache, with no mock fetchers, null file system
  //  2. Gets the data from the file system, with no cache, no mock fetchers.
  //  3. Gets the data from the mock fetchers: no cache, no file system.
}

TEST_F(CacheExtenderTest, MinimizeCacheHits) {
  options()->EnableFilter(RewriteOptions::kOutlineCss);
  options()->EnableFilter(RewriteOptions::kExtendCacheCss);
  options()->set_css_outline_min_bytes(1);
  rewrite_driver()->AddFilters();
  GoogleString html_input = StrCat("<style>", kCssData, "</style>");
  GoogleString html_output = StringPrintf(
      "<link rel=\"stylesheet\" href=\"%s\">",
      Encode(kTestDomain, CssOutlineFilter::kFilterId, "0", "_",
             "css").c_str());
  ValidateExpected("no_extend_origin_not_cacheable", html_input, html_output);

  // The key thing about this test is that the CacheExtendFilter should
  // not pound the cache looking to see if it's already rewritten this
  // resource.  If we try, in the cache extend filter, to this already-optimized
  // resource from the cache, then we'll get a cache-hit and decide that
  // it's already got a long cache lifetime.  But we should know, just from
  // the name of the resource, that it should not be cache extended.
  // The CSS outliner also should not produce any cache misses, as it currently
  // does not cache.
  EXPECT_EQ(0, lru_cache()->num_hits());
  EXPECT_EQ(0, lru_cache()->num_misses());
}

TEST_F(CacheExtenderTest, NoExtensionCorruption) {
  TestCorruptUrl("%22", true /* append %22 */);
}

TEST_F(CacheExtenderTest, NoQueryCorruption) {
  TestCorruptUrl("?query", true /* append ?query*/);
}

TEST_F(CacheExtenderTest, NoWrongExtCorruption) {
  TestCorruptUrl(".html", false /* replace ext with .html */);
}

TEST_F(CacheExtenderTest, MadeOnTheFly) {
  // Make sure our fetches go through on-the-fly construction and not the cache.
  InitTest(kMediumTtlSec);

  GoogleString b_ext = Encode("", kFilterId, "0", "b.jpg", "jpg");
  ValidateExpected("and_img", "<img src=\"b.jpg\">",
                   StrCat("<img src=\"", b_ext, "\">"));

  RewriteStats* stats = server_context()->rewrite_stats();
  EXPECT_EQ(0, stats->cached_resource_fetches()->Get());
  EXPECT_EQ(0, stats->succeeded_filter_resource_fetches()->Get());
  GoogleString out;
  EXPECT_TRUE(FetchResourceUrl(StrCat(kTestDomain, b_ext), &out));
  EXPECT_EQ(0, stats->cached_resource_fetches()->Get());
  EXPECT_EQ(1, stats->succeeded_filter_resource_fetches()->Get());
}

// http://github.com/pagespeed/mod_pagespeed/issues/324
TEST_F(CacheExtenderTest, RetainExtraHeaders) {
  GoogleString url = StrCat(kTestDomain, "retain.css");
  SetResponseWithDefaultHeaders(url, kContentTypeCss, kCssData, 300);
  // We must explicitly call ComputeSignature here because we are not
  // calling InitTest in this test.
  server_context()->ComputeSignature(options());
  TestRetainExtraHeaders("retain.css", kFilterId, "css");
}

TEST_F(CacheExtenderTest, TrimUrlInteraction) {
  options()->EnableFilter(RewriteOptions::kLeftTrimUrls);
  InitTest(kMediumTtlSec);

  // Force all URL encoding to use normal encoding so that the relative URL
  // trimming logic can work and give us a relative URL result as expected.
  TestUrlNamer::UseNormalEncoding(true);

  GoogleString a_ext = Encode(kCssSubdir, kFilterId, "0", kCssTail, "css");
  ValidateExpected("ce_then_trim",
                   StringPrintf(kCssFormat, kCssFile),
                   StringPrintf(kCssFormat, a_ext.c_str()));
}

TEST_F(CacheExtenderTest, DefangHtml) {
  options()->EnableExtendCacheFilters();
  rewrite_driver()->AddFilters();
  // Make sure that we downgrade HTML and similar executable types
  // to text/plain if we cache extend them. This closes off XSS
  // vectors if the domain lawyer is (mis)configured too loosely.
  SetResponseWithDefaultHeaders("a.html", kContentTypeHtml,
                                "boo!", kShortTtlSec);
  SetResponseWithDefaultHeaders("a.xhtml", kContentTypeXhtml,
                                "bwahahaha!", kShortTtlSec);
  SetResponseWithDefaultHeaders("a.xml", kContentTypeXml,
                                "boo!", kShortTtlSec);

  const GoogleString css_before = StrCat(CssLinkHref("a.html"),
                                         CssLinkHref("a.xhtml"),
                                         CssLinkHref("a.xml"));
  ValidateNoChanges("defang", css_before);
}

// Negative test to ensure we do not cache-extend CSS that was already
// minified (and thus has a long cache lifetime).
TEST_F(CacheExtenderTest, DoNotExtendRewrittenCss) {
  static const char kRewriteDomain[] = "http://rewrite.example.com/";
  static const char kShard1Domain[] = "http://shard1.example.com/";
  static const char kShard2Domain[] = "http://shard2.example.com/";
  DomainLawyer* lawyer = options()->WriteableDomainLawyer();
  lawyer->AddRewriteDomainMapping(kRewriteDomain, kTestDomain,
                                  message_handler());
  lawyer->AddShard(kRewriteDomain,
                   StrCat(kShard1Domain, ",", kShard2Domain),
                   message_handler());
  options()->EnableFilter(RewriteOptions::kRewriteCss);
  InitTest(kShortTtlSec);
  ValidateExpected(
      "do_not_extend_rewritten_css",
      StringPrintf(kCssFormat, kCssFile),
      StringPrintf(kCssFormat, Encode(
          StrCat(kShard1Domain, kCssSubdir), RewriteOptions::kCssFilterId,
          "0", kCssTail, "css").c_str()));

  // Also we shouldn't have bumped our stat mistakenly just because
  // the CSS filter optimized the slot.
  EXPECT_EQ(0,
            rewrite_driver()->statistics()->GetVariable(
                CacheExtender::kCacheExtensions)->Get());
}

// See: http://www.alistapart.com/articles/alternate/
//  and http://www.w3.org/TR/html4/present/styles.html#h-14.3.1
TEST_F(CacheExtenderTest, AlternateStylesheet) {
  InitTest(kMediumTtlSec);

  const char html_format[] = "<link rel='%s' href='%s' title='foo'>";
  const GoogleString new_url = Encode(
      kCssSubdir, kFilterId, "0", kCssTail, "css");

  ValidateExpected("preferred_stylesheet",
                   StringPrintf(html_format, "stylesheet", kCssFile),
                   StringPrintf(html_format, "stylesheet", new_url.c_str()));

  ValidateExpected("alternate_stylesheet",
                   StringPrintf(html_format, "alternate stylesheet", kCssFile),
                   StringPrintf(html_format, "alternate stylesheet",
                                new_url.c_str()));

  ValidateExpected("alternate_stylesheet2",
                   StringPrintf(html_format, " StyleSheet alterNATE  ",
                                kCssFile),
                   StringPrintf(html_format, " StyleSheet alterNATE  ",
                                new_url.c_str()));

  ValidateExpected("alternate_stylesheet_and_more",
                   StringPrintf(html_format, "  foo stylesheet alternate bar ",
                                kCssFile),
                   StringPrintf(html_format, "  foo stylesheet alternate bar ",
                                new_url.c_str()));
  ValidateNoChanges("alternate_not_stylesheet",
                    StringPrintf(html_format, "alternate snowflake", kCssFile));
}

TEST_F(CacheExtenderTest, PreserveUrlRelativity) {
  options()->set_preserve_url_relativity(true);
  InitTest(kMediumTtlSec);

  ValidateExpected("preserve_url_relativity",
                   "<img src=b.jpg>",
                   "<img src=b.jpg.pagespeed.ce.0.jpg>");
}

TEST_F(CacheExtenderTest, NoPreserveUrlRelativity) {
  options()->set_preserve_url_relativity(false);
  InitTest(kMediumTtlSec);

  ValidateExpected("preserve_url_relativity",
                   "<img src=b.jpg>",
                   "<img src=http://test.com/b.jpg.pagespeed.ce.0.jpg>");
}

TEST_F(CacheExtenderTest, ContentTypeValidation) {
  ValidateFallbackHeaderSanitization("ce");
}

TEST_F(CacheExtenderTest, SrcSet) {
  InitTest(100);
  InitResource("a.jpg", kContentTypeJpeg, kImageData, 100);
  InitResource("b.jpg", kContentTypeJpeg, kImageData, 100);

  const GoogleString a_url = Encode("", kFilterId, "0", "a.jpg", "jpg");
  const GoogleString b_url = Encode("", kFilterId, "0", "b.jpg", "jpg");

  ValidateExpected("srcset",
                   "<img src=a.jpg srcset=\"a.jpg 1x, b.jpg 2x\">",
                   StrCat("<img src=", a_url, " srcset=\"",
                          a_url, " 1x, ", b_url, " 2x\">"));
}

TEST_F(CacheExtenderTest, VaryOrigin) {
  options()->EnableExtendCacheFilters();
  rewrite_driver()->AddFilters();

  GoogleString url = AbsolutifyUrl("a.css");
  ResponseHeaders response_headers;
  DefaultResponseHeaders(kContentTypeCss, 100 /* ttl */, &response_headers);
  response_headers.Add("Vary", "Origin");
  SetFetchResponse(url, response_headers, "css file");

  GoogleString cache_extended_css = Encode("", kFilterId, "0", "a.css", "css");
  ValidateExpected("vary origin",
                   StringPrintf(kCssFormat, "a.css"),
                   StringPrintf(kCssFormat, cache_extended_css.c_str()));
}

TEST_F(CacheExtenderTest, RenderCsp) {
  InitTest(kShortTtlSec);
  EnableDebug();

  InitResource("a.jpg", kContentTypeJpeg, kImageData, kShortTtlSec);
  InitResource("b.js", kContentTypeJavascript, kJsData, kShortTtlSec);
  InitResource("c.css", kContentTypeCss, "* {display:   block; }",
               kShortTtlSec);

  const char kCsp[] =
      "<meta http-equiv=\"Content-Security-Policy\" "
      "content=\"img-src *; script-src */b.js; style-src */c.css;\">";

  // First rewrite w/o CSP, everything is expanded.
  ValidateExpected("no_csp",
                   "<img src=a.jpg><script src=b.js></script>"
                   "<link rel=stylesheet href=c.css>",
                   "<img src=a.jpg.pagespeed.ce.0.jpg>"
                   "<script src=b.js.pagespeed.ce.0.js></script>"
                   "<link rel=stylesheet href=c.css.pagespeed.ce.0.css>");


  // Now with CSP, script and style are blocked by it at render time
  ValidateExpected(
      "render_csp",
      StrCat(kCsp,
             "<img src=a.jpg><script src=b.js></script>"
             "<link rel=stylesheet href=c.css>"),
      StrCat(kCsp,
             "<img src=a.jpg.pagespeed.ce.0.jpg>"
             "<script src=b.js></script>"
             "<!--PageSpeed output (by CacheExtender) not permitted by Content "
             "Security Policy-->"
             "<link rel=stylesheet href=c.css>"
             "<!--PageSpeed output (by CacheExtender) not permitted by Content "
             "Security Policy"
             "-->"));
}

}  // namespace

}  // namespace net_instaweb
