// Copyright 2018 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "extensions/browser/extension_event_histogram_value.h"

#include <algorithm>
#include <map>
#include <set>
#include <string>

#include "base/containers/contains.h"
#include "base/files/file_path.h"
#include "base/files/file_util.h"
#include "base/path_service.h"
#include "base/strings/stringprintf.h"
#include "base/test/metrics/histogram_enum_reader.h"
#include "testing/gtest/include/gtest/gtest.h"

namespace extensions {

// Tests that the ExtensionEvents enum in enums.xml exactly matches the
// C++ enum definition.
TEST(ExtensionEventHistogramValueTest, CheckEnums) {
  std::optional<base::HistogramEnumEntryMap> enums = base::ReadEnumFromEnumsXml(
      "ExtensionEvents", /*subdirectory=*/"extensions");
  ASSERT_TRUE(enums);
  // The number of enums in the histogram entry should be equal to the number of
  // enums in the C++ file.
  EXPECT_EQ(events::ENUM_BOUNDARY, enums->size());

  base::FilePath src_root;
  ASSERT_TRUE(base::PathService::Get(base::DIR_SRC_TEST_DATA_ROOT, &src_root));
  base::FilePath event_histogram_value =
      src_root.AppendASCII("extensions")
          .AppendASCII("browser")
          .AppendASCII("extension_event_histogram_value.h");
  ASSERT_TRUE(base::PathExists(event_histogram_value));

  std::string file_contents;
  ASSERT_TRUE(base::ReadFileToString(event_histogram_value, &file_contents));

  auto to_remove = std::ranges::remove_if(file_contents, ::isspace);
  file_contents.erase(to_remove.begin(), to_remove.end());

  for (const auto& entry : *enums) {
    // Check that the C++ file has a definition equal to the histogram file.
    // NOTE: For now, we do this in a simple, but reasonably effective, manner:
    // expecting to find the string "ENTRY=<value>" somewhere in the file
    // (ignoring whitespaces).
    std::string expected_string =
        base::StringPrintf("%s=%d,", entry.second.c_str(), entry.first);
    EXPECT_TRUE(base::Contains(file_contents, expected_string))
        << "Failed to find entry " << entry.second << " with value "
        << entry.first << ". Make sure events::HistogramValue and the "
        << "ExtensionEvents enum in enums.xml agree with each other.";
  }
}

}  // namespace extensions
