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

#include "content/browser/devtools/devtools_manager.h"

#include "base/test/metrics/histogram_tester.h"
#include "base/trace_event/memory_dump_request_args.h"
#include "base/trace_event/process_memory_dump.h"
#include "content/public/browser/devtools_agent_host.h"
#include "content/public/test/test_content_browser_client.h"
#include "content/test/test_render_view_host.h"
#include "testing/gtest/include/gtest/gtest.h"

namespace content {

class DevToolsManagerTest : public RenderViewHostImplTestHarness {
 public:
  DevToolsManagerTest() = default;
  ~DevToolsManagerTest() override = default;

  void SetUp() override {
    RenderViewHostImplTestHarness::SetUp();
    DevToolsManager::ShutdownForTests();
  }

  void TearDown() override {
    DevToolsManager::ShutdownForTests();
    RenderViewHostImplTestHarness::TearDown();
  }
};

TEST_F(DevToolsManagerTest, OnMemoryDump) {
  base::HistogramTester histogram_tester;
  DevToolsManager* manager = DevToolsManager::GetInstance();

  // No sessions initially.
  base::trace_event::MemoryDumpArgs args = {
      base::trace_event::MemoryDumpLevelOfDetail::kDetailed};
  base::trace_event::ProcessMemoryDump pmd(args);
  manager->OnMemoryDump(args, &pmd);
  // Check allocator dump.
  auto* dump = pmd.GetAllocatorDump("devtools/sessions");
  ASSERT_NE(dump, nullptr);
  base::trace_event::MemoryAllocatorDump::Entry entry(
      base::trace_event::MemoryAllocatorDump::kNameObjectCount,
      base::trace_event::MemoryAllocatorDump::kUnitsObjects, 0u);
  EXPECT_THAT(dump->entries(),
              testing::Contains(testing::Eq(testing::ByRef(entry))));

  // Create a host and attach a client.
  scoped_refptr<DevToolsAgentHost> agent_host =
      DevToolsAgentHost::GetOrCreateFor(web_contents());

  class TestClient : public DevToolsAgentHostClient {
   public:
    void DispatchProtocolMessage(DevToolsAgentHost* agent_host,
                                 base::span<const uint8_t> message) override {}
    void AgentHostClosed(DevToolsAgentHost* agent_host) override {}
  };
  TestClient client;
  agent_host->AttachClient(&client);

  base::trace_event::ProcessMemoryDump pmd2(args);
  manager->OnMemoryDump(args, &pmd2);
  auto* dump2 = pmd2.GetAllocatorDump("devtools/sessions");
  ASSERT_NE(dump2, nullptr);
  base::trace_event::MemoryAllocatorDump::Entry entry2(
      base::trace_event::MemoryAllocatorDump::kNameObjectCount,
      base::trace_event::MemoryAllocatorDump::kUnitsObjects, 1u);
  EXPECT_THAT(dump2->entries(),
              testing::Contains(testing::Eq(testing::ByRef(entry2))));

  agent_host->DetachClient(&client);
  base::trace_event::ProcessMemoryDump pmd3(args);
  manager->OnMemoryDump(args, &pmd3);
  auto* dump3 = pmd3.GetAllocatorDump("devtools/sessions");
  ASSERT_NE(dump3, nullptr);
  EXPECT_THAT(dump3->entries(),
              testing::Contains(testing::Eq(testing::ByRef(entry))));
}

}  // namespace content
