#include "base/memory/raw_ptr.h"
#include "chrome/browser/extensions/extension_service.h"
#include "chrome/browser/extensions/extension_service_test_base.h"
#include "chrome/browser/profiles/profile.h"
#include "components/safe_browsing/buildflags.h"
#include "extensions/browser/blocklist_extension_prefs.h"
#include "extensions/browser/blocklist_state.h"
#include "extensions/browser/extension_registrar.h"
#include "extensions/browser/test_blocklist.h"
#include "extensions/common/extension_id.h"
#include "extensions/test/extension_state_tester.h"
#include "testing/gtest/include/gtest/gtest.h"
#if BUILDFLAG(SAFE_BROWSING_DB_LOCAL)
namespace extensions {
namespace {
constexpr char kTestExtensionId[] = "behllobkkfkfnphdnhnkndlbkcpglgmj";
}
class BlocklistStatesInteractionUnitTest : public ExtensionServiceTestBase {
public:
BlocklistStatesInteractionUnitTest() {
ExtensionPrefs::SetRunAlertsInFirstRunForTest();
}
void SetUp() override {
ExtensionServiceTestBase::SetUp();
InitializeGoodInstalledExtensionService();
test_blocklist_.Attach(service()->blocklist_);
service()->Init();
extension_prefs_ = ExtensionPrefs::Get(profile());
}
protected:
void SetSafeBrowsingBlocklistStateForExtension(
const ExtensionId& extension_id,
BlocklistState state) {
service()->blocklist_->ResetBlocklistStateCacheForTest();
test_blocklist_.SetBlocklistState(extension_id, state, true);
task_environment()->RunUntilIdle();
}
void SetOmahaBlocklistStateForExtension(const ExtensionId& extension_id,
const std::string& omaha_attribute,
bool value) {
auto attributes = base::Value::Dict().Set(omaha_attribute, value);
service()->PerformActionBasedOnOmahaAttributes(extension_id, attributes);
}
ExtensionPrefs* extension_prefs() { return extension_prefs_; }
private:
TestBlocklist test_blocklist_;
raw_ptr<ExtensionPrefs> extension_prefs_;
};
TEST_F(BlocklistStatesInteractionUnitTest,
SafeBrowsingMalwareThenOmahaAttributeMalware) {
ExtensionStateTester state_tester(profile());
EXPECT_TRUE(state_tester.ExpectEnabled(kTestExtensionId));
SetSafeBrowsingBlocklistStateForExtension(kTestExtensionId,
BLOCKLISTED_MALWARE);
EXPECT_TRUE(state_tester.ExpectBlocklisted(kTestExtensionId));
SetOmahaBlocklistStateForExtension(kTestExtensionId, "_malware", true);
EXPECT_TRUE(state_tester.ExpectBlocklisted(kTestExtensionId));
SetSafeBrowsingBlocklistStateForExtension(kTestExtensionId, NOT_BLOCKLISTED);
EXPECT_TRUE(state_tester.ExpectBlocklisted(kTestExtensionId));
SetOmahaBlocklistStateForExtension(kTestExtensionId, "_malware", false);
EXPECT_TRUE(state_tester.ExpectEnabled(kTestExtensionId));
}
TEST_F(BlocklistStatesInteractionUnitTest,
SafeBrowsingMalwareAcknowledgedThenOmahaAttributeMalware) {
ExtensionStateTester state_tester(profile());
EXPECT_TRUE(state_tester.ExpectEnabled(kTestExtensionId));
SetSafeBrowsingBlocklistStateForExtension(kTestExtensionId,
BLOCKLISTED_MALWARE);
EXPECT_TRUE(state_tester.ExpectBlocklisted(kTestExtensionId));
EXPECT_FALSE(blocklist_prefs::HasAcknowledgedBlocklistState(
kTestExtensionId, BitMapBlocklistState::BLOCKLISTED_MALWARE,
extension_prefs()));
blocklist_prefs::AddAcknowledgedBlocklistState(
kTestExtensionId, BitMapBlocklistState::BLOCKLISTED_MALWARE,
extension_prefs());
EXPECT_TRUE(blocklist_prefs::HasAcknowledgedBlocklistState(
kTestExtensionId, BitMapBlocklistState::BLOCKLISTED_MALWARE,
extension_prefs()));
SetOmahaBlocklistStateForExtension(kTestExtensionId, "_malware", true);
EXPECT_TRUE(state_tester.ExpectBlocklisted(kTestExtensionId));
EXPECT_TRUE(blocklist_prefs::HasAcknowledgedBlocklistState(
kTestExtensionId, BitMapBlocklistState::BLOCKLISTED_MALWARE,
extension_prefs()));
SetSafeBrowsingBlocklistStateForExtension(kTestExtensionId, NOT_BLOCKLISTED);
EXPECT_TRUE(state_tester.ExpectBlocklisted(kTestExtensionId));
EXPECT_TRUE(blocklist_prefs::HasAcknowledgedBlocklistState(
kTestExtensionId, BitMapBlocklistState::BLOCKLISTED_MALWARE,
extension_prefs()));
SetOmahaBlocklistStateForExtension(kTestExtensionId, "_malware", false);
EXPECT_TRUE(state_tester.ExpectEnabled(kTestExtensionId));
EXPECT_FALSE(blocklist_prefs::HasAcknowledgedBlocklistState(
kTestExtensionId, BitMapBlocklistState::BLOCKLISTED_MALWARE,
extension_prefs()));
}
TEST_F(BlocklistStatesInteractionUnitTest,
OmahaAttributeMalwareThenSafeBrowsingMalware) {
ExtensionStateTester state_tester(profile());
EXPECT_TRUE(state_tester.ExpectEnabled(kTestExtensionId));
SetOmahaBlocklistStateForExtension(kTestExtensionId, "_malware", true);
EXPECT_TRUE(state_tester.ExpectBlocklisted(kTestExtensionId));
SetSafeBrowsingBlocklistStateForExtension(kTestExtensionId,
BLOCKLISTED_MALWARE);
EXPECT_TRUE(state_tester.ExpectBlocklisted(kTestExtensionId));
SetOmahaBlocklistStateForExtension(kTestExtensionId, "_malware", false);
EXPECT_TRUE(state_tester.ExpectBlocklisted(kTestExtensionId));
SetSafeBrowsingBlocklistStateForExtension(kTestExtensionId, NOT_BLOCKLISTED);
EXPECT_TRUE(state_tester.ExpectEnabled(kTestExtensionId));
}
TEST_F(BlocklistStatesInteractionUnitTest,
SafeBrowsingUwSThenOmahaAttributeMalware) {
ExtensionStateTester state_tester(profile());
EXPECT_TRUE(state_tester.ExpectEnabled(kTestExtensionId));
SetSafeBrowsingBlocklistStateForExtension(kTestExtensionId,
BLOCKLISTED_POTENTIALLY_UNWANTED);
EXPECT_TRUE(state_tester.ExpectDisabledWithSingleReason(
kTestExtensionId, disable_reason::DISABLE_GREYLIST));
SetOmahaBlocklistStateForExtension(kTestExtensionId, "_malware", true);
EXPECT_EQ(BitMapBlocklistState::BLOCKLISTED_MALWARE,
blocklist_prefs::GetExtensionBlocklistState(kTestExtensionId,
extension_prefs()));
EXPECT_TRUE(state_tester.ExpectBlocklisted(kTestExtensionId));
EXPECT_TRUE(extension_prefs()->HasDisableReason(
kTestExtensionId, disable_reason::DISABLE_GREYLIST));
SetOmahaBlocklistStateForExtension(kTestExtensionId, "_malware", false);
EXPECT_EQ(BitMapBlocklistState::BLOCKLISTED_POTENTIALLY_UNWANTED,
blocklist_prefs::GetExtensionBlocklistState(kTestExtensionId,
extension_prefs()));
EXPECT_TRUE(state_tester.ExpectDisabledWithSingleReason(
kTestExtensionId, disable_reason::DISABLE_GREYLIST));
SetSafeBrowsingBlocklistStateForExtension(kTestExtensionId, NOT_BLOCKLISTED);
EXPECT_TRUE(state_tester.ExpectEnabled(kTestExtensionId));
}
TEST_F(BlocklistStatesInteractionUnitTest,
SafeBrowsingMalwareThenOmahaAttributePolicyViolation) {
ExtensionStateTester state_tester(profile());
EXPECT_TRUE(state_tester.ExpectEnabled(kTestExtensionId));
SetSafeBrowsingBlocklistStateForExtension(kTestExtensionId,
BLOCKLISTED_MALWARE);
EXPECT_TRUE(state_tester.ExpectBlocklisted(kTestExtensionId));
EXPECT_EQ(BitMapBlocklistState::BLOCKLISTED_MALWARE,
blocklist_prefs::GetSafeBrowsingExtensionBlocklistState(
kTestExtensionId, extension_prefs()));
SetOmahaBlocklistStateForExtension(kTestExtensionId, "_policy_violation",
true);
EXPECT_TRUE(state_tester.ExpectBlocklisted(kTestExtensionId));
EXPECT_TRUE(blocklist_prefs::HasOmahaBlocklistState(
kTestExtensionId, BitMapBlocklistState::BLOCKLISTED_CWS_POLICY_VIOLATION,
extension_prefs()));
SetSafeBrowsingBlocklistStateForExtension(kTestExtensionId, NOT_BLOCKLISTED);
EXPECT_TRUE(state_tester.ExpectDisabledWithSingleReason(
kTestExtensionId, disable_reason::DISABLE_GREYLIST));
EXPECT_EQ(BitMapBlocklistState::NOT_BLOCKLISTED,
blocklist_prefs::GetSafeBrowsingExtensionBlocklistState(
kTestExtensionId, extension_prefs()));
EXPECT_TRUE(blocklist_prefs::HasOmahaBlocklistState(
kTestExtensionId, BitMapBlocklistState::BLOCKLISTED_CWS_POLICY_VIOLATION,
extension_prefs()));
SetOmahaBlocklistStateForExtension(kTestExtensionId, "_policy_violation",
false);
EXPECT_TRUE(state_tester.ExpectEnabled(kTestExtensionId));
}
TEST_F(BlocklistStatesInteractionUnitTest,
SafeBrowsingPolicyViolationThenOmahaAttributePolicyViolation) {
ExtensionStateTester state_tester(profile());
EXPECT_TRUE(state_tester.ExpectEnabled(kTestExtensionId));
SetSafeBrowsingBlocklistStateForExtension(kTestExtensionId,
BLOCKLISTED_CWS_POLICY_VIOLATION);
EXPECT_TRUE(state_tester.ExpectDisabledWithSingleReason(
kTestExtensionId, disable_reason::DISABLE_GREYLIST));
SetOmahaBlocklistStateForExtension(kTestExtensionId, "_policy_violation",
true);
EXPECT_TRUE(state_tester.ExpectDisabledWithSingleReason(
kTestExtensionId, disable_reason::DISABLE_GREYLIST));
SetSafeBrowsingBlocklistStateForExtension(kTestExtensionId, NOT_BLOCKLISTED);
EXPECT_TRUE(state_tester.ExpectDisabledWithSingleReason(
kTestExtensionId, disable_reason::DISABLE_GREYLIST));
SetOmahaBlocklistStateForExtension(kTestExtensionId, "_policy_violation",
false);
EXPECT_TRUE(state_tester.ExpectEnabled(kTestExtensionId));
}
TEST_F(BlocklistStatesInteractionUnitTest,
OmahaAttributePolicyViolationThenSafeBrowsingPolicyViolation) {
ExtensionStateTester state_tester(profile());
EXPECT_TRUE(state_tester.ExpectEnabled(kTestExtensionId));
SetOmahaBlocklistStateForExtension(kTestExtensionId, "_policy_violation",
true);
EXPECT_TRUE(state_tester.ExpectDisabledWithSingleReason(
kTestExtensionId, disable_reason::DISABLE_GREYLIST));
SetSafeBrowsingBlocklistStateForExtension(kTestExtensionId,
BLOCKLISTED_CWS_POLICY_VIOLATION);
EXPECT_TRUE(state_tester.ExpectDisabledWithSingleReason(
kTestExtensionId, disable_reason::DISABLE_GREYLIST));
SetOmahaBlocklistStateForExtension(kTestExtensionId, "_policy_violation",
false);
EXPECT_TRUE(state_tester.ExpectDisabledWithSingleReason(
kTestExtensionId, disable_reason::DISABLE_GREYLIST));
SetSafeBrowsingBlocklistStateForExtension(kTestExtensionId, NOT_BLOCKLISTED);
EXPECT_TRUE(state_tester.ExpectEnabled(kTestExtensionId));
}
TEST_F(
BlocklistStatesInteractionUnitTest,
SafeBrowsingPolicyViolationThenOmahaAttributePolicyViolationWithUserAction) {
ExtensionStateTester state_tester(profile());
EXPECT_TRUE(state_tester.ExpectEnabled(kTestExtensionId));
SetSafeBrowsingBlocklistStateForExtension(kTestExtensionId,
BLOCKLISTED_CWS_POLICY_VIOLATION);
EXPECT_TRUE(state_tester.ExpectDisabledWithSingleReason(
kTestExtensionId, disable_reason::DISABLE_GREYLIST));
EXPECT_TRUE(blocklist_prefs::HasAcknowledgedBlocklistState(
kTestExtensionId, BitMapBlocklistState::BLOCKLISTED_CWS_POLICY_VIOLATION,
extension_prefs()));
registrar()->EnableExtension(kTestExtensionId);
EXPECT_TRUE(state_tester.ExpectEnabled(kTestExtensionId));
SetOmahaBlocklistStateForExtension(kTestExtensionId, "_policy_violation",
true);
EXPECT_TRUE(state_tester.ExpectEnabled(kTestExtensionId));
SetSafeBrowsingBlocklistStateForExtension(kTestExtensionId, NOT_BLOCKLISTED);
EXPECT_TRUE(state_tester.ExpectEnabled(kTestExtensionId));
EXPECT_TRUE(blocklist_prefs::HasAcknowledgedBlocklistState(
kTestExtensionId, BitMapBlocklistState::BLOCKLISTED_CWS_POLICY_VIOLATION,
extension_prefs()));
SetOmahaBlocklistStateForExtension(kTestExtensionId, "_policy_violation",
false);
EXPECT_TRUE(state_tester.ExpectEnabled(kTestExtensionId));
EXPECT_FALSE(blocklist_prefs::HasAcknowledgedBlocklistState(
kTestExtensionId, BitMapBlocklistState::BLOCKLISTED_CWS_POLICY_VIOLATION,
extension_prefs()));
}
}
#endif