Page Speed Optimization Libraries
1.7.30.1
|
00001 /* 00002 * Copyright 2011 Google Inc. 00003 * 00004 * Licensed under the Apache License, Version 2.0 (the "License"); 00005 * you may not use this file except in compliance with the License. 00006 * You may obtain a copy of the License at 00007 * 00008 * http:///www.apache.org/licenses/LICENSE-2.0 00009 * 00010 * Unless required by applicable law or agreed to in writing, software 00011 * distributed under the License is distributed on an "AS IS" BASIS, 00012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 00013 * See the License for the specific language governing permissions and 00014 * limitations under the License. 00015 */ 00016 00018 00020 00021 #ifndef NET_INSTAWEB_REWRITER_PUBLIC_CSS_REWRITE_TEST_BASE_H_ 00022 #define NET_INSTAWEB_REWRITER_PUBLIC_CSS_REWRITE_TEST_BASE_H_ 00023 00024 #include "base/logging.h" 00025 #include "net/instaweb/htmlparse/public/html_parse_test_base.h" 00026 #include "net/instaweb/rewriter/public/css_filter.h" 00027 #include "net/instaweb/rewriter/public/rewrite_test_base.h" 00028 #include "net/instaweb/rewriter/public/rewrite_options.h" 00029 #include "net/instaweb/util/public/statistics.h" 00030 #include "net/instaweb/util/public/string.h" 00031 #include "net/instaweb/util/public/string_util.h" 00032 00033 namespace net_instaweb { 00034 00035 class ResourceNamer; 00036 00037 class CssRewriteTestBase : public RewriteTestBase { 00038 protected: 00039 CssRewriteTestBase() { 00040 num_blocks_rewritten_ = 00041 statistics()->GetVariable(CssFilter::kBlocksRewritten); 00042 num_fallback_rewrites_ = 00043 statistics()->GetVariable(CssFilter::kFallbackRewrites); 00044 num_parse_failures_ = statistics()->GetVariable(CssFilter::kParseFailures); 00045 num_rewrites_dropped_ = 00046 statistics()->GetVariable(CssFilter::kRewritesDropped); 00047 total_bytes_saved_ = statistics()->GetVariable(CssFilter::kTotalBytesSaved); 00048 total_original_bytes_ = 00049 statistics()->GetVariable(CssFilter::kTotalOriginalBytes); 00050 num_uses_ = statistics()->GetVariable(CssFilter::kUses); 00051 num_flatten_imports_charset_mismatch_ = 00052 statistics()->GetVariable(CssFilter::kCharsetMismatch); 00053 num_flatten_imports_invalid_url_ = 00054 statistics()->GetVariable(CssFilter::kInvalidUrl); 00055 num_flatten_imports_limit_exceeded_ = 00056 statistics()->GetVariable(CssFilter::kLimitExceeded); 00057 num_flatten_imports_minify_failed_ = 00058 statistics()->GetVariable(CssFilter::kMinifyFailed); 00059 num_flatten_imports_recursion_ = 00060 statistics()->GetVariable(CssFilter::kRecursion); 00061 num_flatten_imports_complex_queries_ = 00062 statistics()->GetVariable(CssFilter::kComplexQueries); 00063 } 00064 ~CssRewriteTestBase(); 00065 00066 virtual void SetUp() { 00067 RewriteTestBase::SetUp(); 00068 options()->set_always_rewrite_css(true); 00069 AddFilter(RewriteOptions::kRewriteCss); 00070 } 00071 00072 enum ValidationFlags { 00073 kNoFlags = 0, 00074 00075 kExpectSuccess = 1<<0, 00076 kExpectCached = 1<<1, 00077 00078 kExpectNoChange = 1<<2, 00079 00080 kExpectFallback = 1<<3, 00081 kExpectFailure = 1<<4, 00082 00084 kNoStatCheck = 1<<5, 00086 kNoClearFetcher = 1<<6, 00088 kNoOtherContexts = 1<<7, 00089 00090 kLinkCharsetIsUTF8 = 1<<8, 00091 kLinkScreenMedia = 1<<9, 00092 kLinkPrintMedia = 1<<10, 00093 00094 kMetaCharsetUTF8 = 1<<11, 00095 kMetaCharsetISO88591 = 1<<12, 00096 kMetaHttpEquiv = 1<<13, 00097 kMetaHttpEquivUnquoted = 1<<14, 00098 00100 kFlattenImportsCharsetMismatch = 1<<15, 00101 kFlattenImportsInvalidUrl = 1<<16, 00102 kFlattenImportsLimitExceeded = 1<<17, 00103 kFlattenImportsMinifyFailed = 1<<18, 00104 kFlattenImportsRecursion = 1<<19, 00105 kFlattenImportsComplexQueries = 1<<20, 00106 00108 kInputHtml = 1<<21, 00109 kOutputHtml = 1<<22, 00110 }; 00111 00112 static bool ExactlyOneTrue(bool a, bool b) { 00113 return a ^ b; 00114 } 00115 static bool ExactlyOneTrue(bool a, bool b, bool c) { 00116 return ExactlyOneTrue(a, ExactlyOneTrue(b, c)); 00117 } 00118 static bool ExactlyOneTrue(bool a, bool b, bool c, bool d) { 00119 return ExactlyOneTrue(a, ExactlyOneTrue(b, c, d)); 00120 } 00121 static bool ExactlyOneTrue(bool a, bool b, bool c, bool d, bool e) { 00122 return ExactlyOneTrue(a, ExactlyOneTrue(b, c, d, e)); 00123 } 00124 00125 bool FlagSet(int flags, ValidationFlags f) const { 00126 return (flags & f) != 0; 00127 } 00128 00130 void CheckFlags(int flags) { 00131 CHECK(ExactlyOneTrue(FlagSet(flags, kExpectSuccess), 00132 FlagSet(flags, kExpectCached), 00133 FlagSet(flags, kExpectNoChange), 00134 FlagSet(flags, kExpectFallback), 00135 FlagSet(flags, kExpectFailure))); 00136 } 00137 00139 bool ValidateRewriteInlineCss(const StringPiece& id, 00140 const StringPiece& css_input, 00141 const StringPiece& expected_css_output, 00142 int flags); 00143 00144 void GetNamerForCss(const StringPiece& id, 00145 const GoogleString& expected_css_output, 00146 ResourceNamer* namer); 00147 00148 GoogleString ExpectedUrlForNamer(const ResourceNamer& namer); 00149 00150 GoogleString ExpectedUrlForCss(const StringPiece& id, 00151 const GoogleString& expected_css_output); 00152 00154 void ValidateRewriteExternalCss(const StringPiece& id, 00155 const GoogleString& css_input, 00156 const GoogleString& expected_css_output, 00157 int flags) { 00158 ValidateRewriteExternalCssUrl(id, StrCat(kTestDomain, id, ".css"), 00159 css_input, expected_css_output, flags); 00160 } 00161 00162 void ValidateRewriteExternalCssUrl(const StringPiece& id, 00163 const StringPiece& css_url, 00164 const GoogleString& css_input, 00165 const GoogleString& expected_css_output, 00166 int flags); 00167 00169 GoogleString MakeHtmlWithExternalCssLink(const StringPiece& css_url, 00170 int flags); 00171 00173 GoogleString MakeIndentedCssWithImage(StringPiece image_url); 00174 00176 GoogleString MakeMinifiedCssWithImage(StringPiece image_url); 00177 00179 GoogleString ExtractCssBackgroundImage(const GoogleString &in_css); 00180 00182 virtual GoogleString CssDebugMessage(int flags) const { 00183 return ""; 00184 } 00185 00186 void ValidateRewrite(const StringPiece& id, 00187 const GoogleString& css_input, 00188 const GoogleString& gold_output, 00189 int flags) { 00190 if (ValidateRewriteInlineCss(StrCat(id, "-inline"), 00191 css_input, gold_output, flags)) { 00193 ValidateRewriteExternalCss(StrCat(id, "-external"), 00194 css_input, gold_output, flags); 00195 } 00196 } 00197 00198 void ValidateFailParse(const StringPiece& id, const GoogleString& css_input) { 00199 ValidateRewrite(id, css_input, css_input, kExpectFailure); 00200 } 00201 00203 void ResetStats(); 00204 00206 bool ValidateWithStats( 00207 const StringPiece& id, 00208 const GoogleString& html_input, const GoogleString& expected_html_output, 00209 const StringPiece& css_input, const StringPiece& expected_css_output, 00210 int flags); 00211 00213 void TestCorruptUrl(const char* junk); 00214 00215 Variable* num_blocks_rewritten_; 00216 Variable* num_fallback_rewrites_; 00217 Variable* num_parse_failures_; 00218 Variable* num_rewrites_dropped_; 00219 Variable* total_bytes_saved_; 00220 Variable* total_original_bytes_; 00221 Variable* num_uses_; 00222 Variable* num_flatten_imports_charset_mismatch_; 00223 Variable* num_flatten_imports_invalid_url_; 00224 Variable* num_flatten_imports_limit_exceeded_; 00225 Variable* num_flatten_imports_minify_failed_; 00226 Variable* num_flatten_imports_recursion_; 00227 Variable* num_flatten_imports_complex_queries_; 00228 }; 00229 00230 } 00231 00232 #endif ///< NET_INSTAWEB_REWRITER_PUBLIC_CSS_REWRITE_TEST_BASE_H_