// Copyright 2020 The Fuchsia 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 "src/cobalt/bin/app/metric_event_logger_impl.h"

#include <memory>

#include <gtest/gtest.h>

#include "fuchsia/metrics/cpp/fidl.h"
#include "src/lib/cobalt/cpp/metric_event_builder.h"
#include "third_party/cobalt/src/logger/fake_logger.h"

namespace cobalt {

class MetricEventLoggerImplTest : public ::testing::Test {
 public:
  MetricEventLoggerImplTest()
      : fake_logger_(new logger::testing::FakeLogger),
        logger_impl_(std::unique_ptr<logger::LoggerInterface>(fake_logger_)),
        logger_(&logger_impl_) {}

 protected:
  logger::testing::FakeLogger* fake_logger_;
  MetricEventLoggerImpl logger_impl_;
  fuchsia::metrics::MetricEventLogger* logger_;
};

TEST_F(MetricEventLoggerImplTest, PauseDuringBatch) {
  std::vector<fuchsia::metrics::MetricEvent> events;
  events.push_back(MetricEventBuilder(1).as_occurrence(1));
  events.push_back(MetricEventBuilder(1).as_occurrence(2));
  events.push_back(MetricEventBuilder(1).as_occurrence(3));
  events.push_back(MetricEventBuilder(1).as_occurrence(4));
  events.push_back(MetricEventBuilder(1).as_occurrence(5));
  logger_->LogMetricEvents(
      std::move(events),
      [](fuchsia::metrics::MetricEventLogger_LogMetricEvents_Result response) {});
  std::map<logger::LoggerCallsMadeMigratedMetricDimensionLoggerMethod, uint32_t>
      internal_logger_calls = fake_logger_->internal_logger_calls();
  // Only the LogMetricEvents call should be recorded.
  EXPECT_EQ(internal_logger_calls.size(), 1);
  EXPECT_EQ(internal_logger_calls
                [logger::LoggerCallsMadeMigratedMetricDimensionLoggerMethod::LogMetricEvents],
            1);
}

}  // namespace cobalt
