blob: bae9cea432952377dd984f2f047368745d3bbda7 [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 "testing/gmock/include/gmock/gmock.h"
#include "url/origin.h"
namespace content {
class ConversionDisallowingContentBrowserClient
: public TestContentBrowserClient {
public:
ConversionDisallowingContentBrowserClient() = default;
~ConversionDisallowingContentBrowserClient() override = default;
// ContentBrowserClient:
bool AllowConversionMeasurement(BrowserContext* context) override;
};
class ConfigurableStorageDelegate : public ConversionStorage::Delegate {
public:
using AttributionCredits = std::list<int>;
ConfigurableStorageDelegate();
~ConfigurableStorageDelegate() override;
// ConversionStorage::Delegate
void ProcessNewConversionReports(
std::vector<ConversionReport>* reports) override;
int GetMaxConversionsPerImpression() const override;
int GetMaxImpressionsPerOrigin() const override;
int GetMaxConversionsPerOrigin() 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_report_time_ms(int report_time_ms) {
report_time_ms_ = report_time_ms;
}
void AddCredits(AttributionCredits credits) {
// Add all credits to our list in order.
attribution_credits_.splice(attribution_credits_.end(), credits);
}
private:
int max_conversions_per_impression_ = INT_MAX;
int max_impressions_per_origin_ = INT_MAX;
int max_conversions_per_origin_ = INT_MAX;
int report_time_ms_ = 0;
// List of attribution credits the test delegate should associate with
// reports.
AttributionCredits attribution_credits_;
};
// 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_; }
private:
ConversionPolicy policy_;
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& origin);
ImpressionBuilder& SetReportingOrigin(const url::Origin& origin);
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_;
};
// 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_