1 // Copyright 2012 The Chromium Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "net/log/test_net_log_util.h"
6
7 #include <cstddef>
8
9 #include "net/log/net_log_entry.h"
10
11 namespace net {
12
13 namespace {
14
15 // Takes the list of entries and an offset, and returns an index into the array.
16 // If |offset| is positive, just returns |offset|. If it's negative, it
17 // indicates a position relative to the end of the array.
GetIndex(const std::vector<NetLogEntry> & entries,int offset)18 size_t GetIndex(const std::vector<NetLogEntry>& entries, int offset) {
19 if (offset >= 0)
20 return static_cast<size_t>(offset);
21
22 size_t abs_offset = static_cast<size_t>(-offset);
23 // If offset indicates a position before the start of the array, just return
24 // the end of the list.
25 if (abs_offset > entries.size())
26 return entries.size();
27 return entries.size() - abs_offset;
28 }
29
30 } // namespace
31
LogContainsEvent(const std::vector<NetLogEntry> & entries,int offset,NetLogEventType expected_event,NetLogEventPhase expected_phase)32 ::testing::AssertionResult LogContainsEvent(
33 const std::vector<NetLogEntry>& entries,
34 int offset,
35 NetLogEventType expected_event,
36 NetLogEventPhase expected_phase) {
37 size_t index = GetIndex(entries, offset);
38 if (index >= entries.size())
39 return ::testing::AssertionFailure() << index << " is out of bounds.";
40 const NetLogEntry& entry = entries[index];
41 if (expected_event != entry.type) {
42 return ::testing::AssertionFailure()
43 << "Actual event: " << NetLogEventTypeToString(entry.type)
44 << ". Expected event: " << NetLogEventTypeToString(expected_event)
45 << ".";
46 }
47 if (expected_phase != entry.phase) {
48 return ::testing::AssertionFailure()
49 << "Actual phase: " << static_cast<int>(entry.phase)
50 << ". Expected phase: " << static_cast<int>(expected_phase) << ".";
51 }
52 return ::testing::AssertionSuccess();
53 }
54
LogContainsBeginEvent(const std::vector<NetLogEntry> & entries,int offset,NetLogEventType expected_event)55 ::testing::AssertionResult LogContainsBeginEvent(
56 const std::vector<NetLogEntry>& entries,
57 int offset,
58 NetLogEventType expected_event) {
59 return LogContainsEvent(entries, offset, expected_event,
60 NetLogEventPhase::BEGIN);
61 }
62
LogContainsEndEvent(const std::vector<NetLogEntry> & entries,int offset,NetLogEventType expected_event)63 ::testing::AssertionResult LogContainsEndEvent(
64 const std::vector<NetLogEntry>& entries,
65 int offset,
66 NetLogEventType expected_event) {
67 return LogContainsEvent(entries, offset, expected_event,
68 NetLogEventPhase::END);
69 }
70
LogContainsEntryWithType(const std::vector<NetLogEntry> & entries,int offset,NetLogEventType type)71 ::testing::AssertionResult LogContainsEntryWithType(
72 const std::vector<NetLogEntry>& entries,
73 int offset,
74 NetLogEventType type) {
75 size_t index = GetIndex(entries, offset);
76 if (index >= entries.size())
77 return ::testing::AssertionFailure() << index << " is out of bounds.";
78 const NetLogEntry& entry = entries[index];
79 if (entry.type != type)
80 return ::testing::AssertionFailure() << "Type does not match.";
81 return ::testing::AssertionSuccess();
82 }
83
LogContainsEntryWithTypeAfter(const std::vector<NetLogEntry> & entries,int start_offset,NetLogEventType type)84 ::testing::AssertionResult LogContainsEntryWithTypeAfter(
85 const std::vector<NetLogEntry>& entries,
86 int start_offset,
87 NetLogEventType type) {
88 for (size_t i = GetIndex(entries, start_offset); i < entries.size(); ++i) {
89 const NetLogEntry& entry = entries[i];
90 if (entry.type == type)
91 return ::testing::AssertionSuccess();
92 }
93 return ::testing::AssertionFailure();
94 }
95
ExpectLogContainsSomewhere(const std::vector<NetLogEntry> & entries,size_t min_offset,NetLogEventType expected_event,NetLogEventPhase expected_phase)96 size_t ExpectLogContainsSomewhere(const std::vector<NetLogEntry>& entries,
97 size_t min_offset,
98 NetLogEventType expected_event,
99 NetLogEventPhase expected_phase) {
100 size_t min_index = GetIndex(entries, min_offset);
101 size_t i = 0;
102 for (; i < entries.size(); ++i) {
103 const NetLogEntry& entry = entries[i];
104 if (entry.type == expected_event && entry.phase == expected_phase)
105 break;
106 }
107 EXPECT_LT(i, entries.size());
108 EXPECT_GE(i, min_index);
109 return i;
110 }
111
ExpectLogContainsSomewhereAfter(const std::vector<NetLogEntry> & entries,size_t start_offset,NetLogEventType expected_event,NetLogEventPhase expected_phase)112 size_t ExpectLogContainsSomewhereAfter(const std::vector<NetLogEntry>& entries,
113 size_t start_offset,
114 NetLogEventType expected_event,
115 NetLogEventPhase expected_phase) {
116 size_t i = GetIndex(entries, start_offset);
117 for (; i < entries.size(); ++i) {
118 const NetLogEntry& entry = entries[i];
119 if (entry.type == expected_event && entry.phase == expected_phase)
120 break;
121 }
122 EXPECT_LT(i, entries.size());
123 return i;
124 }
125
GetOptionalStringValueFromParams(const NetLogEntry & entry,std::string_view path)126 std::optional<std::string> GetOptionalStringValueFromParams(
127 const NetLogEntry& entry,
128 std::string_view path) {
129 if (entry.params.empty()) {
130 return std::nullopt;
131 }
132
133 const std::string* result = entry.params.FindStringByDottedPath(path);
134 if (!result)
135 return std::nullopt;
136
137 return *result;
138 }
139
GetOptionalBooleanValueFromParams(const NetLogEntry & entry,std::string_view path)140 std::optional<bool> GetOptionalBooleanValueFromParams(const NetLogEntry& entry,
141 std::string_view path) {
142 if (entry.params.empty()) {
143 return std::nullopt;
144 }
145 return entry.params.FindBoolByDottedPath(path);
146 }
147
GetOptionalIntegerValueFromParams(const NetLogEntry & entry,std::string_view path)148 std::optional<int> GetOptionalIntegerValueFromParams(const NetLogEntry& entry,
149 std::string_view path) {
150 if (entry.params.empty()) {
151 return std::nullopt;
152 }
153 return entry.params.FindIntByDottedPath(path);
154 }
155
GetOptionalNetErrorCodeFromParams(const NetLogEntry & entry)156 std::optional<int> GetOptionalNetErrorCodeFromParams(const NetLogEntry& entry) {
157 return GetOptionalIntegerValueFromParams(entry, "net_error");
158 }
159
GetStringValueFromParams(const NetLogEntry & entry,std::string_view path)160 std::string GetStringValueFromParams(const NetLogEntry& entry,
161 std::string_view path) {
162 auto result = GetOptionalStringValueFromParams(entry, path);
163 if (!result) {
164 ADD_FAILURE() << "No string parameter " << path;
165 return "";
166 }
167 return *result;
168 }
169
GetIntegerValueFromParams(const NetLogEntry & entry,std::string_view path)170 int GetIntegerValueFromParams(const NetLogEntry& entry, std::string_view path) {
171 auto result = GetOptionalIntegerValueFromParams(entry, path);
172 if (!result) {
173 ADD_FAILURE() << "No int parameter " << path;
174 return -1;
175 }
176 return *result;
177 }
178
GetBooleanValueFromParams(const NetLogEntry & entry,std::string_view path)179 bool GetBooleanValueFromParams(const NetLogEntry& entry,
180 std::string_view path) {
181 auto result = GetOptionalBooleanValueFromParams(entry, path);
182 if (!result) {
183 ADD_FAILURE() << "No bool parameter " << path;
184 return -1;
185 }
186 return *result;
187 }
188
GetNetErrorCodeFromParams(const NetLogEntry & entry)189 int GetNetErrorCodeFromParams(const NetLogEntry& entry) {
190 auto result = GetOptionalNetErrorCodeFromParams(entry);
191 if (!result) {
192 ADD_FAILURE() << "No net_error parameter";
193 return -1;
194 }
195 return *result;
196 }
197
198 } // namespace net
199