blob: b09dbf3a2aaf7cc88050340fb88f9ef4def77c04 [file] [log] [blame]
mmenke0034c542015-05-05 22:34:591// Copyright (c) 2012 The Chromium Authors. All rights reserved.
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
mikecironef22f9812016-10-04 03:40:199#include "net/log/net_log.h"
10
mmenke0034c542015-05-05 22:34:5911namespace net {
12
13namespace {
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.
Eric Roman79cc7552019-07-19 02:17:5418size_t GetIndex(const std::vector<NetLogEntry>& entries, int offset) {
mmenke0034c542015-05-05 22:34:5919 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
32::testing::AssertionResult LogContainsEvent(
Eric Roman79cc7552019-07-19 02:17:5433 const std::vector<NetLogEntry>& entries,
mmenke0034c542015-05-05 22:34:5934 int offset,
mikecirone8b85c432016-09-08 19:11:0035 NetLogEventType expected_event,
36 NetLogEventPhase expected_phase) {
mmenke0034c542015-05-05 22:34:5937 size_t index = GetIndex(entries, offset);
38 if (index >= entries.size())
39 return ::testing::AssertionFailure() << index << " is out of bounds.";
Eric Roman79cc7552019-07-19 02:17:5440 const NetLogEntry& entry = entries[index];
mmenke0034c542015-05-05 22:34:5941 if (expected_event != entry.type) {
42 return ::testing::AssertionFailure()
43 << "Actual event: " << NetLog::EventTypeToString(entry.type)
44 << ". Expected event: " << NetLog::EventTypeToString(expected_event)
45 << ".";
46 }
47 if (expected_phase != entry.phase) {
48 return ::testing::AssertionFailure()
mikecirone8b85c432016-09-08 19:11:0049 << "Actual phase: " << static_cast<int>(entry.phase)
50 << ". Expected phase: " << static_cast<int>(expected_phase) << ".";
mmenke0034c542015-05-05 22:34:5951 }
52 return ::testing::AssertionSuccess();
53}
54
55::testing::AssertionResult LogContainsBeginEvent(
Eric Roman79cc7552019-07-19 02:17:5456 const std::vector<NetLogEntry>& entries,
mmenke0034c542015-05-05 22:34:5957 int offset,
mikecirone8b85c432016-09-08 19:11:0058 NetLogEventType expected_event) {
59 return LogContainsEvent(entries, offset, expected_event,
60 NetLogEventPhase::BEGIN);
mmenke0034c542015-05-05 22:34:5961}
62
63::testing::AssertionResult LogContainsEndEvent(
Eric Roman79cc7552019-07-19 02:17:5464 const std::vector<NetLogEntry>& entries,
mmenke0034c542015-05-05 22:34:5965 int offset,
mikecirone8b85c432016-09-08 19:11:0066 NetLogEventType expected_event) {
67 return LogContainsEvent(entries, offset, expected_event,
68 NetLogEventPhase::END);
mmenke0034c542015-05-05 22:34:5969}
70
71::testing::AssertionResult LogContainsEntryWithType(
Eric Roman79cc7552019-07-19 02:17:5472 const std::vector<NetLogEntry>& entries,
mmenke0034c542015-05-05 22:34:5973 int offset,
mikecirone8b85c432016-09-08 19:11:0074 NetLogEventType type) {
mmenke0034c542015-05-05 22:34:5975 size_t index = GetIndex(entries, offset);
76 if (index >= entries.size())
77 return ::testing::AssertionFailure() << index << " is out of bounds.";
Eric Roman79cc7552019-07-19 02:17:5478 const NetLogEntry& entry = entries[index];
mmenke0034c542015-05-05 22:34:5979 if (entry.type != type)
80 return ::testing::AssertionFailure() << "Type does not match.";
81 return ::testing::AssertionSuccess();
82}
83
84::testing::AssertionResult LogContainsEntryWithTypeAfter(
Eric Roman79cc7552019-07-19 02:17:5485 const std::vector<NetLogEntry>& entries,
mmenke0034c542015-05-05 22:34:5986 int start_offset,
mikecirone8b85c432016-09-08 19:11:0087 NetLogEventType type) {
mmenke0034c542015-05-05 22:34:5988 for (size_t i = GetIndex(entries, start_offset); i < entries.size(); ++i) {
Eric Roman79cc7552019-07-19 02:17:5489 const NetLogEntry& entry = entries[i];
mmenke0034c542015-05-05 22:34:5990 if (entry.type == type)
91 return ::testing::AssertionSuccess();
92 }
93 return ::testing::AssertionFailure();
94}
95
Eric Roman79cc7552019-07-19 02:17:5496size_t ExpectLogContainsSomewhere(const std::vector<NetLogEntry>& entries,
mmenke0034c542015-05-05 22:34:5997 size_t min_offset,
mikecirone8b85c432016-09-08 19:11:0098 NetLogEventType expected_event,
99 NetLogEventPhase expected_phase) {
mmenke0034c542015-05-05 22:34:59100 size_t min_index = GetIndex(entries, min_offset);
101 size_t i = 0;
102 for (; i < entries.size(); ++i) {
Eric Roman79cc7552019-07-19 02:17:54103 const NetLogEntry& entry = entries[i];
mmenke0034c542015-05-05 22:34:59104 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
Eric Roman79cc7552019-07-19 02:17:54112size_t ExpectLogContainsSomewhereAfter(const std::vector<NetLogEntry>& entries,
mmenke0034c542015-05-05 22:34:59113 size_t start_offset,
mikecirone8b85c432016-09-08 19:11:00114 NetLogEventType expected_event,
115 NetLogEventPhase expected_phase) {
mmenke0034c542015-05-05 22:34:59116 size_t i = GetIndex(entries, start_offset);
117 for (; i < entries.size(); ++i) {
Eric Roman79cc7552019-07-19 02:17:54118 const NetLogEntry& entry = entries[i];
mmenke0034c542015-05-05 22:34:59119 if (entry.type == expected_event && entry.phase == expected_phase)
120 break;
121 }
122 EXPECT_LT(i, entries.size());
123 return i;
124}
125
Eric Roman79cc7552019-07-19 02:17:54126base::Optional<std::string> GetOptionalStringValueFromParams(
127 const NetLogEntry& entry,
128 base::StringPiece name) {
129 if (!entry.params.is_dict())
130 return base::nullopt;
131
132 const std::string* result = entry.params.FindStringKey(name);
133 if (!result)
134 return base::nullopt;
135
136 return *result;
137}
138
139base::Optional<bool> GetOptionalBooleanValueFromParams(const NetLogEntry& entry,
140 base::StringPiece name) {
141 if (!entry.params.is_dict())
142 return base::nullopt;
143 return entry.params.FindBoolKey(name);
144}
145
146base::Optional<int> GetOptionalIntegerValueFromParams(const NetLogEntry& entry,
147 base::StringPiece name) {
148 if (!entry.params.is_dict())
149 return base::nullopt;
150 return entry.params.FindIntKey(name);
151}
152
153base::Optional<int> GetOptionalNetErrorCodeFromParams(
154 const NetLogEntry& entry) {
155 return GetOptionalIntegerValueFromParams(entry, "net_error");
156}
157
158std::string GetStringValueFromParams(const NetLogEntry& entry,
159 base::StringPiece name) {
160 auto result = GetOptionalStringValueFromParams(entry, name);
161 if (!result) {
162 ADD_FAILURE() << "No string parameter " << name;
163 return "";
164 }
165 return *result;
166}
167
168int GetIntegerValueFromParams(const NetLogEntry& entry,
169 base::StringPiece name) {
170 auto result = GetOptionalIntegerValueFromParams(entry, name);
171 if (!result) {
172 ADD_FAILURE() << "No int parameter " << name;
173 return -1;
174 }
175 return *result;
176}
177
178bool GetBooleanValueFromParams(const NetLogEntry& entry,
179 base::StringPiece name) {
180 auto result = GetOptionalBooleanValueFromParams(entry, name);
181 if (!result) {
182 ADD_FAILURE() << "No bool parameter " << name;
183 return -1;
184 }
185 return *result;
186}
187
188int GetNetErrorCodeFromParams(const NetLogEntry& entry) {
189 auto result = GetOptionalNetErrorCodeFromParams(entry);
190 if (!result) {
191 ADD_FAILURE() << "No net_error parameter";
192 return -1;
193 }
194 return *result;
195}
196
197bool GetListValueFromParams(const NetLogEntry& entry,
198 base::StringPiece name,
199 const base::ListValue** value) {
200 if (!entry.params.is_dict())
201 return false;
202
203 const base::Value* list = entry.params.FindListKey(name);
204 if (!list)
205 return false;
206
207 return list->GetAsList(value);
208}
209
mmenke0034c542015-05-05 22:34:59210} // namespace net