File: resource_tracker_unittest.cc

package info (click to toggle)
chromium 139.0.7258.127-1
  • links: PTS, VCS
  • area: main
  • in suites:
  • size: 6,122,068 kB
  • sloc: cpp: 35,100,771; ansic: 7,163,530; javascript: 4,103,002; python: 1,436,920; asm: 946,517; xml: 746,709; pascal: 187,653; perl: 88,691; sh: 88,436; objc: 79,953; sql: 51,488; cs: 44,583; fortran: 24,137; makefile: 22,147; tcl: 15,277; php: 13,980; yacc: 8,984; ruby: 7,485; awk: 3,720; lisp: 3,096; lex: 1,327; ada: 727; jsp: 228; sed: 36
file content (151 lines) | stat: -rw-r--r-- 6,287 bytes parent folder | download | duplicates (11)
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
147
148
149
150
151
// Copyright 2019 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include <utility>

#include "components/page_load_metrics/browser/resource_tracker.h"
#include "components/page_load_metrics/common/page_load_metrics.mojom.h"
#include "content/public/browser/global_request_id.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "url/gurl.h"

class ResourceTrackerTest : public testing::Test {
 public:
  ResourceTrackerTest() = default;

  void StartResourceLoad(int resource_id, bool is_complete = false) {
    CreateResourceUpdate(resource_id, 0 /* delta_bytes */,
                         is_complete /* is_complete */);
  }

  void AdvanceResourceLoad(int resource_id, int bytes = 0) {
    CreateResourceUpdate(resource_id, bytes /* delta_bytes */,
                         false /* is_complete */);
  }

  void CompleteResourceLoad(int resource_id) {
    CreateResourceUpdate(resource_id, 0 /* delta_bytes */,
                         true /* is_complete */);
  }

  bool HasUnfinishedResource(int resource_id) {
    return resource_tracker_.unfinished_resources().find(
               content::GlobalRequestID(process_id_, resource_id)) !=
           resource_tracker_.unfinished_resources().end();
  }

  int GetUnfinishedResourceBytes(int resource_id) {
    return resource_tracker_.unfinished_resources()
        .find(content::GlobalRequestID(process_id_, resource_id))
        ->second->delta_bytes;
  }

  bool HasPreviousUpdateForResource(int resource_id) {
    return resource_tracker_.HasPreviousUpdateForResource(
        content::GlobalRequestID(process_id_, resource_id));
  }

  int GetPreviousResourceUpdateBytes(int resource_id) {
    return resource_tracker_
        .GetPreviousUpdateForResource(
            content::GlobalRequestID(process_id_, resource_id))
        ->delta_bytes;
  }

 private:
  void CreateResourceUpdate(int request_id,
                            int64_t delta_bytes,
                            bool is_complete) {
    std::vector<page_load_metrics::mojom::ResourceDataUpdatePtr> resources;
    auto resource_data_update =
        page_load_metrics::mojom::ResourceDataUpdate::New();
    resource_data_update->request_id = request_id;
    resource_data_update->delta_bytes = delta_bytes;
    resource_data_update->is_complete = is_complete;
    resources.push_back(std::move(resource_data_update));
    resource_tracker_.UpdateResourceDataUse(process_id_, resources);
  }

  const int process_id_ = 0;

  page_load_metrics::ResourceTracker resource_tracker_;
};

// Verifies that resources are added to and removed from the map
// of ongoing resource loads as expected.
TEST_F(ResourceTrackerTest, UnfinishedResourceMap) {
  StartResourceLoad(0 /* resource_id */);
  StartResourceLoad(1 /* resource_id */);
  StartResourceLoad(2 /* resource_id */);

  // Verify completed resources are not stored in the unfinished map.
  EXPECT_TRUE(HasUnfinishedResource(0 /* resource_id */));
  CompleteResourceLoad(0 /* resource_id */);
  EXPECT_FALSE(HasUnfinishedResource(0 /* resource_id */));

  // Verify that resources receiving multiple updates are not removed from the
  // map.
  AdvanceResourceLoad(1 /* resource_id */, 10 /* bytes */);
  AdvanceResourceLoad(1 /* resource_id */, 20 /* bytes */);
  EXPECT_TRUE(HasUnfinishedResource(1 /* resource_id */));
  CompleteResourceLoad(1 /* resource_id */);
  EXPECT_FALSE(HasUnfinishedResource(1 /* resource_id */));

  // Verify the unfinished map stores the most recent resource update.
  EXPECT_EQ(0, GetUnfinishedResourceBytes(2 /* resource_id */));
  AdvanceResourceLoad(2 /* resource_id */, 10 /* bytes */);
  EXPECT_EQ(10, GetUnfinishedResourceBytes(2 /* resource_id */));
  AdvanceResourceLoad(2 /* resource_id */, 20 /* bytes */);
  AdvanceResourceLoad(2 /* resource_id */, 30 /* bytes */);
  EXPECT_EQ(30, GetUnfinishedResourceBytes(2 /* resource_id */));
}

// Verifies that resources are added to and removed from the map
// of previous resource updates as expected.
TEST_F(ResourceTrackerTest, PreviousUpdateResourceMap) {
  StartResourceLoad(0 /* resource_id */);
  StartResourceLoad(1 /* resource_id */);
  EXPECT_FALSE(HasPreviousUpdateForResource(0 /* resource_id */));
  EXPECT_FALSE(HasPreviousUpdateForResource(1 /* resource_id */));

  AdvanceResourceLoad(1 /* resource_id */, 10 /* bytes */);
  EXPECT_TRUE(HasPreviousUpdateForResource(1 /* resource_id */));

  // Previous resource update should only be available for resources
  // who received resource updates in the previous call to
  // ResourceTracker::UpdateResourceDataUse(). resource_id "1" should not be
  // available in this case.
  AdvanceResourceLoad(0 /* resource_id */, 0 /* bytes */);
  EXPECT_FALSE(HasPreviousUpdateForResource(1 /* resource_id */));

  // The update should not be available because the load for resource_id "1" was
  // still ongoing. This should hold the data for the last update, 10 bytes.
  AdvanceResourceLoad(1 /* resource_id */, 20 /* bytes */);
  EXPECT_TRUE(HasPreviousUpdateForResource(1 /* resource_id */));
  EXPECT_EQ(10, GetPreviousResourceUpdateBytes(1 /* resource_id */));

  // Verify previous resource update is available for newly complete resources.
  CompleteResourceLoad(1 /* resource_id */);
  EXPECT_TRUE(HasPreviousUpdateForResource(1 /* resource_id */));
  EXPECT_EQ(20, GetPreviousResourceUpdateBytes(1 /* resource_id */));

  // Verify this completed resource update is removed once other resources are
  // loaded.
  CompleteResourceLoad(0 /* resource_id */);
  EXPECT_FALSE(HasPreviousUpdateForResource(1 /* resource_id */));
}

TEST_F(ResourceTrackerTest, SingleUpdateResourceNotStored) {
  // Verify that resources who only receive one update and complete are never
  // stored.
  StartResourceLoad(0 /* resource_id */, true /* is_complete */);
  EXPECT_FALSE(HasUnfinishedResource(0 /* resource_id */));
  EXPECT_FALSE(HasPreviousUpdateForResource(0 /* resource_id */));

  // Load new resource and verify we don't have a previous update for the
  // resource that completed.
  StartResourceLoad(1 /* resource_id */, true /* is_complete */);
  EXPECT_FALSE(HasUnfinishedResource(0 /* resource_id */));
  EXPECT_FALSE(HasPreviousUpdateForResource(0 /* resource_id */));
}