199 lines
6.6 KiB
C++
199 lines
6.6 KiB
C++
// Copyright 2012 The Chromium Authors
|
|
// Use of this source code is governed by a BSD-style license that can be
|
|
// found in the LICENSE file.
|
|
|
|
#ifndef NET_COOKIES_COOKIE_STORE_TEST_HELPERS_H_
|
|
#define NET_COOKIES_COOKIE_STORE_TEST_HELPERS_H_
|
|
|
|
#include "net/cookies/cookie_monster.h"
|
|
|
|
#include <memory>
|
|
#include <string>
|
|
#include <vector>
|
|
|
|
#include "base/functional/callback_forward.h"
|
|
#include "base/synchronization/lock.h"
|
|
#include "net/cookies/cookie_change_dispatcher.h"
|
|
#include "net/log/net_log_with_source.h"
|
|
#include "testing/gtest/include/gtest/gtest.h"
|
|
#include "third_party/abseil-cpp/absl/types/optional.h"
|
|
|
|
class GURL;
|
|
|
|
namespace net {
|
|
|
|
class DelayedCookieMonsterChangeDispatcher : public CookieChangeDispatcher {
|
|
public:
|
|
DelayedCookieMonsterChangeDispatcher();
|
|
|
|
DelayedCookieMonsterChangeDispatcher(
|
|
const DelayedCookieMonsterChangeDispatcher&) = delete;
|
|
DelayedCookieMonsterChangeDispatcher& operator=(
|
|
const DelayedCookieMonsterChangeDispatcher&) = delete;
|
|
|
|
~DelayedCookieMonsterChangeDispatcher() override;
|
|
|
|
// net::CookieChangeDispatcher
|
|
[[nodiscard]] std::unique_ptr<CookieChangeSubscription> AddCallbackForCookie(
|
|
const GURL& url,
|
|
const std::string& name,
|
|
const absl::optional<CookiePartitionKey>& cookie_partition_key,
|
|
CookieChangeCallback callback) override;
|
|
[[nodiscard]] std::unique_ptr<CookieChangeSubscription> AddCallbackForUrl(
|
|
const GURL& url,
|
|
const absl::optional<CookiePartitionKey>& cookie_partition_key,
|
|
CookieChangeCallback callback) override;
|
|
[[nodiscard]] std::unique_ptr<CookieChangeSubscription>
|
|
AddCallbackForAllChanges(CookieChangeCallback callback) override;
|
|
};
|
|
|
|
class DelayedCookieMonster : public CookieStore {
|
|
public:
|
|
DelayedCookieMonster();
|
|
|
|
DelayedCookieMonster(const DelayedCookieMonster&) = delete;
|
|
DelayedCookieMonster& operator=(const DelayedCookieMonster&) = delete;
|
|
|
|
~DelayedCookieMonster() override;
|
|
|
|
// Call the asynchronous CookieMonster function, expect it to immediately
|
|
// invoke the internal callback.
|
|
// Post a delayed task to invoke the original callback with the results.
|
|
|
|
void SetCanonicalCookieAsync(
|
|
std::unique_ptr<CanonicalCookie> cookie,
|
|
const GURL& source_url,
|
|
const CookieOptions& options,
|
|
SetCookiesCallback callback,
|
|
const absl::optional<CookieAccessResult> cookie_access_result =
|
|
absl::nullopt) override;
|
|
|
|
void GetCookieListWithOptionsAsync(
|
|
const GURL& url,
|
|
const CookieOptions& options,
|
|
const CookiePartitionKeyCollection& cookie_partition_key_collection,
|
|
GetCookieListCallback callback) override;
|
|
|
|
void GetAllCookiesAsync(GetAllCookiesCallback callback) override;
|
|
|
|
void DeleteCanonicalCookieAsync(const CanonicalCookie& cookie,
|
|
DeleteCallback callback) override;
|
|
|
|
void DeleteAllCreatedInTimeRangeAsync(
|
|
const CookieDeletionInfo::TimeRange& creation_range,
|
|
DeleteCallback callback) override;
|
|
|
|
void DeleteAllMatchingInfoAsync(net::CookieDeletionInfo delete_info,
|
|
DeleteCallback callback) override;
|
|
|
|
void DeleteSessionCookiesAsync(DeleteCallback) override;
|
|
|
|
void DeleteMatchingCookiesAsync(DeletePredicate, DeleteCallback) override;
|
|
|
|
void FlushStore(base::OnceClosure callback) override;
|
|
|
|
CookieChangeDispatcher& GetChangeDispatcher() override;
|
|
|
|
void SetCookieableSchemes(const std::vector<std::string>& schemes,
|
|
SetCookieableSchemesCallback callback) override;
|
|
|
|
private:
|
|
// Be called immediately from CookieMonster.
|
|
|
|
void SetCookiesInternalCallback(CookieAccessResult result);
|
|
|
|
void GetCookiesWithOptionsInternalCallback(const std::string& cookie);
|
|
void GetCookieListWithOptionsInternalCallback(
|
|
const CookieAccessResultList& cookie,
|
|
const CookieAccessResultList& excluded_cookies);
|
|
|
|
// Invoke the original callbacks.
|
|
|
|
void InvokeSetCookiesCallback(CookieMonster::SetCookiesCallback callback);
|
|
|
|
void InvokeGetCookieListCallback(
|
|
CookieMonster::GetCookieListCallback callback);
|
|
|
|
friend class base::RefCountedThreadSafe<DelayedCookieMonster>;
|
|
|
|
std::unique_ptr<CookieMonster> cookie_monster_;
|
|
DelayedCookieMonsterChangeDispatcher change_dispatcher_;
|
|
|
|
bool did_run_ = false;
|
|
CookieAccessResult result_;
|
|
std::string cookie_;
|
|
std::string cookie_line_;
|
|
CookieAccessResultList cookie_access_result_list_;
|
|
CookieList cookie_list_;
|
|
};
|
|
|
|
class CookieURLHelper {
|
|
public:
|
|
explicit CookieURLHelper(const std::string& url_string);
|
|
|
|
const std::string& domain() const { return domain_and_registry_; }
|
|
std::string host() const { return url_.host(); }
|
|
const GURL& url() const { return url_; }
|
|
const GURL AppendPath(const std::string& path) const;
|
|
|
|
// Return a new string with the following substitutions:
|
|
// 1. "%R" -> Domain registry (i.e. "com")
|
|
// 2. "%D" -> Domain + registry (i.e. "google.com")
|
|
std::string Format(const std::string& format_string) const;
|
|
|
|
private:
|
|
const GURL url_;
|
|
const std::string registry_;
|
|
const std::string domain_and_registry_;
|
|
};
|
|
|
|
// Mock PersistentCookieStore that keeps track of the number of Flush() calls.
|
|
class FlushablePersistentStore : public CookieMonster::PersistentCookieStore {
|
|
public:
|
|
FlushablePersistentStore();
|
|
|
|
// CookieMonster::PersistentCookieStore implementation:
|
|
void Load(LoadedCallback loaded_callback,
|
|
const NetLogWithSource& net_log) override;
|
|
void LoadCookiesForKey(const std::string& key,
|
|
LoadedCallback loaded_callback) override;
|
|
void AddCookie(const CanonicalCookie&) override;
|
|
void UpdateCookieAccessTime(const CanonicalCookie&) override;
|
|
void DeleteCookie(const CanonicalCookie&) override;
|
|
void SetForceKeepSessionState() override;
|
|
void SetBeforeCommitCallback(base::RepeatingClosure callback) override;
|
|
void Flush(base::OnceClosure callback) override;
|
|
|
|
int flush_count();
|
|
|
|
private:
|
|
~FlushablePersistentStore() override;
|
|
|
|
int flush_count_ = 0;
|
|
base::Lock flush_count_lock_; // Protects |flush_count_|.
|
|
};
|
|
|
|
// Counts the number of times Callback() has been run.
|
|
class CallbackCounter : public base::RefCountedThreadSafe<CallbackCounter> {
|
|
public:
|
|
CallbackCounter();
|
|
void Callback();
|
|
int callback_count();
|
|
|
|
private:
|
|
friend class base::RefCountedThreadSafe<CallbackCounter>;
|
|
~CallbackCounter();
|
|
|
|
int callback_count_ = 0;
|
|
base::Lock callback_count_lock_; // Protects |callback_count_|.
|
|
};
|
|
|
|
// Returns a cookie expiration string in the form of "; expires=<date>", where
|
|
// date is an RFC 7231 date a year in the future, which can be appended to
|
|
// cookie lines.
|
|
std::string FutureCookieExpirationString();
|
|
|
|
} // namespace net
|
|
|
|
#endif // NET_COOKIES_COOKIE_STORE_TEST_HELPERS_H_
|