Page Speed Optimization Libraries  1.2.24.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 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 
00164 
00165   void ValidateRewrite(const StringPiece& id,
00166                        const GoogleString& css_input,
00167                        const GoogleString& gold_output,
00168                        int flags) {
00169     if (ValidateRewriteInlineCss(StrCat(id, "-inline"),
00170                                  css_input, gold_output, flags)) {
00172       ValidateRewriteExternalCss(StrCat(id, "-external"),
00173                                  css_input, gold_output, flags);
00174     }
00175   }
00176 
00177   void ValidateFailParse(const StringPiece& id, const GoogleString& css_input) {
00178     ValidateRewrite(id, css_input, css_input, kExpectFailure);
00179   }
00180 
00182   void ResetStats();
00183 
00185   bool ValidateWithStats(
00186       const StringPiece& id,
00187       const GoogleString& html_input, const GoogleString& expected_html_output,
00188       const StringPiece& css_input, const StringPiece& expected_css_output,
00189       int flags);
00190 
00192   void TestCorruptUrl(const char* junk);
00193 
00194   Variable* num_blocks_rewritten_;
00195   Variable* num_fallback_rewrites_;
00196   Variable* num_parse_failures_;
00197   Variable* num_rewrites_dropped_;
00198   Variable* total_bytes_saved_;
00199   Variable* total_original_bytes_;
00200   Variable* num_uses_;
00201   Variable* num_flatten_imports_charset_mismatch_;
00202   Variable* num_flatten_imports_invalid_url_;
00203   Variable* num_flatten_imports_limit_exceeded_;
00204   Variable* num_flatten_imports_minify_failed_;
00205   Variable* num_flatten_imports_recursion_;
00206   Variable* num_flatten_imports_complex_queries_;
00207 };
00208 
00209 }  
00210 
00211 #endif  ///< NET_INSTAWEB_REWRITER_PUBLIC_CSS_REWRITE_TEST_BASE_H_
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines