blob: 1ef5d18cafa487ec5f961c6a6a1c0af381dd577b [file] [log] [blame]
// Copyright 2017 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "components/safe_browsing/db/whitelist_checker_client.h"
#include <memory>
#include "base/bind.h"
#include "base/run_loop.h"
#include "base/test/mock_callback.h"
#include "base/test/scoped_task_environment.h"
#include "base/threading/thread_task_runner_handle.h"
#include "components/safe_browsing/db/test_database_manager.h"
#include "content/public/browser/browser_thread.h"
#include "content/public/test/test_browser_thread_bundle.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace safe_browsing {
using base::TimeDelta;
using testing::_;
using testing::Return;
using testing::SaveArg;
using BoolCallback = base::Callback<void(bool /* is_whitelisted */)>;
using MockBoolCallback = testing::StrictMock<base::MockCallback<BoolCallback>>;
namespace {
class MockSafeBrowsingDatabaseManager : public TestSafeBrowsingDatabaseManager {
public:
MockSafeBrowsingDatabaseManager() {}
MOCK_METHOD1(CancelCheck, void(SafeBrowsingDatabaseManager::Client*));
MOCK_METHOD2(CheckCsdWhitelistUrl,
AsyncMatch(const GURL&, SafeBrowsingDatabaseManager::Client*));
protected:
~MockSafeBrowsingDatabaseManager() override {}
private:
DISALLOW_COPY_AND_ASSIGN(MockSafeBrowsingDatabaseManager);
};
} // namespace
class WhitelistCheckerClientTest : public testing::Test {
public:
WhitelistCheckerClientTest()
: thread_bundle_(
base::test::ScopedTaskEnvironment::MainThreadType::MOCK_TIME),
target_url_("http://foo.bar") {}
void SetUp() override {
database_manager_ = new MockSafeBrowsingDatabaseManager;
}
void TearDown() override {
database_manager_ = nullptr;
base::RunLoop().RunUntilIdle();
// Verify no callback is remaining.
// TODO(nparker): We should somehow EXPECT that no entry is remaining,
// rather than just invoking it.
thread_bundle_.FastForwardUntilNoTasksRemain();
}
protected:
content::TestBrowserThreadBundle thread_bundle_;
GURL target_url_;
scoped_refptr<MockSafeBrowsingDatabaseManager> database_manager_;
};
TEST_F(WhitelistCheckerClientTest, TestMatch) {
EXPECT_CALL(*database_manager_, CheckCsdWhitelistUrl(target_url_, _))
.WillOnce(Return(AsyncMatch::MATCH));
MockBoolCallback callback;
EXPECT_CALL(callback, Run(true /* is_whitelisted */));
WhitelistCheckerClient::StartCheckCsdWhitelist(database_manager_, target_url_,
callback.Get());
}
TEST_F(WhitelistCheckerClientTest, TestNoMatch) {
EXPECT_CALL(*database_manager_, CheckCsdWhitelistUrl(target_url_, _))
.WillOnce(Return(AsyncMatch::NO_MATCH));
MockBoolCallback callback;
EXPECT_CALL(callback, Run(false /* is_whitelisted */));
WhitelistCheckerClient::StartCheckCsdWhitelist(database_manager_, target_url_,
callback.Get());
}
TEST_F(WhitelistCheckerClientTest, TestAsyncNoMatch) {
SafeBrowsingDatabaseManager::Client* client;
EXPECT_CALL(*database_manager_, CheckCsdWhitelistUrl(target_url_, _))
.WillOnce(DoAll(SaveArg<1>(&client), Return(AsyncMatch::ASYNC)));
MockBoolCallback callback;
WhitelistCheckerClient::StartCheckCsdWhitelist(database_manager_, target_url_,
callback.Get());
// Callback should not be called yet.
EXPECT_CALL(callback, Run(false /* is_whitelisted */));
// The self-owned client deletes itself here.
client->OnCheckWhitelistUrlResult(false);
}
TEST_F(WhitelistCheckerClientTest, TestAsyncTimeout) {
SafeBrowsingDatabaseManager::Client* client;
EXPECT_CALL(*database_manager_, CheckCsdWhitelistUrl(target_url_, _))
.WillOnce(DoAll(SaveArg<1>(&client), Return(AsyncMatch::ASYNC)));
EXPECT_CALL(*database_manager_, CancelCheck(_)).Times(1);
MockBoolCallback callback;
WhitelistCheckerClient::StartCheckCsdWhitelist(database_manager_, target_url_,
callback.Get());
thread_bundle_.FastForwardBy(base::TimeDelta::FromSeconds(1));
// No callback yet.
EXPECT_CALL(callback, Run(true /* is_whitelisted */));
thread_bundle_.FastForwardBy(base::TimeDelta::FromSeconds(5));
}
} // namespace safe_browsing