// Copyright 2019 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 <lib/fidl/cpp/binding_set.h>
#include <lib/gtest/test_loop_fixture.h>
#include <lib/sys/cpp/component_context.h>
#include <lib/sys/cpp/testing/component_context_provider.h>

#include <utility>

#include "src/lib/cobalt/cpp/cobalt_event_builder.h"
#include "third_party/cobalt/src/lib/util/posix_file_system.h"
#include "third_party/cobalt/src/local_aggregation/event_aggregator_mgr.h"
#include "third_party/cobalt/src/logger/logger_test_utils.h"

namespace cobalt {

class LoggerImplTest : public ::testing::Test {
 public:
  LoggerImplTest()
      : encoder_(encoder::ClientSecret::GenerateNewSecret(), nullptr),
        local_aggregate_proto_store_("/tmp/a", std::make_unique<util::PosixFileSystem>()),
        obs_history_proto_store_("/tmp/b", std::make_unique<util::PosixFileSystem>()),
        observation_writer_(nullptr, nullptr, nullptr),
        event_aggregator_manager_(&encoder_, &observation_writer_, &local_aggregate_proto_store_,
                                  &obs_history_proto_store_),
        validated_clock_(&system_clock_),
        undated_event_manager_(std::make_shared<logger::UndatedEventManager>(
            &encoder_, event_aggregator_manager_.GetEventAggregator(), &observation_writer_,
            nullptr)),
        logger_impl_(
            std::make_unique<logger::Logger>(
                std::make_unique<logger::ProjectContext>(1, "test",
                                                         std::make_unique<cobalt::ProjectConfig>()),
                &encoder_, event_aggregator_manager_.GetEventAggregator(), &observation_writer_,
                nullptr, &validated_clock_, undated_event_manager_, &fake_logger_),
            nullptr),
        logger_(&logger_impl_) {}

 private:
  logger::Encoder encoder_;
  util::ConsistentProtoStore local_aggregate_proto_store_;
  util::ConsistentProtoStore obs_history_proto_store_;
  logger::ObservationWriter observation_writer_;
  local_aggregation::EventAggregatorManager event_aggregator_manager_;
  util::IncrementingSystemClock system_clock_;
  util::FakeValidatedClock validated_clock_;
  std::shared_ptr<logger::UndatedEventManager> undated_event_manager_;

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

TEST_F(LoggerImplTest, PauseDuringBatch) {
  EXPECT_EQ(fake_logger_.call_count(), 0);
  logger_->LogCobaltEvents({}, [](Status status) {});
  int one_event_call_count = fake_logger_.call_count();
  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), [](Status status) {});
  EXPECT_EQ(fake_logger_.call_count(), 2 * one_event_call_count);
}

// 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) {
  Status status = Status::OK;
  logger_->StartTimer(0u, 0u, "", "", 0u, 0u, [&status](Status s) { status = s; });
  EXPECT_EQ(status, Status::INTERNAL_ERROR);
  status = Status::OK;
  logger_->EndTimer("", 0u, 0u, [&status](Status s) { status = s; });
  EXPECT_EQ(status, Status::INTERNAL_ERROR);
}

}  // namespace cobalt
