blob: f83d6b3fa3056b991fc297997092800fc20ffa6d [file] [log] [blame]
// Copyright 2015 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.
#ifndef COMPONENTS_PASSWORD_MANAGER_CORE_BROWSER_PASSWORD_STORE_ORIGIN_UNITTEST_H_
#define COMPONENTS_PASSWORD_MANAGER_CORE_BROWSER_PASSWORD_STORE_ORIGIN_UNITTEST_H_
#include <memory>
#include "base/callback.h"
#include "base/run_loop.h"
#include "base/time/time.h"
#include "components/password_manager/core/browser/password_manager_test_utils.h"
#include "components/password_manager/core/browser/password_store.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "url/gurl.h"
#include "url/origin.h"
using autofill::PasswordForm;
using password_manager::PasswordStore;
using testing::_;
using testing::ElementsAre;
bool matchesOrigin(const url::Origin& origin, const GURL& url) {
return origin.IsSameOriginWith(url::Origin::Create(url));
}
namespace password_manager {
PasswordFormData CreateTestPasswordFormDataByOrigin(const char* origin_url) {
PasswordFormData data = {PasswordForm::SCHEME_HTML,
origin_url,
origin_url,
"login_element",
L"submit_element",
L"username_element",
L"password_element",
L"username_value",
L"password_value",
true,
1};
return data;
}
// Collection of origin-related testcases common to all platform-specific
// stores.
// The template type T represents a test delegate that must implement the
// following methods:
// // Returns a pointer to a fully initialized store for polymorphic usage.
// PasswordStore* store();
//
// // Finishes all asnychronous processing on the store.
// void FinishAsyncProcessing();
template <typename T>
class PasswordStoreOriginTest : public testing::Test {
protected:
T delegate_;
};
TYPED_TEST_CASE_P(PasswordStoreOriginTest);
TYPED_TEST_P(PasswordStoreOriginTest,
RemoveLoginsByURLAndTimeImpl_AllFittingOriginAndTime) {
const char origin_url[] = "http://foo.example.com/";
std::unique_ptr<PasswordForm> form =
FillPasswordFormWithData(CreateTestPasswordFormDataByOrigin(origin_url));
this->delegate_.store()->AddLogin(*form);
this->delegate_.FinishAsyncProcessing();
MockPasswordStoreObserver observer;
this->delegate_.store()->AddObserver(&observer);
const url::Origin origin = url::Origin::Create((GURL(origin_url)));
base::Callback<bool(const GURL&)> filter = base::Bind(&matchesOrigin, origin);
base::RunLoop run_loop;
EXPECT_CALL(observer, OnLoginsChanged(ElementsAre(PasswordStoreChange(
PasswordStoreChange::REMOVE, *form))));
this->delegate_.store()->RemoveLoginsByURLAndTime(
filter, base::Time(), base::Time::Max(), run_loop.QuitClosure());
run_loop.Run();
this->delegate_.store()->RemoveObserver(&observer);
}
TYPED_TEST_P(PasswordStoreOriginTest,
RemoveLoginsByURLAndTimeImpl_SomeFittingOriginAndTime) {
const char fitting_url[] = "http://foo.example.com/";
std::unique_ptr<PasswordForm> form =
FillPasswordFormWithData(CreateTestPasswordFormDataByOrigin(fitting_url));
this->delegate_.store()->AddLogin(*form);
const char nonfitting_url[] = "http://bar.example.com/";
this->delegate_.store()->AddLogin(*FillPasswordFormWithData(
CreateTestPasswordFormDataByOrigin(nonfitting_url)));
this->delegate_.FinishAsyncProcessing();
MockPasswordStoreObserver observer;
this->delegate_.store()->AddObserver(&observer);
const url::Origin fitting_origin = url::Origin::Create((GURL(fitting_url)));
base::Callback<bool(const GURL&)> filter =
base::Bind(&matchesOrigin, fitting_origin);
base::RunLoop run_loop;
EXPECT_CALL(observer, OnLoginsChanged(ElementsAre(PasswordStoreChange(
PasswordStoreChange::REMOVE, *form))));
this->delegate_.store()->RemoveLoginsByURLAndTime(
filter, base::Time(), base::Time::Max(), run_loop.QuitClosure());
run_loop.Run();
this->delegate_.store()->RemoveObserver(&observer);
}
TYPED_TEST_P(PasswordStoreOriginTest,
RemoveLoginsByURLAndTimeImpl_NonMatchingOrigin) {
const char origin_url[] = "http://foo.example.com/";
std::unique_ptr<autofill::PasswordForm> form =
FillPasswordFormWithData(CreateTestPasswordFormDataByOrigin(origin_url));
this->delegate_.store()->AddLogin(*form);
this->delegate_.FinishAsyncProcessing();
MockPasswordStoreObserver observer;
this->delegate_.store()->AddObserver(&observer);
const url::Origin other_origin =
url::Origin::Create(GURL("http://bar.example.com/"));
base::Callback<bool(const GURL&)> filter =
base::Bind(&matchesOrigin, other_origin);
base::RunLoop run_loop;
EXPECT_CALL(observer, OnLoginsChanged(_)).Times(0);
this->delegate_.store()->RemoveLoginsByURLAndTime(
filter, base::Time(), base::Time::Max(), run_loop.QuitClosure());
run_loop.Run();
this->delegate_.store()->RemoveObserver(&observer);
}
TYPED_TEST_P(PasswordStoreOriginTest,
RemoveLoginsByURLAndTimeImpl_NotWithinTimeInterval) {
const char origin_url[] = "http://foo.example.com/";
std::unique_ptr<autofill::PasswordForm> form =
FillPasswordFormWithData(CreateTestPasswordFormDataByOrigin(origin_url));
this->delegate_.store()->AddLogin(*form);
this->delegate_.FinishAsyncProcessing();
MockPasswordStoreObserver observer;
this->delegate_.store()->AddObserver(&observer);
const url::Origin origin = url::Origin::Create((GURL(origin_url)));
base::Callback<bool(const GURL&)> filter = base::Bind(&matchesOrigin, origin);
base::Time time_after_creation_date =
form->date_created + base::TimeDelta::FromDays(1);
base::RunLoop run_loop;
EXPECT_CALL(observer, OnLoginsChanged(_)).Times(0);
this->delegate_.store()->RemoveLoginsByURLAndTime(
filter, time_after_creation_date, base::Time::Max(),
run_loop.QuitClosure());
run_loop.Run();
this->delegate_.store()->RemoveObserver(&observer);
}
REGISTER_TYPED_TEST_CASE_P(
PasswordStoreOriginTest,
RemoveLoginsByURLAndTimeImpl_AllFittingOriginAndTime,
RemoveLoginsByURLAndTimeImpl_SomeFittingOriginAndTime,
RemoveLoginsByURLAndTimeImpl_NonMatchingOrigin,
RemoveLoginsByURLAndTimeImpl_NotWithinTimeInterval);
} // namespace password_manager
#endif // COMPONENTS_PASSWORD_MANAGER_CORE_BROWSER_PASSWORD_STORE_ORIGIN_UNITTEST_H_