blob: 02840f6e89c93326ef3abeb55d70180cd191170e [file] [log] [blame]
// Copyright 2020 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 CONTENT_BROWSER_CONVERSIONS_CONVERSION_TEST_UTILS_H_
#define CONTENT_BROWSER_CONVERSIONS_CONVERSION_TEST_UTILS_H_
#include <list>
#include <string>
#include <vector>
#include "base/memory/scoped_refptr.h"
#include "base/sequenced_task_runner.h"
#include "base/time/time.h"
#include "content/browser/conversions/conversion_manager.h"
#include "content/browser/conversions/conversion_manager_impl.h"
#include "content/browser/conversions/conversion_report.h"
#include "content/browser/conversions/conversion_storage.h"
#include "content/browser/conversions/storable_conversion.h"
#include "content/browser/conversions/storable_impression.h"
#include "content/test/test_content_browser_client.h"
#include "net/base/schemeful_site.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "url/origin.h"
namespace content {
class ConversionDisallowingContentBrowserClient
: public TestContentBrowserClient {
public:
ConversionDisallowingContentBrowserClient() = default;
~ConversionDisallowingContentBrowserClient() override = default;
// ContentBrowserClient:
bool IsConversionMeasurementAllowed(
content::BrowserContext* browser_context) override;
bool IsConversionMeasurementOperationAllowed(
content::BrowserContext* browser_context,
ConversionMeasurementOperation operation,
const url::Origin* impression_origin,
const url::Origin* conversion_origin,
const url::Origin* reporting_origin) override;
};
// Configurable browser client capable of blocking conversion operations in a
// single embedded context.
class ConfigurableConversionTestBrowserClient
: public TestContentBrowserClient {
public:
ConfigurableConversionTestBrowserClient();
~ConfigurableConversionTestBrowserClient() override;
// ContentBrowserClient:
bool IsConversionMeasurementOperationAllowed(
content::BrowserContext* browser_context,
ConversionMeasurementOperation operation,
const url::Origin* impression_origin,
const url::Origin* conversion_origin,
const url::Origin* reporting_origin) override;
// Sets the origins where conversion measurement is blocked. This only blocks
// an operation if all origins match in
// `AllowConversionMeasurementOperation()`.
void BlockConversionMeasurementInContext(
absl::optional<url::Origin> impression_origin,
absl::optional<url::Origin> conversion_origin,
absl::optional<url::Origin> reporting_origin);
private:
absl::optional<url::Origin> blocked_impression_origin_;
absl::optional<url::Origin> blocked_conversion_origin_;
absl::optional<url::Origin> blocked_reporting_origin_;
};
class ConfigurableStorageDelegate : public ConversionStorage::Delegate {
public:
ConfigurableStorageDelegate();
~ConfigurableStorageDelegate() override;
// ConversionStorage::Delegate
const StorableImpression& GetImpressionToAttribute(
const std::vector<StorableImpression>& impressions) override;
void ProcessNewConversionReport(ConversionReport& report) override;
int GetMaxConversionsPerImpression(
StorableImpression::SourceType source_type) const override;
int GetMaxImpressionsPerOrigin() const override;
int GetMaxConversionsPerOrigin() const override;
RateLimitConfig GetRateLimits() const override;
void set_max_conversions_per_impression(int max) {
max_conversions_per_impression_ = max;
}
void set_max_impressions_per_origin(int max) {
max_impressions_per_origin_ = max;
}
void set_max_conversions_per_origin(int max) {
max_conversions_per_origin_ = max;
}
void set_rate_limits(RateLimitConfig c) { rate_limits_ = c; }
void set_report_time_ms(int report_time_ms) {
report_time_ms_ = report_time_ms;
}
private:
int max_conversions_per_impression_ = INT_MAX;
int max_impressions_per_origin_ = INT_MAX;
int max_conversions_per_origin_ = INT_MAX;
RateLimitConfig rate_limits_ = {
.time_window = base::TimeDelta::Max(),
.max_attributions_per_window = INT_MAX,
};
int report_time_ms_ = 0;
};
// Test manager provider which can be used to inject a fake ConversionManager.
class TestManagerProvider : public ConversionManager::Provider {
public:
explicit TestManagerProvider(ConversionManager* manager)
: manager_(manager) {}
~TestManagerProvider() override = default;
ConversionManager* GetManager(WebContents* web_contents) const override;
private:
ConversionManager* manager_ = nullptr;
};
// Test ConversionManager which can be injected into tests to monitor calls to a
// ConversionManager instance.
class TestConversionManager : public ConversionManager {
public:
TestConversionManager();
~TestConversionManager() override;
// ConversionManager:
void HandleImpression(const StorableImpression& impression) override;
void HandleConversion(const StorableConversion& conversion) override;
void GetActiveImpressionsForWebUI(
base::OnceCallback<void(std::vector<StorableImpression>)> callback)
override;
void GetReportsForWebUI(
base::OnceCallback<void(std::vector<ConversionReport>)> callback,
base::Time max_report_time) override;
void SendReportsForWebUI(base::OnceClosure done) override;
const ConversionPolicy& GetConversionPolicy() const override;
void ClearData(base::Time delete_begin,
base::Time delete_end,
base::RepeatingCallback<bool(const url::Origin&)> filter,
base::OnceClosure done) override;
void SetActiveImpressionsForWebUI(
std::vector<StorableImpression> impressions);
void SetReportsForWebUI(std::vector<ConversionReport> reports);
// Resets all counters on this.
void Reset();
size_t num_impressions() const { return num_impressions_; }
size_t num_conversions() const { return num_conversions_; }
const net::SchemefulSite& last_conversion_destination() {
return last_conversion_destination_;
}
const absl::optional<StorableImpression::SourceType>&
last_impression_source_type() {
return last_impression_source_type_;
}
const absl::optional<url::Origin>& last_impression_origin() {
return last_impression_origin_;
}
const absl::optional<int64_t> last_attribution_source_priority() {
return last_attribution_source_priority_;
}
private:
ConversionPolicy policy_;
net::SchemefulSite last_conversion_destination_;
absl::optional<StorableImpression::SourceType> last_impression_source_type_;
absl::optional<url::Origin> last_impression_origin_;
absl::optional<int64_t> last_attribution_source_priority_;
size_t num_impressions_ = 0;
size_t num_conversions_ = 0;
std::vector<StorableImpression> impressions_;
std::vector<ConversionReport> reports_;
};
// Helper class to construct a StorableImpression for tests using default data.
// StorableImpression members are not mutable after construction requiring a
// builder pattern.
class ImpressionBuilder {
public:
explicit ImpressionBuilder(base::Time time);
~ImpressionBuilder();
ImpressionBuilder& SetExpiry(base::TimeDelta delta);
ImpressionBuilder& SetData(const std::string& data);
ImpressionBuilder& SetImpressionOrigin(const url::Origin& origin);
ImpressionBuilder& SetConversionOrigin(const url::Origin& domain);
ImpressionBuilder& SetReportingOrigin(const url::Origin& origin);
ImpressionBuilder& SetSourceType(StorableImpression::SourceType source_type);
ImpressionBuilder& SetPriority(int64_t priority);
ImpressionBuilder& SetImpressionId(absl::optional<int64_t> impression_id);
StorableImpression Build() const;
private:
std::string impression_data_;
base::Time impression_time_;
base::TimeDelta expiry_;
url::Origin impression_origin_;
url::Origin conversion_origin_;
url::Origin reporting_origin_;
StorableImpression::SourceType source_type_;
int64_t priority_;
absl::optional<int64_t> impression_id_;
};
// Returns a StorableConversion with default data which matches the default
// impressions created by ImpressionBuilder.
StorableConversion DefaultConversion();
testing::AssertionResult ImpressionsEqual(const StorableImpression& expected,
const StorableImpression& actual);
testing::AssertionResult ReportsEqual(
const std::vector<ConversionReport>& expected,
const std::vector<ConversionReport>& actual);
std::vector<ConversionReport> GetConversionsToReportForTesting(
ConversionManagerImpl* manager,
base::Time max_report_time);
} // namespace content
#endif // CONTENT_BROWSER_CONVERSIONS_CONVERSION_TEST_UTILS_H_