Page Speed Optimization Libraries  1.7.30.1
net/instaweb/rewriter/public/css_rewrite_test_base.h
Go to the documentation of this file.
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_
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines