Page Speed Optimization Libraries
1.4.26.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 struct ContentType; 00037 00038 class CssRewriteTestBase : public RewriteTestBase { 00039 protected: 00040 CssRewriteTestBase() { 00041 num_blocks_rewritten_ = 00042 statistics()->GetVariable(CssFilter::kBlocksRewritten); 00043 num_fallback_rewrites_ = 00044 statistics()->GetVariable(CssFilter::kFallbackRewrites); 00045 num_parse_failures_ = statistics()->GetVariable(CssFilter::kParseFailures); 00046 num_rewrites_dropped_ = 00047 statistics()->GetVariable(CssFilter::kRewritesDropped); 00048 total_bytes_saved_ = statistics()->GetVariable(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, 00077 kExpectNoChange = 2, 00078 00079 kExpectFallback = 4, 00080 kExpectFailure = 8, 00081 00083 kNoStatCheck = 16, 00085 kNoClearFetcher = 32, 00087 kNoOtherContexts = 64, 00088 00089 kLinkCharsetIsUTF8 = 128, 00090 kLinkScreenMedia = 256, 00091 kLinkPrintMedia = 512, 00092 00093 kMetaCharsetUTF8 = 1024, 00094 kMetaCharsetISO88591 = 2048, 00095 kMetaHttpEquiv = 4096, 00096 kMetaHttpEquivUnquoted = 8192, 00097 00099 kFlattenImportsCharsetMismatch = 1<<14, 00100 kFlattenImportsInvalidUrl = 1<<15, 00101 kFlattenImportsLimitExceeded = 1<<16, 00102 kFlattenImportsMinifyFailed = 1<<17, 00103 kFlattenImportsRecursion = 1<<18, 00104 kFlattenImportsComplexQueries = 1<<19, 00105 }; 00106 00107 static bool ExactlyOneTrue(bool a, bool b) { 00108 return a ^ b; 00109 } 00110 static bool ExactlyOneTrue(bool a, bool b, bool c) { 00111 return ExactlyOneTrue(a, ExactlyOneTrue(b, c)); 00112 } 00113 static bool ExactlyOneTrue(bool a, bool b, bool c, bool d) { 00114 return ExactlyOneTrue(a, ExactlyOneTrue(b, c, d)); 00115 } 00116 00117 bool FlagSet(int flags, ValidationFlags f) { 00118 return (flags & f) != 0; 00119 } 00120 00122 void CheckFlags(int flags) { 00123 CHECK(ExactlyOneTrue(FlagSet(flags, kExpectSuccess), 00124 FlagSet(flags, kExpectNoChange), 00125 FlagSet(flags, kExpectFallback), 00126 FlagSet(flags, kExpectFailure))); 00127 } 00128 00130 bool ValidateRewriteInlineCss(const StringPiece& id, 00131 const StringPiece& css_input, 00132 const StringPiece& expected_css_output, 00133 int flags); 00134 00136 GoogleString ExpectedRewrittenUrl(const StringPiece& original_url, 00137 const StringPiece& expected_contents, 00138 const StringPiece& filter_id, 00139 const ContentType& content_type); 00140 00141 void GetNamerForCss(const StringPiece& id, 00142 const GoogleString& expected_css_output, 00143 ResourceNamer* namer); 00144 00145 GoogleString ExpectedUrlForNamer(const ResourceNamer& namer); 00146 00147 GoogleString ExpectedUrlForCss(const StringPiece& id, 00148 const GoogleString& expected_css_output); 00149 00151 void ValidateRewriteExternalCss(const StringPiece& id, 00152 const GoogleString& css_input, 00153 const GoogleString& expected_css_output, 00154 int flags) { 00155 ValidateRewriteExternalCssUrl(StrCat(kTestDomain, id, ".css"), 00156 css_input, expected_css_output, flags); 00157 } 00158 00159 void ValidateRewriteExternalCssUrl(const StringPiece& css_url, 00160 const GoogleString& css_input, 00161 const GoogleString& expected_css_output, 00162 int flags); 00163 00165 GoogleString MakeHtmlWithExternalCssLink(const StringPiece& css_url, 00166 int flags); 00167 00169 GoogleString MakeIndentedCssWithImage(StringPiece image_url); 00170 00172 GoogleString MakeMinifiedCssWithImage(StringPiece image_url); 00173 00174 void ValidateRewrite(const StringPiece& id, 00175 const GoogleString& css_input, 00176 const GoogleString& gold_output, 00177 int flags) { 00178 if (ValidateRewriteInlineCss(StrCat(id, "-inline"), 00179 css_input, gold_output, flags)) { 00181 ValidateRewriteExternalCss(StrCat(id, "-external"), 00182 css_input, gold_output, flags); 00183 } 00184 } 00185 00186 void ValidateFailParse(const StringPiece& id, const GoogleString& css_input) { 00187 ValidateRewrite(id, css_input, css_input, kExpectFailure); 00188 } 00189 00191 void ResetStats(); 00192 00194 bool ValidateWithStats( 00195 const StringPiece& id, 00196 const GoogleString& html_input, const GoogleString& expected_html_output, 00197 const StringPiece& css_input, const StringPiece& expected_css_output, 00198 int flags); 00199 00201 void TestCorruptUrl(const char* junk); 00202 00203 Variable* num_blocks_rewritten_; 00204 Variable* num_fallback_rewrites_; 00205 Variable* num_parse_failures_; 00206 Variable* num_rewrites_dropped_; 00207 Variable* total_bytes_saved_; 00208 Variable* total_original_bytes_; 00209 Variable* num_uses_; 00210 Variable* num_flatten_imports_charset_mismatch_; 00211 Variable* num_flatten_imports_invalid_url_; 00212 Variable* num_flatten_imports_limit_exceeded_; 00213 Variable* num_flatten_imports_minify_failed_; 00214 Variable* num_flatten_imports_recursion_; 00215 Variable* num_flatten_imports_complex_queries_; 00216 }; 00217 00218 } 00219 00220 #endif ///< NET_INSTAWEB_REWRITER_PUBLIC_CSS_REWRITE_TEST_BASE_H_