// Copyright 2021 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/developer/forensics/feedback/feedback_data.h"

#include <gmock/gmock.h>
#include <gtest/gtest.h>

#include "src/developer/forensics/feedback/constants.h"
#include "src/developer/forensics/feedback/device_id_provider.h"
#include "src/developer/forensics/feedback_data/config.h"
#include "src/developer/forensics/testing/stubs/cobalt_logger.h"
#include "src/developer/forensics/testing/stubs/cobalt_logger_factory.h"
#include "src/developer/forensics/testing/unit_test_fixture.h"
#include "src/developer/forensics/utils/cobalt/logger.h"
#include "src/lib/files/file.h"
#include "src/lib/files/path.h"
#include "src/lib/files/scoped_temp_dir.h"
#include "src/lib/timekeeper/async_test_clock.h"
#include "src/lib/timekeeper/clock.h"

namespace forensics::feedback {
namespace {

class FeedbackDataTest : public UnitTestFixture {
 public:
  FeedbackDataTest()
      : clock_(dispatcher()),
        cobalt_(dispatcher(), services(), &clock_),
        device_id_provider_(dispatcher(), services()) {
    SetUpCobaltServer(std::make_unique<stubs::CobaltLoggerFactory>());
  }

  timekeeper::Clock* Clock() { return &clock_; }
  cobalt::Logger* Cobalt() { return &cobalt_; }
  RedactorBase* Redactor() { return &redactor_; }
  DeviceIdProvider* DeviceIdProvider() { return &device_id_provider_; }

  ~FeedbackDataTest() { FX_CHECK(files::DeletePath(kPreviousLogsFilePath, /*recursive=*/true)); }

 private:
  timekeeper::AsyncTestClock clock_;
  cobalt::Logger cobalt_;
  IdentityRedactor redactor_{inspect::BoolProperty()};
  RemoteDeviceIdProvider device_id_provider_;
};

TEST_F(FeedbackDataTest, DeletesPreviousBootLogs) {
  ASSERT_TRUE(files::WriteFile(kPreviousLogsFilePath, "previous boot logs"));

  const auto kDeletePreviousBootLogsTime = zx::min(10);
  AnnotationManager annotation_manager(dispatcher(), {});
  {
    FeedbackData feedback_data(dispatcher(), services(), Clock(), &InspectRoot(), Cobalt(),
                               Redactor(), &annotation_manager, DeviceIdProvider(),
                               FeedbackData::Options{
                                   .config = {},
                                   .is_first_instance = true,
                                   .limit_inspect_data = false,
                                   .spawn_system_log_recorder = false,
                                   .delete_previous_boot_logs_time = std::nullopt,
                                   .device_id_path = "n/a",
                               });

    RunLoopFor(kDeletePreviousBootLogsTime);
    EXPECT_TRUE(files::IsFile(kPreviousLogsFilePath));
  }

  {
    FeedbackData feedback_data(dispatcher(), services(), Clock(), &InspectRoot(), Cobalt(),
                               Redactor(), &annotation_manager, DeviceIdProvider(),
                               FeedbackData::Options{
                                   .config = {},
                                   .is_first_instance = true,
                                   .limit_inspect_data = false,
                                   .spawn_system_log_recorder = false,
                                   .delete_previous_boot_logs_time = kDeletePreviousBootLogsTime,
                                   .device_id_path = "n/a",
                               });

    RunLoopFor(kDeletePreviousBootLogsTime);
    EXPECT_FALSE(files::IsFile(kPreviousLogsFilePath));
  }
}

}  // namespace
}  // namespace forensics::feedback
