summaryrefslogtreecommitdiffstats
path: root/components/rappor/test_rappor_service.h
blob: ead80a8c0ccc903cf873d53c09ec23c4294d2173 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
// 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.

#ifndef COMPONENTS_RAPPOR_TEST_RAPPOR_SERVICE_H_
#define COMPONENTS_RAPPOR_TEST_RAPPOR_SERVICE_H_

#include <map>
#include <string>

#include "base/prefs/testing_pref_service.h"
#include "components/rappor/rappor_service.h"
#include "components/rappor/test_log_uploader.h"

namespace rappor {

// 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 TestRapporService : public RapporService {
 public:
  TestRapporService();

  ~TestRapporService() override;

  // Intercepts the sample being recorded and saves it in a test structure.
  void RecordSample(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/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_; }

  TestLogUploader* test_uploader() { return test_uploader_; }

  base::TimeDelta next_rotation() { return next_rotation_; }

 protected:
  // Cancels the next call to OnLogInterval.
  void CancelNextLogRotation() override;

  // Schedules the next call to OnLogInterval.
  void ScheduleNextLogRotation(base::TimeDelta interval) override;

 private:
  // Used to keep track of recorded RAPPOR samples.
  struct RapporSample {
    RapporType type;
    std::string value;
  };
  typedef std::map<std::string, RapporSample> SamplesMap;
  SamplesMap samples_;

  TestingPrefServiceSimple test_prefs_;

  // Holds a weak ref to the uploader_ object.
  TestLogUploader* test_uploader_;

  // The last scheduled log rotation.
  base::TimeDelta next_rotation_;

  // Sets this to true to mock incognito state.
  bool is_incognito_;

  DISALLOW_COPY_AND_ASSIGN(TestRapporService);
};

}  // namespace rappor

#endif  // COMPONENTS_RAPPOR_TEST_RAPPOR_SERVICE_H_