xref: /aosp_15_r20/external/cronet/net/log/test_net_log_util.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
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