// Copyright 2022 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/annotations/device_id_provider.h"

#include <string>

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

#include "src/developer/forensics/feedback/annotations/constants.h"
#include "src/developer/forensics/testing/unit_test_fixture.h"
#include "src/lib/files/file.h"
#include "src/lib/files/path.h"
#include "src/lib/files/scoped_temp_dir.h"

namespace forensics::feedback {
namespace {

using ::testing::Not;
using ::testing::Pair;
using ::testing::UnorderedElementsAreArray;

constexpr char kDefaultDeviceId[] = "00000000-0000-4000-a000-000000000001";
constexpr char kInvalidDeviceId[] = "INVALID";

using RemoteDeviceIdProviderTest = UnitTestFixture;

TEST_F(RemoteDeviceIdProviderTest, GetKeys) {
  RemoteDeviceIdProvider device_id_provider(dispatcher(), services(), nullptr);
  EXPECT_THAT(device_id_provider.GetKeys(), UnorderedElementsAreArray({
                                                kDeviceFeedbackIdKey,
                                            }));
}

TEST_F(RemoteDeviceIdProviderTest, DeviceIdToAnnotations) {
  DeviceIdToAnnotations convert;

  EXPECT_THAT(convert(""), UnorderedElementsAreArray({
                               Pair(kDeviceFeedbackIdKey, ErrorOrString("")),
                           }));
  EXPECT_THAT(convert("id"), UnorderedElementsAreArray({
                                 Pair(kDeviceFeedbackIdKey, ErrorOrString("id")),
                             }));
}

TEST(LocalDeviceIdProviderTest, GetOnUpdate) {
  files::ScopedTempDir tmp_dir;
  auto ReadFile = [](const std::string& path) {
    std::string file_contents;
    FX_CHECK(files::ReadFileToString(path, &file_contents));
    return file_contents;
  };

  {
    std::string device_id_path;

    ASSERT_TRUE(tmp_dir.NewTempFileWithData(kDefaultDeviceId, &device_id_path));
    LocalDeviceIdProvider device_id_provider(device_id_path);

    Annotations annotations;
    device_id_provider.GetOnUpdate(
        [&annotations](Annotations result) { annotations = std::move(result); });

    EXPECT_THAT(annotations, UnorderedElementsAreArray({
                                 Pair(kDeviceFeedbackIdKey, ErrorOrString(kDefaultDeviceId)),
                             }));
    EXPECT_EQ(ReadFile(device_id_path), kDefaultDeviceId);
  }

  {
    std::string device_id_path;

    ASSERT_TRUE(tmp_dir.NewTempFileWithData(kInvalidDeviceId, &device_id_path));
    LocalDeviceIdProvider device_id_provider(device_id_path);

    Annotations annotations;

    device_id_provider.GetOnUpdate(
        [&annotations](Annotations result) { annotations = std::move(result); });

    ASSERT_TRUE(annotations.at(kDeviceFeedbackIdKey).HasValue());
    EXPECT_NE(annotations.at(kDeviceFeedbackIdKey).Value(), kInvalidDeviceId);
    EXPECT_EQ(ReadFile(device_id_path), annotations.at(kDeviceFeedbackIdKey).Value());
  }

  {
    std::string device_id_path = files::JoinPath(tmp_dir.path(), "device_id_file.txt");

    LocalDeviceIdProvider device_id_provider(device_id_path);

    Annotations annotations;
    device_id_provider.GetOnUpdate(
        [&annotations](Annotations result) { annotations = std::move(result); });

    EXPECT_NE(annotations.count(kDeviceFeedbackIdKey), 0u);
    EXPECT_EQ(ReadFile(device_id_path), annotations.at(kDeviceFeedbackIdKey).Value());
  }
}

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