3232namespace opencensus {
3333namespace stats {
3434
35- // A mock exporter that checks whether it is called with the right set of view
36- // descriptors.
35+ // A mock exporter that assigns exported data to the provided pointer.
3736class MockExporter : public StatsExporter ::Handler {
3837 public:
39- static void Register (absl::Span<const ViewDescriptor> expected_descriptors) {
38+ static void Register (
39+ std::vector<std::pair<ViewDescriptor, ViewData>>* output) {
4040 opencensus::stats::StatsExporter::RegisterPushHandler (
41- absl::make_unique<MockExporter>(expected_descriptors ));
41+ absl::make_unique<MockExporter>(output ));
4242 }
4343
44- MockExporter (absl::Span<const ViewDescriptor> expected_descriptors)
45- : expected_descriptors_(expected_descriptors.begin(),
46- expected_descriptors.end()) {}
44+ MockExporter (std::vector<std::pair<ViewDescriptor, ViewData>>* output)
45+ : output_(output) {}
4746
48- ~MockExporter () {
49- EXPECT_THAT (actual_descriptors_,
50- ::testing::UnorderedElementsAreArray (expected_descriptors_));
51- }
52-
53- void ExportViewData (const ViewDescriptor& descriptor,
54- const ViewData& data) override {
55- actual_descriptors_.push_back (descriptor);
47+ void ExportViewData (
48+ const std::vector<std::pair<ViewDescriptor, ViewData>>& data) override {
49+ // Looping because ViewData is (intentionally) copy-constructable but not
50+ // copy_assignable.
51+ for (const auto & datum : data) {
52+ output_->emplace_back (datum.first , datum.second );
53+ }
5654 }
5755
5856 private:
59- const std::vector<ViewDescriptor> expected_descriptors_;
60- std::vector<ViewDescriptor> actual_descriptors_;
57+ std::vector<std::pair<ViewDescriptor, ViewData>>* output_;
6158};
6259
6360constexpr char kMeasureId [] = " test_measure_id" ;
@@ -99,17 +96,22 @@ class StatsExporterTest : public ::testing::Test {
9996};
10097
10198TEST_F (StatsExporterTest, AddView) {
102- MockExporter::Register ({descriptor1_, descriptor2_});
99+ std::vector<std::pair<ViewDescriptor, ViewData>> exported_data;
100+ MockExporter::Register (&exported_data);
103101 descriptor1_.RegisterForExport ();
104102 descriptor2_.RegisterForExport ();
105103 EXPECT_THAT (StatsExporter::GetViewData (),
106104 ::testing::UnorderedElementsAre (::testing::Key(descriptor1_),
107105 ::testing::Key(descriptor2_)));
108106 Export ();
107+ EXPECT_THAT (exported_data,
108+ ::testing::UnorderedElementsAre (::testing::Key(descriptor1_),
109+ ::testing::Key(descriptor2_)));
109110}
110111
111112TEST_F (StatsExporterTest, UpdateView) {
112- MockExporter::Register ({descriptor1_edited_, descriptor2_});
113+ std::vector<std::pair<ViewDescriptor, ViewData>> exported_data;
114+ MockExporter::Register (&exported_data);
113115 descriptor1_.RegisterForExport ();
114116 descriptor2_.RegisterForExport ();
115117 descriptor1_edited_.RegisterForExport ();
@@ -118,39 +120,56 @@ TEST_F(StatsExporterTest, UpdateView) {
118120 ::testing::UnorderedElementsAre (::testing::Key(descriptor1_edited_),
119121 ::testing::Key(descriptor2_)));
120122 Export ();
123+ EXPECT_THAT (exported_data, ::testing::UnorderedElementsAre (
124+ ::testing::Key (descriptor1_edited_),
125+ ::testing::Key(descriptor2_)));
121126}
122127
123128TEST_F (StatsExporterTest, RemoveView) {
124- MockExporter::Register ({descriptor2_});
129+ std::vector<std::pair<ViewDescriptor, ViewData>> exported_data;
130+ MockExporter::Register (&exported_data);
125131 descriptor1_.RegisterForExport ();
126132 descriptor2_.RegisterForExport ();
127133 StatsExporter::RemoveView (descriptor1_.name ());
128134 EXPECT_THAT (StatsExporter::GetViewData (),
129135 ::testing::UnorderedElementsAre (::testing::Key(descriptor2_)));
130136 Export ();
137+ EXPECT_THAT (exported_data,
138+ ::testing::UnorderedElementsAre (::testing::Key(descriptor2_)));
131139}
132140
133141TEST_F (StatsExporterTest, MultipleExporters) {
134- MockExporter::Register ({descriptor1_});
135- MockExporter::Register ({descriptor1_});
142+ std::vector<std::pair<ViewDescriptor, ViewData>> exported_data_1;
143+ MockExporter::Register (&exported_data_1);
144+ std::vector<std::pair<ViewDescriptor, ViewData>> exported_data_2;
145+ MockExporter::Register (&exported_data_2);
136146 descriptor1_.RegisterForExport ();
137147 Export ();
148+ EXPECT_THAT (exported_data_1,
149+ ::testing::UnorderedElementsAre (::testing::Key(descriptor1_)));
150+ EXPECT_THAT (exported_data_2,
151+ ::testing::UnorderedElementsAre (::testing::Key(descriptor1_)));
138152}
139153
140154TEST_F (StatsExporterTest, IntervalViewRejected) {
141- MockExporter::Register ({});
155+ std::vector<std::pair<ViewDescriptor, ViewData>> exported_data;
156+ MockExporter::Register (&exported_data);
142157 ViewDescriptor interval_descriptor = ViewDescriptor ().set_name (" interval" );
143158 SetAggregationWindow (AggregationWindow::Interval (absl::Hours (1 )),
144159 &interval_descriptor);
145160 interval_descriptor.RegisterForExport ();
146161 EXPECT_TRUE (StatsExporter::GetViewData ().empty ());
147162 Export ();
163+ EXPECT_TRUE (exported_data.empty ());
148164}
149165
150166TEST_F (StatsExporterTest, TimedExport) {
151- MockExporter::Register ({descriptor1_});
167+ std::vector<std::pair<ViewDescriptor, ViewData>> exported_data;
168+ MockExporter::Register (&exported_data);
152169 descriptor1_.RegisterForExport ();
153170 absl::SleepFor (absl::Seconds (11 ));
171+ EXPECT_THAT (exported_data,
172+ ::testing::UnorderedElementsAre (::testing::Key(descriptor1_)));
154173}
155174
156175} // namespace stats
0 commit comments