Page Speed Optimization Libraries  1.8.31.3
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()->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_
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines