Page Speed Optimization Libraries
1.8.31.3
|
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()->GetUpDownCounter( 00048 CssFilter::kTotalBytesSaved); 00049 total_original_bytes_ = 00050 statistics()->GetVariable(CssFilter::kTotalOriginalBytes); 00051 num_uses_ = statistics()->GetVariable(CssFilter::kUses); 00052 num_flatten_imports_charset_mismatch_ = 00053 statistics()->GetVariable(CssFilter::kCharsetMismatch); 00054 num_flatten_imports_invalid_url_ = 00055 statistics()->GetVariable(CssFilter::kInvalidUrl); 00056 num_flatten_imports_limit_exceeded_ = 00057 statistics()->GetVariable(CssFilter::kLimitExceeded); 00058 num_flatten_imports_minify_failed_ = 00059 statistics()->GetVariable(CssFilter::kMinifyFailed); 00060 num_flatten_imports_recursion_ = 00061 statistics()->GetVariable(CssFilter::kRecursion); 00062 num_flatten_imports_complex_queries_ = 00063 statistics()->GetVariable(CssFilter::kComplexQueries); 00064 } 00065 ~CssRewriteTestBase(); 00066 00067 virtual void SetUp() { 00068 RewriteTestBase::SetUp(); 00069 options()->set_always_rewrite_css(true); 00070 AddFilter(RewriteOptions::kRewriteCss); 00071 } 00072 00073 enum ValidationFlags { 00074 kNoFlags = 0, 00075 00076 kExpectSuccess = 1<<0, 00077 kExpectCached = 1<<1, 00078 00079 kExpectNoChange = 1<<2, 00080 00081 kExpectFallback = 1<<3, 00082 kExpectFailure = 1<<4, 00083 00085 kNoStatCheck = 1<<5, 00087 kNoClearFetcher = 1<<6, 00089 kNoOtherContexts = 1<<7, 00090 00091 kLinkCharsetIsUTF8 = 1<<8, 00092 kLinkScreenMedia = 1<<9, 00093 kLinkPrintMedia = 1<<10, 00094 00095 kMetaCharsetUTF8 = 1<<11, 00096 kMetaCharsetISO88591 = 1<<12, 00097 kMetaHttpEquiv = 1<<13, 00098 kMetaHttpEquivUnquoted = 1<<14, 00099 00101 kFlattenImportsCharsetMismatch = 1<<15, 00102 kFlattenImportsInvalidUrl = 1<<16, 00103 kFlattenImportsLimitExceeded = 1<<17, 00104 kFlattenImportsMinifyFailed = 1<<18, 00105 kFlattenImportsRecursion = 1<<19, 00106 kFlattenImportsComplexQueries = 1<<20, 00107 00109 kInputHtml = 1<<21, 00110 kOutputHtml = 1<<22, 00111 }; 00112 00113 static bool ExactlyOneTrue(bool a, bool b) { 00114 return a ^ b; 00115 } 00116 static bool ExactlyOneTrue(bool a, bool b, bool c) { 00117 return ExactlyOneTrue(a, ExactlyOneTrue(b, c)); 00118 } 00119 static bool ExactlyOneTrue(bool a, bool b, bool c, bool d) { 00120 return ExactlyOneTrue(a, ExactlyOneTrue(b, c, d)); 00121 } 00122 static bool ExactlyOneTrue(bool a, bool b, bool c, bool d, bool e) { 00123 return ExactlyOneTrue(a, ExactlyOneTrue(b, c, d, e)); 00124 } 00125 00126 bool FlagSet(int flags, ValidationFlags f) const { 00127 return (flags & f) != 0; 00128 } 00129 00131 void CheckFlags(int flags) { 00132 CHECK(ExactlyOneTrue(FlagSet(flags, kExpectSuccess), 00133 FlagSet(flags, kExpectCached), 00134 FlagSet(flags, kExpectNoChange), 00135 FlagSet(flags, kExpectFallback), 00136 FlagSet(flags, kExpectFailure))); 00137 } 00138 00140 bool ValidateRewriteInlineCss(const StringPiece& id, 00141 const StringPiece& css_input, 00142 const StringPiece& expected_css_output, 00143 int flags); 00144 00145 void GetNamerForCss(const StringPiece& id, 00146 const GoogleString& expected_css_output, 00147 ResourceNamer* namer); 00148 00149 GoogleString ExpectedUrlForNamer(const ResourceNamer& namer); 00150 00151 GoogleString ExpectedUrlForCss(const StringPiece& id, 00152 const GoogleString& expected_css_output); 00153 00155 void ValidateRewriteExternalCss(const StringPiece& id, 00156 const GoogleString& css_input, 00157 const GoogleString& expected_css_output, 00158 int flags) { 00159 ValidateRewriteExternalCssUrl(id, StrCat(kTestDomain, id, ".css"), 00160 css_input, expected_css_output, flags); 00161 } 00162 00163 void ValidateRewriteExternalCssUrl(const StringPiece& id, 00164 const StringPiece& css_url, 00165 const GoogleString& css_input, 00166 const GoogleString& expected_css_output, 00167 int flags); 00168 00170 GoogleString MakeHtmlWithExternalCssLink(const StringPiece& css_url, 00171 int flags); 00172 00174 GoogleString MakeIndentedCssWithImage(StringPiece image_url); 00175 00177 GoogleString MakeMinifiedCssWithImage(StringPiece image_url); 00178 00180 GoogleString ExtractCssBackgroundImage(const GoogleString &in_css); 00181 00183 virtual GoogleString CssDebugMessage(int flags) const { 00184 return ""; 00185 } 00186 00187 void ValidateRewrite(const StringPiece& id, 00188 const GoogleString& css_input, 00189 const GoogleString& gold_output, 00190 int flags) { 00191 if (ValidateRewriteInlineCss(StrCat(id, "-inline"), 00192 css_input, gold_output, flags)) { 00194 ValidateRewriteExternalCss(StrCat(id, "-external"), 00195 css_input, gold_output, flags); 00196 } 00197 } 00198 00199 void ValidateFailParse(const StringPiece& id, const GoogleString& css_input) { 00200 ValidateRewrite(id, css_input, css_input, kExpectFailure); 00201 } 00202 00204 void ResetStats(); 00205 00207 bool ValidateWithStats( 00208 const StringPiece& id, 00209 const GoogleString& html_input, const GoogleString& expected_html_output, 00210 const StringPiece& css_input, const StringPiece& expected_css_output, 00211 int flags); 00212 00214 void TestCorruptUrl(const char* junk); 00215 00216 Variable* num_blocks_rewritten_; 00217 Variable* num_fallback_rewrites_; 00218 Variable* num_parse_failures_; 00219 Variable* num_rewrites_dropped_; 00220 Variable* total_bytes_saved_; 00221 Variable* total_original_bytes_; 00222 Variable* num_uses_; 00223 Variable* num_flatten_imports_charset_mismatch_; 00224 Variable* num_flatten_imports_invalid_url_; 00225 Variable* num_flatten_imports_limit_exceeded_; 00226 Variable* num_flatten_imports_minify_failed_; 00227 Variable* num_flatten_imports_recursion_; 00228 Variable* num_flatten_imports_complex_queries_; 00229 }; 00230 00231 } 00232 00233 #endif ///< NET_INSTAWEB_REWRITER_PUBLIC_CSS_REWRITE_TEST_BASE_H_