// 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/logger_impl.h"

#include <memory>

#include <gtest/gtest.h>

#include "src/lib/cobalt/cpp/cobalt_event_builder.h"
#include "third_party/cobalt/src/logger/fake_logger.h"

namespace cobalt {

using FuchsiaStatus = fuchsia::cobalt::Status;

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

 protected:
  logger::testing::FakeLogger* fake_logger_;
  LoggerImpl logger_impl_;
  fuchsia::cobalt::Logger* logger_;
};

TEST_F(LoggerImplTest, PauseDuringBatch) {
  std::vector<fuchsia::cobalt::CobaltEvent> events;
  events.push_back(CobaltEventBuilder(1).as_event());
  events.push_back(CobaltEventBuilder(1).as_event());
  events.push_back(CobaltEventBuilder(1).as_event());
  events.push_back(CobaltEventBuilder(1).as_event());
  events.push_back(CobaltEventBuilder(1).as_event());
  logger_->LogCobaltEvents(std::move(events), [](FuchsiaStatus status) {});
  std::map<logger::PerProjectLoggerCallsMadeMigratedMetricDimensionLoggerMethod, uint32_t>
      internal_logger_calls = fake_logger_->internal_logger_calls();
  // Only the LogCobaltEvents call should be recorded.
  EXPECT_EQ(internal_logger_calls.size(), 1);
  EXPECT_EQ(internal_logger_calls
                [logger::LoggerCallsMadeMigratedMetricDimensionLoggerMethod::LogCobaltEvents],
            1);
}

// Tests that if StartTimer() and EndTimer() are invoked when the LoggerImpl
// was constructed without a TimerManager, then instead of crashing we
// return an error.
TEST_F(LoggerImplTest, NoTimerPresent) {
  FuchsiaStatus status = FuchsiaStatus::OK;
  logger_->StartTimer(0u, 0u, "", "", 0u, 0u, [&status](FuchsiaStatus s) { status = s; });
  EXPECT_EQ(status, FuchsiaStatus::INTERNAL_ERROR);
  status = FuchsiaStatus::OK;
  logger_->EndTimer("", 0u, 0u, [&status](FuchsiaStatus s) { status = s; });
  EXPECT_EQ(status, FuchsiaStatus::INTERNAL_ERROR);
}

}  // namespace cobalt
