| Index: test/FilterEngine.cpp |
| diff --git a/test/FilterEngine.cpp b/test/FilterEngine.cpp |
| index 2221ba87d7d2885085d4eeee8e50cb8f7a08bdc8..a49e57c6edfabdeb44366da3fcc6a28f2dc23bec 100644 |
| --- a/test/FilterEngine.cpp |
| +++ b/test/FilterEngine.cpp |
| @@ -596,23 +596,21 @@ TEST_F(FilterEngineWithFreshFolder, LangAndAASubscriptionsAreChosenOnFirstRun) |
| auto filterEngine = AdblockPlus::FilterEngine::Create(jsEngine); |
| const auto subscriptions = filterEngine->GetListedSubscriptions(); |
| ASSERT_EQ(2u, subscriptions.size()); |
| - const auto aaUrl = filterEngine->GetPref("subscriptions_exceptionsurl")->AsString(); |
| SubscriptionPtr aaSubscription; |
| SubscriptionPtr langSubscription; |
| - if (subscriptions[0]->GetProperty("url")->AsString() == aaUrl) |
| + if (subscriptions[0]->IsAA()) |
| { |
| aaSubscription = subscriptions[0]; |
| langSubscription = subscriptions[1]; |
| - } |
| - else if (subscriptions[1]->GetProperty("url")->AsString() == aaUrl) |
| + } else if (subscriptions[1]->IsAA()) |
| { |
| aaSubscription = subscriptions[1]; |
| langSubscription = subscriptions[0]; |
| } |
| ASSERT_NE(nullptr, aaSubscription); |
| ASSERT_NE(nullptr, langSubscription); |
| - EXPECT_EQ(aaUrl, aaSubscription->GetProperty("url")->AsString()); |
| EXPECT_EQ(langSubscriptionUrl, langSubscription->GetProperty("url")->AsString()); |
| + EXPECT_TRUE(filterEngine->IsAAEnabled()); |
| } |
| TEST_F(FilterEngineWithFreshFolder, DisableSubscriptionsAutoSelectOnFirstRun) |
| @@ -623,4 +621,255 @@ TEST_F(FilterEngineWithFreshFolder, DisableSubscriptionsAutoSelectOnFirstRun) |
| auto filterEngine = AdblockPlus::FilterEngine::Create(jsEngine, createParams); |
| const auto subscriptions = filterEngine->GetListedSubscriptions(); |
| EXPECT_EQ(0u, subscriptions.size()); |
| + EXPECT_FALSE(filterEngine->IsAAEnabled()); |
| } |
| + |
| +namespace AA_ApiTest |
| +{ |
| + const std::string kOtherSubscriptionUrl = "https://non-existing-subscription.txt"; |
| + enum class AAStatus |
| + { |
| + absent, |
| + enabled, |
| + disabled_present |
| + }; |
| + |
| + ::std::ostream& operator<<(std::ostream& os, AAStatus aaStatus) |
| + { |
| + switch (aaStatus) |
| + { |
| + case AAStatus::absent: |
| + os << "absent"; |
| + break; |
| + case AAStatus::enabled: |
| + os << "enabled"; |
| + break; |
| + case AAStatus::disabled_present: |
| + os << "disabled_present"; |
| + break; |
| + default: |
| + ; |
| + } |
| + return os; |
| + } |
| + |
| + enum class Action |
| + { |
| + disable, enable, remove |
| + }; |
| + |
| + ::std::ostream& operator<<(std::ostream& os, Action action) |
| + { |
| + switch (action) |
| + { |
| + case Action::disable: |
| + os << "disable"; |
| + break; |
| + case Action::enable: |
| + os << "enable"; |
| + break; |
| + case Action::remove: |
| + os << "remove"; |
| + break; |
| + default: |
| + ; |
| + } |
| + return os; |
| + } |
| + |
| + struct Parameters |
| + { |
| + AAStatus initialAAStatus; |
| + Action action; |
| + AAStatus expectedAAStatus; |
| + Parameters(AAStatus aaStatus, Action action) |
| + { |
| + // if `expect` is not called then no effect is expected, initialize it now |
| + initialAAStatus = expectedAAStatus = aaStatus; |
| + this->action = action; |
| + } |
| + Parameters& expect(AAStatus aaStatus) |
| + { |
| + expectedAAStatus = aaStatus; |
| + return *this; |
| + } |
| + // it's merely to satisfy compiler (std::tuple requires default ctr) and |
| + // testing internals even calls it. |
| + Parameters() |
| + { |
| + } |
| + }; |
| + |
| + // human readable printing for failed tests |
| + ::std::ostream& operator<<(::std::ostream& os, const Parameters& params) |
| + { |
| + os << "initial AA: " << params.initialAAStatus |
| + << " action: " << params.action |
| + << " expected AA: " << params.expectedAAStatus; |
| + return os; |
| + } |
| + class Test : public FilterEngineTest |
| + , public ::testing::WithParamInterface<::testing::tuple<Parameters, /*number of other subscriptions*/uint8_t>> |
| + { |
| + public: |
| + static std::vector<Parameters> VaryPossibleCases() |
| + { |
| + // AA API test matrix |
| + // each column but other-subs is about AA subscription |
| + // enabled exists other-subs action => expected |
| + // => everywhere no effect on other subs |
| + // 1. |
| + // false false false disable => no effect |
| + // false false false enable => add and enable |
| + // |
| + // false false true disable => no effect |
| + // false false true enable => add and enable |
| + // 2. |
| + // false true false disable => no effect |
| + // false true false enable => enable |
| + // |
| + // false true true disable => no effect |
| + // false true true enable => enable |
| + // 3. |
| + // true true false disable => disable |
| + // ture true false enable => no effect |
| + // |
| + // true true true disable => disable |
| + // ture true true enable => no effect |
| + // 4. |
| + // false true false remove => remove |
| + // false true true remove => remove |
| + // ture true false remove => remove |
| + // ture true true remove => remove |
| + std::vector<Parameters> retValue; |
| + // 1. |
| + retValue.emplace_back(Parameters(AAStatus::absent, Action::disable)); |
| + retValue.emplace_back(Parameters(AAStatus::absent, Action::enable).expect(AAStatus::enabled)); |
| + // 2. |
| + retValue.emplace_back(Parameters(AAStatus::disabled_present, Action::disable)); |
| + retValue.emplace_back(Parameters(AAStatus::disabled_present, Action::enable).expect(AAStatus::enabled)); |
| + // 3. |
| + retValue.emplace_back(Parameters(AAStatus::enabled, Action::disable).expect(AAStatus::disabled_present)); |
| + retValue.emplace_back(Parameters(AAStatus::enabled, Action::enable)); |
| + // 4. |
| + retValue.emplace_back(Parameters(AAStatus::disabled_present, Action::remove).expect(AAStatus::absent)); |
| + retValue.emplace_back(Parameters(AAStatus::enabled, Action::remove).expect(AAStatus::absent)); |
| + // since AA should not affect other subscriptions, the number of other |
| + // subscriptions is not specified here, it goes as another item in test parameters tuple. |
| + return retValue; |
| + } |
| + protected: |
| + void init(AAStatus aaStatus, uint8_t otherSubscriptionsNumber) |
| + { |
| + // for the sake of simplicity test only with one suplimentary subscription |
| + ASSERT_TRUE(otherSubscriptionsNumber == 0u || otherSubscriptionsNumber == 1u); |
| + |
| + // this method also tests the result of intermediate steps. |
| + |
| + { |
| + // no subscription (because of preconfigured prefs.json and patterns.ini), |
| + // though it should be enabled by default in a non-test environment, it's tested in |
| + // corresponding tests. |
| + const auto subscriptions = filterEngine->GetListedSubscriptions(); |
| + EXPECT_EQ(0u, subscriptions.size()); // no any subscription including AA |
| + EXPECT_FALSE(filterEngine->IsAAEnabled()); |
| + } |
| + if (otherSubscriptionsNumber == 1u) |
| + { |
| + auto subscruption = filterEngine->GetSubscription(kOtherSubscriptionUrl); |
| + ASSERT_TRUE(subscruption); |
| + subscruption->AddToList(); |
| + const auto subscriptions = filterEngine->GetListedSubscriptions(); |
| + ASSERT_EQ(1u, subscriptions.size()); |
| + EXPECT_FALSE(subscriptions[0]->IsAA()); |
| + EXPECT_EQ(kOtherSubscriptionUrl, subscriptions[0]->GetProperty("url")->AsString()); |
| + } |
| + if (isAASatusPresent(aaStatus)) |
| + { |
| + filterEngine->SetAAEnabled(true); // add AA by enabling it |
| + if (aaStatus == AAStatus::disabled_present) |
| + { |
| + filterEngine->SetAAEnabled(false); |
| + } |
| + testSubscriptionState(aaStatus, otherSubscriptionsNumber); |
| + } |
| + } |
| + bool isAASatusPresent(AAStatus aaStatus) |
| + { |
| + return aaStatus != AAStatus::absent; |
| + } |
| + void testSubscriptionState(AAStatus aaStatus, int otherSubscriptionsNumber) |
| + { |
| + if (aaStatus == AAStatus::enabled) |
| + EXPECT_TRUE(filterEngine->IsAAEnabled()); |
| + else |
| + EXPECT_FALSE(filterEngine->IsAAEnabled()); |
| + |
| + SubscriptionPtr aaSubscription; |
| + SubscriptionPtr otherSubscription; |
| + const auto subscriptions = filterEngine->GetListedSubscriptions(); |
| + for (const auto& subscription : subscriptions) |
| + { |
| + (subscription->IsAA() ? aaSubscription : otherSubscription) = subscription; |
| + } |
| + if (otherSubscriptionsNumber == 1u) |
| + { |
| + if (isAASatusPresent(aaStatus)) |
| + { |
| + EXPECT_EQ(2u, subscriptions.size()); |
| + EXPECT_TRUE(aaSubscription); |
| + EXPECT_TRUE(otherSubscription); |
| + } |
| + else |
| + { |
| + EXPECT_EQ(1u, subscriptions.size()); |
| + EXPECT_FALSE(aaSubscription); |
| + EXPECT_TRUE(otherSubscription); |
| + } |
| + } |
| + else if (otherSubscriptionsNumber == 0u) |
| + { |
| + if (isAASatusPresent(aaStatus)) |
| + { |
| + EXPECT_EQ(1u, subscriptions.size()); |
| + EXPECT_TRUE(aaSubscription); |
| + EXPECT_FALSE(otherSubscription); |
| + } |
| + else |
| + { |
| + EXPECT_EQ(0u, subscriptions.size()); |
| + } |
| + } |
| + } |
| + }; |
| + |
| + INSTANTIATE_TEST_CASE_P(AA_ApiTests, Test, |
| + ::testing::Combine(::testing::ValuesIn(Test::VaryPossibleCases()), ::testing::Values<uint8_t>(0, 1))); |
| + |
| + TEST_P(Test, VaryPossibleCases) { |
| + const auto parameter = ::testing::get<0>(GetParam()); |
| + uint8_t otherSubscriptionsNumber = ::testing::get<1>(GetParam()); |
| + init(parameter.initialAAStatus, otherSubscriptionsNumber); |
| + |
| + if (parameter.action == Action::enable) |
| + filterEngine->SetAAEnabled(true); |
| + else if (parameter.action == Action::disable) |
| + filterEngine->SetAAEnabled(false); |
| + else if (parameter.action == Action::remove) |
| + { |
| + SubscriptionPtr aaSubscription; |
| + for (const auto& subscription : filterEngine->GetListedSubscriptions()) |
| + { |
| + if (subscription->IsAA()) |
| + { |
| + aaSubscription = subscription; |
| + break; |
| + } |
| + } |
| + ASSERT_TRUE(aaSubscription); |
| + aaSubscription->RemoveFromList(); |
| + } |
| + |
| + testSubscriptionState(parameter.expectedAAStatus, otherSubscriptionsNumber); |
| + } |
| +} |