// 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 THIRD_PARTY_BLINK_PUBLIC_COMMON_PRIVACY_BUDGET_SCOPED_IDENTIFIABILITY_TEST_SAMPLE_COLLECTOR_H_
#define THIRD_PARTY_BLINK_PUBLIC_COMMON_PRIVACY_BUDGET_SCOPED_IDENTIFIABILITY_TEST_SAMPLE_COLLECTOR_H_

#include <memory>
#include <vector>

#include "base/component_export.h"
#include "third_party/blink/public/common/privacy_budget/identifiability_sample_collector.h"
#include "third_party/blink/public/common/privacy_budget/scoped_switch_sample_collector.h"

namespace blink {
namespace test {

// An `IdentifiabilitySampleCollector` implementation for testing. Allows
// inspecting recorded metrics.
//
// Instantiating this class automatically sets the per-process
// `IdentifiabilitySampleCollector` to point to the new instance.
//
// Note: Unlike the real collector nothing in this class is thread safe.
class COMPONENT_EXPORT(PRIVACY_BUDGET_TEST_SUPPORT)
    ScopedIdentifiabilityTestSampleCollector
    : public IdentifiabilitySampleCollector {
 public:
  ScopedIdentifiabilityTestSampleCollector();
  ~ScopedIdentifiabilityTestSampleCollector() override;

  // IdentifiabilitySampleCollector
  void Record(ukm::UkmRecorder* recorder,
              ukm::SourceId source,
              std::vector<IdentifiableSample> metrics) override;
  void Flush(ukm::UkmRecorder* recorder) override;
  void FlushSource(ukm::UkmRecorder* recorder, ukm::SourceId source) override;

  // Each call to `Record()` results in one of these being added to `entries()`
  // in order of occurrence that faithfully records the arguments to `Record()`.
  struct Entry {
    Entry(ukm::SourceId source_in, std::vector<IdentifiableSample> metrics_in)
        : source(source_in), metrics(std::move(metrics_in)) {}

    const ukm::SourceId source;
    const std::vector<IdentifiableSample> metrics;
  };

  // Returns a reference to the list of `Entry` objects representing the
  // `Record()` calls received so far.
  const std::vector<Entry>& entries() const { return entries_; }

  // Reset all recorded entries. `entries()` returns an empty list after this.
  void ClearEntries();

 private:
  std::vector<Entry> entries_;
  ScopedSwitchSampleCollector scoped_default_;
};

}  // namespace test
}  // namespace blink

#endif  // THIRD_PARTY_BLINK_PUBLIC_COMMON_PRIVACY_BUDGET_SCOPED_IDENTIFIABILITY_TEST_SAMPLE_COLLECTOR_H_
