| // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 
 | // Use of this source code is governed by a BSD-style license that can be | 
 | // found in the LICENSE file. | 
 |  | 
 | #include "net/log/test_net_log_util.h" | 
 |  | 
 | #include <cstddef> | 
 |  | 
 | #include "net/log/net_log.h" | 
 |  | 
 | namespace net { | 
 |  | 
 | namespace { | 
 |  | 
 | // Takes the list of entries and an offset, and returns an index into the array. | 
 | // If |offset| is positive, just returns |offset|.  If it's negative, it | 
 | // indicates a position relative to the end of the array. | 
 | size_t GetIndex(const TestNetLogEntry::List& entries, int offset) { | 
 |   if (offset >= 0) | 
 |     return static_cast<size_t>(offset); | 
 |  | 
 |   size_t abs_offset = static_cast<size_t>(-offset); | 
 |   // If offset indicates a position before the start of the array, just return | 
 |   // the end of the list. | 
 |   if (abs_offset > entries.size()) | 
 |     return entries.size(); | 
 |   return entries.size() - abs_offset; | 
 | } | 
 |  | 
 | }  // namespace | 
 |  | 
 | ::testing::AssertionResult LogContainsEvent( | 
 |     const TestNetLogEntry::List& entries, | 
 |     int offset, | 
 |     NetLogEventType expected_event, | 
 |     NetLogEventPhase expected_phase) { | 
 |   size_t index = GetIndex(entries, offset); | 
 |   if (index >= entries.size()) | 
 |     return ::testing::AssertionFailure() << index << " is out of bounds."; | 
 |   const TestNetLogEntry& entry = entries[index]; | 
 |   if (expected_event != entry.type) { | 
 |     return ::testing::AssertionFailure() | 
 |            << "Actual event: " << NetLog::EventTypeToString(entry.type) | 
 |            << ". Expected event: " << NetLog::EventTypeToString(expected_event) | 
 |            << "."; | 
 |   } | 
 |   if (expected_phase != entry.phase) { | 
 |     return ::testing::AssertionFailure() | 
 |            << "Actual phase: " << static_cast<int>(entry.phase) | 
 |            << ". Expected phase: " << static_cast<int>(expected_phase) << "."; | 
 |   } | 
 |   return ::testing::AssertionSuccess(); | 
 | } | 
 |  | 
 | ::testing::AssertionResult LogContainsBeginEvent( | 
 |     const TestNetLogEntry::List& entries, | 
 |     int offset, | 
 |     NetLogEventType expected_event) { | 
 |   return LogContainsEvent(entries, offset, expected_event, | 
 |                           NetLogEventPhase::BEGIN); | 
 | } | 
 |  | 
 | ::testing::AssertionResult LogContainsEndEvent( | 
 |     const TestNetLogEntry::List& entries, | 
 |     int offset, | 
 |     NetLogEventType expected_event) { | 
 |   return LogContainsEvent(entries, offset, expected_event, | 
 |                           NetLogEventPhase::END); | 
 | } | 
 |  | 
 | ::testing::AssertionResult LogContainsEntryWithType( | 
 |     const TestNetLogEntry::List& entries, | 
 |     int offset, | 
 |     NetLogEventType type) { | 
 |   size_t index = GetIndex(entries, offset); | 
 |   if (index >= entries.size()) | 
 |     return ::testing::AssertionFailure() << index << " is out of bounds."; | 
 |   const TestNetLogEntry& entry = entries[index]; | 
 |   if (entry.type != type) | 
 |     return ::testing::AssertionFailure() << "Type does not match."; | 
 |   return ::testing::AssertionSuccess(); | 
 | } | 
 |  | 
 | ::testing::AssertionResult LogContainsEntryWithTypeAfter( | 
 |     const TestNetLogEntry::List& entries, | 
 |     int start_offset, | 
 |     NetLogEventType type) { | 
 |   for (size_t i = GetIndex(entries, start_offset); i < entries.size(); ++i) { | 
 |     const TestNetLogEntry& entry = entries[i]; | 
 |     if (entry.type == type) | 
 |       return ::testing::AssertionSuccess(); | 
 |   } | 
 |   return ::testing::AssertionFailure(); | 
 | } | 
 |  | 
 | size_t ExpectLogContainsSomewhere(const TestNetLogEntry::List& entries, | 
 |                                   size_t min_offset, | 
 |                                   NetLogEventType expected_event, | 
 |                                   NetLogEventPhase expected_phase) { | 
 |   size_t min_index = GetIndex(entries, min_offset); | 
 |   size_t i = 0; | 
 |   for (; i < entries.size(); ++i) { | 
 |     const TestNetLogEntry& entry = entries[i]; | 
 |     if (entry.type == expected_event && entry.phase == expected_phase) | 
 |       break; | 
 |   } | 
 |   EXPECT_LT(i, entries.size()); | 
 |   EXPECT_GE(i, min_index); | 
 |   return i; | 
 | } | 
 |  | 
 | size_t ExpectLogContainsSomewhereAfter(const TestNetLogEntry::List& entries, | 
 |                                        size_t start_offset, | 
 |                                        NetLogEventType expected_event, | 
 |                                        NetLogEventPhase expected_phase) { | 
 |   size_t i = GetIndex(entries, start_offset); | 
 |   for (; i < entries.size(); ++i) { | 
 |     const TestNetLogEntry& entry = entries[i]; | 
 |     if (entry.type == expected_event && entry.phase == expected_phase) | 
 |       break; | 
 |   } | 
 |   EXPECT_LT(i, entries.size()); | 
 |   return i; | 
 | } | 
 |  | 
 | }  // namespace net |