blob: b1a1852cc3f58c5b095b24492ac292e875d1d17b [file] [log] [blame]
/*
* Copyright 2012 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
// Author: jmaessen@google.com (Jan-Willem Maessen)
#include "base/logging.h"
#include "pagespeed/kernel/base/basictypes.h"
#include "pagespeed/kernel/base/benchmark.h"
#include "pagespeed/kernel/base/gtest.h"
#include "pagespeed/kernel/base/string_util.h"
#include "pagespeed/kernel/base/fast_wildcard_group.h"
#include "pagespeed/kernel/base/wildcard_group.h"
namespace net_instaweb {
namespace {
template<class G>
class UrlBlacklistTest {
public:
UrlBlacklistTest(int size, bool include_wildcards)
: size_(size) {
if (include_wildcards) {
Disallow("");
Allow("?*");
}
// See also RewriteOptions::DisallowTroublesomeResources.
// Here we fall through all statements as each case is inclusive of the ones
// that follow.
switch (size) {
case 14:
Disallow("*js_tinyMCE*"); // js_tinyMCE.js
FALLTHROUGH_INTENDED;
case 13:
Disallow("*tiny_mce*");
FALLTHROUGH_INTENDED;
case 12:
Disallow("*tinymce*");
FALLTHROUGH_INTENDED;
case 11:
Disallow("*scriptaculous.js*");
FALLTHROUGH_INTENDED;
case 10:
Disallow("*connect.facebook.net/*");
FALLTHROUGH_INTENDED;
case 9:
Disallow("*ckeditor*");
FALLTHROUGH_INTENDED;
case 8:
Disallow("*//ajax.googleapis.com/ajax/libs/*");
FALLTHROUGH_INTENDED;
case 7:
Disallow("*//pagead2.googlesyndication.com/pagead/show_ads.js*");
FALLTHROUGH_INTENDED;
case 6:
Disallow("*//partner.googleadservices.com/gampad/google_service.js*");
FALLTHROUGH_INTENDED;
case 5:
Disallow("*//platform.twitter.com/widgets.js*");
FALLTHROUGH_INTENDED;
case 4:
Disallow("*//s7.addthis.com/js/250/addthis_widget.js*");
FALLTHROUGH_INTENDED;
case 3:
Disallow("*//www.google.com/coop/cse/brand*");
FALLTHROUGH_INTENDED;
case 2:
Disallow("*//www.google-analytics.com/urchin.js*");
FALLTHROUGH_INTENDED;
case 1:
Disallow("*//www.googleadservices.com/pagead/conversion.js*");
FALLTHROUGH_INTENDED;
default:
break;
}
}
~UrlBlacklistTest() { }
void PerformLookups() {
CHECK(IsAllowed("http://platform.linkedin.com/in.js"));
CHECK(IsAllowed("http://www.minecraftdl.com/wp-content/w3tc/min/"
"f2077/default.include.849527.js"));
CHECK(IsAllowed("http://www.minecraftdl.com/wp-includes/js/jquery/"
"jquery.js,qver=1.7.1"));
CHECK(IsAllowed("http://www.lijit.com/delivery/fp,"
"qu=ittikorns,ai=lijit_region_143587,az=143587,an=4"));
CHECK(IsAllowed("http://www.priceindia.in/cj/js/script.js"));
CHECK_EQ(
size_ < 8,
IsAllowed("http://ajax.googleapis.com/ajax/libs/"
"jquery/1.6.4/jquery.min.js"));
CHECK(IsAllowed("http://annoncesgirls.com/wp-includes/js/jquery/"
"ui/jquery.ui.mouse.min.js"));
CHECK_EQ(
size_ < 1,
IsAllowed("http://www.googleadservices.com/pagead/conversion.js"));
CHECK(IsAllowed("http://anticariatultau.ro/catalog/view/javascript/"
"common.js"));
CHECK(IsAllowed("http://blog.gooera.com/wp-content/plugins/"
"search-google/js/search-google.js,qver=1.4"));
CHECK_EQ(
size_ < 7,
IsAllowed("http://pagead2.googlesyndication.com/pagead/"
"show_ads.js?_=1339538917578"));
CHECK(IsAllowed("http://cellcustomize.com/wp-content/themes/yoo_balance_wp/"
"js/template.js"));
CHECK_EQ(
size_ < 6,
IsAllowed("http://partner.googleadservices.com/gampad/"
"google_service.js"));
CHECK(IsAllowed("http://cb.yebhi.com/js/combo.js"));
CHECK(IsAllowed("http://chunchu.org/syntaxhighlighter/scripts/"
"shBrushClojure.js"));
CHECK(IsAllowed("http://angel.ge/templates/moxeve/js/geo.js"));
CHECK_EQ(
size_ < 7,
IsAllowed("http://pagead2.googlesyndication.com/pagead/"
"show_ads.js"));
CHECK(IsAllowed("http://education.ge/SpryAssets/SpryMenuBar.js"));
CHECK(IsAllowed("http://anticariatultau.ro/catalog/view/javascript/"
"common.js"));
CHECK_EQ(
size_ < 5,
IsAllowed("http://platform.twitter.com/widgets.js"));
CHECK(IsAllowed("http://jishinyochi.net/js/glossy.js"));
CHECK(IsAllowed("http://mblaze.websiteforever.com/dashboard120607/js/"
"region.js"));
CHECK(IsAllowed("http://members.lovingfromadistance.com/clientscript/"
"vbulletin_ajax_htmlloader.js"));
CHECK(IsAllowed("http://movie-renamer.fr/js/roundabout_shapes.js"));
}
private:
void Allow(const StringPiece& s) {
blacklist_.Allow(s);
}
void Disallow(const StringPiece& s) {
blacklist_.Disallow(s);
}
bool IsAllowed(const StringPiece& s) {
return blacklist_.Match(s, true);
}
G blacklist_;
int size_;
};
template<class G> static void UrlBlacklistBenchmark(
int iters, int size, bool include_wildcards) {
UrlBlacklistTest<G> test_object(size, include_wildcards);
for (int i = 0; i < iters; ++i) {
test_object.PerformLookups();
}
}
void BM_WildcardGroup(int iters, int size) {
int actual_size = size / 2;
bool include_wildcards = (size % 2) == 1;
UrlBlacklistBenchmark<WildcardGroup>(iters, actual_size, include_wildcards);
}
void BM_FastWildcardGroup(int iters, int size) {
int actual_size = size / 2;
bool include_wildcards = (size % 2) == 1;
UrlBlacklistBenchmark<FastWildcardGroup>(
iters, actual_size, include_wildcards);
}
// Test version of this code, designed to make sure larger wildcard groups are
// routinely exercised.
class FastWildcardGroupScaleTest : public testing::Test {
};
TEST_F(FastWildcardGroupScaleTest, LargeWildcardGroup) {
UrlBlacklistBenchmark<WildcardGroup>(1, 14, true);
}
TEST_F(FastWildcardGroupScaleTest, LargeFastWildcardGroup) {
UrlBlacklistBenchmark<FastWildcardGroup>(1, 14, true);
}
} // namespace
} // namespace net_instaweb