/* This Source Code Form is subject to the terms of the Mozilla Public *License,v.2.0.IfacopyoftheMPLwasnotdistributedwiththis
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
TEST(TestNoVarySearchParse, EmptyHeader)
{ auto d = Parse("");
EXPECT_EQ(d.paramsRule, NoVarySearchData::ParamsRule::ExactMatch);
EXPECT_TRUE(d.varyOnKeyOrder);
}
TEST(TestNoVarySearchParse, InvalidSF)
{ auto d = Parse("!!!not valid sf!!!");
EXPECT_EQ(d.paramsRule, NoVarySearchData::ParamsRule::ExactMatch);
}
TEST(TestNoVarySearchParse, ParamsInvalidType)
{ // params with an integer value is not a valid type → ExactMatch auto d = Parse("params=42");
EXPECT_EQ(d.paramsRule, NoVarySearchData::ParamsRule::ExactMatch);
}
TEST(TestNoVarySearchParse, UnknownKeysOnly)
{ // Header with only unknown keys → ExactMatch (no params, no except) auto d = Parse("x-custom=?1, x-other=?0");
EXPECT_EQ(d.paramsRule, NoVarySearchData::ParamsRule::ExactMatch);
EXPECT_TRUE(d.varyOnKeyOrder);
}
TEST(TestNoVarySearchParse, ParamsAndExceptTogether)
{ // params=(inner list) + except → invalid → ExactMatch auto d = Parse(R"(params=("a"), except=("b"))");
EXPECT_EQ(d.paramsRule, NoVarySearchData::ParamsRule::ExactMatch);
}
TEST(TestNoVarySearchParse, ExceptWithoutParams)
{ // except without params → invalid → ExactMatch auto d = Parse(R"(except=("a"))");
EXPECT_EQ(d.paramsRule, NoVarySearchData::ParamsRule::ExactMatch);
}
TEST(TestNoVarySearchParse, ExceptEmptyWithoutParams)
{ // except with empty inner list, no params → invalid → ExactMatch auto d = Parse("except=()");
EXPECT_EQ(d.paramsRule, NoVarySearchData::ParamsRule::ExactMatch);
}
TEST(TestNoVarySearchParse, ParamsExplicitBooleanTrue)
{ // params=?1 (explicit boolean true) → IgnoreAll, same as bare params auto d = Parse("params=?1");
EXPECT_EQ(d.paramsRule, NoVarySearchData::ParamsRule::IgnoreAll);
EXPECT_TRUE(d.paramNames.IsEmpty());
}
TEST(TestNoVarySearchParse, ParamsExplicitBooleanFalse)
{ // params=?0 (boolean false) → ExactMatch (not IgnoreAll) auto d = Parse("params=?0");
EXPECT_EQ(d.paramsRule, NoVarySearchData::ParamsRule::ExactMatch);
}
TEST(TestNoVarySearchParse, ParamsSingleItem)
{ auto d = Parse(R"(params=("a"))");
EXPECT_EQ(d.paramsRule, NoVarySearchData::ParamsRule::Blocklist);
ASSERT_EQ(d.paramNames.Length(), 1u);
EXPECT_EQ(d.paramNames[0], "a"_ns);
}
TEST(TestNoVarySearchParse, ParamsMultipleItems)
{ auto d = Parse(R"(params=("a" "b" "c"))");
EXPECT_EQ(d.paramsRule, NoVarySearchData::ParamsRule::Blocklist);
ASSERT_EQ(d.paramNames.Length(), 3u);
EXPECT_EQ(d.paramNames[0], "a"_ns);
EXPECT_EQ(d.paramNames[1], "b"_ns);
EXPECT_EQ(d.paramNames[2], "c"_ns);
}
TEST(TestNoVarySearchParse, KeyOrderExplicitTrue)
{ // key-order=?1 (explicit boolean true) → varyOnKeyOrder=false auto d = Parse("key-order=?1");
EXPECT_FALSE(d.varyOnKeyOrder);
}
TEST(TestNoVarySearchParse, KeyOrderExplicitFalse)
{ // key-order=?0 → varyOnKeyOrder=true (order matters, explicit default) auto d = Parse("key-order=?0");
EXPECT_TRUE(d.varyOnKeyOrder);
}
TEST(TestNoVarySearchParse, KeyOrderCombinedWithParams)
{ auto d = Parse(R"(params=("utm"), key-order)");
EXPECT_EQ(d.paramsRule, NoVarySearchData::ParamsRule::Blocklist);
ASSERT_EQ(d.paramNames.Length(), 1u);
EXPECT_EQ(d.paramNames[0], "utm"_ns);
EXPECT_FALSE(d.varyOnKeyOrder);
}
TEST(TestNoVarySearchParse, SFExtensionParamsOnItemsIgnored)
{ // Unknown SF parameters on items must be ignored auto d = Parse(R"(params=("a";unknown="x"))");
EXPECT_EQ(d.paramsRule, NoVarySearchData::ParamsRule::Blocklist);
ASSERT_EQ(d.paramNames.Length(), 1u);
EXPECT_EQ(d.paramNames[0], "a"_ns);
}
// Blocklist: many params in query string, only some in NVS list
{"Blocklist: many params, only listed ones ignored → HIT", "https://example.com/p?a=1&b=2&c=3&d=4&e=5", "https://example.com/p?a=9&b=8&c=3&d=4&e=5", R"(params=("a" "b"))", true},
{"Blocklist: many params, non-listed param differs → MISS", "https://example.com/p?a=1&b=2&c=3&d=4&e=5", "https://example.com/p?a=9&b=8&c=3&d=4&e=99", R"(params=("a" "b"))", false},
// Blocklist: params in query don't match any NVS listed params
{"Blocklist: no query params match NVS list → treated as ExactMatch", "https://example.com/p?x=1&y=2", "https://example.com/p?x=1&y=3",
R"(params=("a" "b"))", false},
{"Blocklist: no query params match NVS list, identical → HIT", "https://example.com/p?x=1&y=2", "https://example.com/p?x=1&y=2",
R"(params=("a" "b"))", true},
// Invalid SF → ExactMatch fallback
{"Invalid SF (params inner list + except) → ExactMatch → MISS", "https://example.com/p?a=1", "https://example.com/p?a=2",
R"(params=("a"), except=("b"))", false},
// multi-value params
{"key-order: multi-value, same values reordered by key → HIT", "https://example.com/p?a=1&a=2&b=3", "https://example.com/p?b=3&a=1&a=2", "key-order", true},
{"key-order: multi-value, values for same key in different order → MISS", "https://example.com/p?a=1&a=2", "https://example.com/p?a=2&a=1", "key-order", false},
};
class TestNoVarySearchEquivalence
: public testing::TestWithParam<EquivTestData> {};
TEST_P(TestNoVarySearchEquivalence, Check) { const EquivTestData& t = GetParam();
EXPECT_EQ(Equiv(t.urlA, t.urlB, t.header), t.expected) << t.description; // Equivalence must be symmetric
EXPECT_EQ(Equiv(t.urlB, t.urlA, t.header), t.expected)
<< t.description << " (symmetric)";
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.