blob: ee3060a26fbb30a8db96e699e886c19ab493472d [file] [log] [blame]
// Copyright 2014 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 <stddef.h>
#include <stdint.h>
#include <map>
#include <string>
#include "base/macros.h"
#include "components/prefs/testing_pref_service.h"
#include "components/rappor/rappor_service_impl.h"
#include "components/rappor/test_log_uploader.h"
namespace rappor {
// This class duplicates the functionality of Sample, with a cohort initialized
// always to 0. It keeps a shadow object around which copies every flag field
// and string field set on the Sample.
class TestSample : public Sample {
TestSample(RapporType type);
~TestSample() override;
// Sample:
void SetStringField(const std::string& field_name,
const std::string& value) override;
void SetFlagsField(const std::string& field_name,
uint64_t flags,
size_t num_flags) override;
void SetUInt64Field(const std::string& field_name,
uint64_t value,
NoiseLevel noise_level) override;
struct Shadow {
explicit Shadow(RapporType type);
Shadow(const Shadow& other);
RapporType type;
std::map<std::string, uint64_t> flag_fields;
std::map<std::string, std::string> string_fields;
std::map<std::string, std::pair<std::uint64_t, NoiseLevel>> uint64_fields;
Shadow GetShadow() { return shadow_; }
Shadow shadow_;
// This class provides a simple instance that can be instantiated by tests
// and examined to check that metrics were recorded. It assumes the most
// permissive settings so that any metric can be recorded.
class TestRapporServiceImpl : public RapporServiceImpl {
~TestRapporServiceImpl() override;
// RapporServiceImpl:
std::unique_ptr<Sample> CreateSample(RapporType type) override;
void RecordSample(const std::string& metric_name,
std::unique_ptr<Sample> sample) override;
void RecordSampleString(const std::string& metric_name,
RapporType type,
const std::string& sample) override;
// Gets the number of reports that would be uploaded by this service.
// This also clears the internal map of metrics as a biproduct, so if
// comparing numbers of reports, the comparison should be from the last time
// GetReportsCount() was called (not from the beginning of the test).
int GetReportsCount();
// Gets the reports proto that would be uploaded.
// This clears the internal map of metrics.
void GetReports(RapporReports* reports);
// Gets the recorded sample for |metric_name|. This returns the shadow object
// for the sample, which contains the string fields, flag fields, and type.
// Limitation: if the metric was logged more than once, this will return the
// latest sample that was logged.
TestSample::Shadow* GetRecordedSampleForMetric(
const std::string& metric_name);
// Gets the recorded sample/type for a |metric_name|, and returns whether the
// recorded metric was found. Limitation: if the metric was logged more than
// once, this will return the latest sample that was logged.
bool GetRecordedSampleForMetric(const std::string& metric_name,
std::string* sample,
RapporType* type);
void set_is_incognito(bool is_incognito) { is_incognito_ = is_incognito; }
TestingPrefServiceSimple* test_prefs() { return &test_prefs_; }
rappor::TestLogUploader* test_uploader() { return test_uploader_; }
base::TimeDelta next_rotation() { return next_rotation_; }
// Cancels the next call to OnLogInterval.
void CancelNextLogRotation() override;
// Schedules the next call to OnLogInterval.
void ScheduleNextLogRotation(base::TimeDelta interval) override;
// Used to keep track of recorded RAPPOR samples.
struct RapporSample {
RapporType type;
std::string value;
typedef std::map<std::string, RapporSample> SamplesMap;
SamplesMap samples_;
// Recording a TestSample inserts its shadow into this map, which has all of
// its fields copied.
typedef std::map<std::string, TestSample::Shadow> ShadowMap;
ShadowMap shadows_;
TestingPrefServiceSimple test_prefs_;
// Holds a weak ref to the uploader_ object.
rappor::TestLogUploader* test_uploader_;
// The last scheduled log rotation.
base::TimeDelta next_rotation_;
// Sets this to true to mock incognito state.
bool is_incognito_;
} // namespace rappor