File: resource_contexts_unittest.cc

package info (click to toggle)
chromium 138.0.7204.183-1~deb12u1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm-proposed-updates
  • size: 6,080,960 kB
  • sloc: cpp: 34,937,079; ansic: 7,176,967; javascript: 4,110,704; python: 1,419,954; asm: 946,768; xml: 739,971; pascal: 187,324; sh: 89,623; perl: 88,663; objc: 79,944; sql: 50,304; cs: 41,786; fortran: 24,137; makefile: 21,811; php: 13,980; tcl: 13,166; yacc: 8,925; ruby: 7,485; awk: 3,720; lisp: 3,096; lex: 1,327; ada: 727; jsp: 228; sed: 36
file content (146 lines) | stat: -rw-r--r-- 5,929 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
// Copyright 2023 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "components/performance_manager/public/resource_attribution/resource_contexts.h"

#include "components/performance_manager/test_support/graph_test_harness.h"
#include "components/performance_manager/test_support/mock_graphs.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"

namespace resource_attribution {

namespace {

template <typename PublicNode, typename NodeImpl>
const PublicNode* ToPublic(
    const performance_manager::TestNodeWrapper<NodeImpl>& wrapper) {
  return wrapper.get();
}

using ResourceAttrResourceContextsTest = performance_manager::GraphTestHarness;
using ResourceAttrResourceContextsDeathTest = ResourceAttrResourceContextsTest;

// Tests the context tokens returned from PM nodes.
TEST_F(ResourceAttrResourceContextsTest, NodeContexts) {
  performance_manager::MockUtilityAndMultipleRenderProcessesGraph mock_graph(
      graph());

  // Test each type of ProcessNode (browser, renderer, non-renderer child) since
  // they use different constructors.

  // Ensure each node gets a fresh token.
  const std::set<FrameContext> frame_contexts{
      mock_graph.frame->GetResourceContext(),
      mock_graph.other_frame->GetResourceContext(),
      mock_graph.child_frame->GetResourceContext(),
  };
  EXPECT_EQ(frame_contexts.size(), 3u);
  EXPECT_NE(mock_graph.page->GetResourceContext(),
            mock_graph.other_page->GetResourceContext());
  const std::set<ProcessContext> process_contexts{
      mock_graph.browser_process->GetResourceContext(),
      mock_graph.process->GetResourceContext(),
      mock_graph.other_process->GetResourceContext(),
      mock_graph.utility_process->GetResourceContext(),
  };
  EXPECT_EQ(process_contexts.size(), 4u);
  EXPECT_NE(mock_graph.worker->GetResourceContext(),
            mock_graph.other_worker->GetResourceContext());
}

TEST_F(ResourceAttrResourceContextsTest, ResourceContextComparators) {
  performance_manager::MockMultiplePagesAndWorkersWithMultipleProcessesGraph
      mock_graph(graph());

  // Ensure tokens of the same type can be compared when wrapped in
  // ResourceContext.
  const ResourceContext process_context =
      mock_graph.process->GetResourceContext();
  const ResourceContext other_process_context =
      mock_graph.other_process->GetResourceContext();

  // ResourceContext == node context
  EXPECT_EQ(process_context, mock_graph.process->GetResourceContext());
  // node context == ResourceContext
  EXPECT_EQ(mock_graph.other_process->GetResourceContext(),
            other_process_context);
  // ResourceContext == ResourceContext
  const ResourceContext process_context_copy = process_context;
  EXPECT_EQ(process_context, process_context_copy);

  // ResourceContext != node context
  EXPECT_NE(process_context, mock_graph.other_process->GetResourceContext());
  // node context != ResourceContext
  EXPECT_NE(mock_graph.process->GetResourceContext(), other_process_context);
  // ResourceContext != ResourceContext
  EXPECT_NE(process_context, other_process_context);

  // Ensure tokens of different types can be compared when wrapped in
  // ResourceContext, although they'll never be equal.
  const ResourceContext page_context = mock_graph.page->GetResourceContext();

  // ResourceContext != node context
  EXPECT_NE(process_context, mock_graph.page->GetResourceContext());
  // node context != Resource Context
  EXPECT_NE(mock_graph.process->GetResourceContext(), page_context);
  // ResourceContext != ResourceContext
  EXPECT_NE(process_context, page_context);
}

TEST_F(ResourceAttrResourceContextsTest, ResourceContextConverters) {
  performance_manager::MockMultiplePagesAndWorkersWithMultipleProcessesGraph
      mock_graph(graph());

  const ResourceContext process_context =
      mock_graph.process->GetResourceContext();
  const ResourceContext page_context = mock_graph.page->GetResourceContext();

  EXPECT_TRUE(ContextIs<ProcessContext>(process_context));
  EXPECT_FALSE(ContextIs<ProcessContext>(page_context));

  const ProcessContext unwrapped_process_context =
      AsContext<ProcessContext>(process_context);
  EXPECT_EQ(unwrapped_process_context,
            mock_graph.process->GetResourceContext());

  EXPECT_THAT(AsOptionalContext<ProcessContext>(process_context),
              ::testing::Optional(mock_graph.process->GetResourceContext()));
  EXPECT_EQ(AsOptionalContext<ProcessContext>(page_context), std::nullopt);
}

TEST_F(ResourceAttrResourceContextsTest, ResourceContextTypeId) {
  using ResourceContextTypeId = internal::ResourceContextTypeId;

  performance_manager::MockMultiplePagesAndWorkersWithMultipleProcessesGraph
      mock_graph(graph());

  const ResourceContext process_context =
      mock_graph.process->GetResourceContext();
  const ResourceContext page_context = mock_graph.page->GetResourceContext();

  EXPECT_EQ(ResourceContextTypeId(process_context),
            ResourceContextTypeId::ForType<ProcessContext>());
  EXPECT_EQ(ResourceContextTypeId(page_context),
            ResourceContextTypeId::ForType<PageContext>());

  // Different types get different id's.
  EXPECT_NE(ResourceContextTypeId(process_context),
            ResourceContextTypeId(page_context));

  // Different instances of the same type get the same id.
  EXPECT_EQ(ResourceContextTypeId(page_context),
            ResourceContextTypeId(mock_graph.other_page->GetResourceContext()));
}

TEST_F(ResourceAttrResourceContextsDeathTest, FailedResourceContextConverters) {
  performance_manager::MockMultiplePagesAndWorkersWithMultipleProcessesGraph
      mock_graph(graph());
  const ResourceContext page_context = mock_graph.page->GetResourceContext();
  EXPECT_DEATH_IF_SUPPORTED(AsContext<ProcessContext>(page_context), "");
}

}  // namespace

}  // namespace resource_attribution