1 // 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 #ifndef NET_BASE_NET_LOG_UNITTEST_H_ 6 #define NET_BASE_NET_LOG_UNITTEST_H_ 7 8 #include <cstddef> 9 10 #include "net/base/capturing_net_log.h" 11 #include "testing/gtest/include/gtest/gtest.h" 12 13 namespace net { 14 15 // Create a timestamp with internal value of |t| milliseconds from the epoch. 16 inline base::TimeTicks MakeTime(int t) { 17 base::TimeTicks ticks; // initialized to 0. 18 ticks += base::TimeDelta::FromMilliseconds(t); 19 return ticks; 20 } 21 22 inline ::testing::AssertionResult LogContainsEventHelper( 23 const CapturingNetLog::CapturedEntryList& entries, 24 int i, // Negative indices are reverse indices. 25 const base::TimeTicks& expected_time, 26 bool check_time, 27 NetLog::EventType expected_event, 28 NetLog::EventPhase expected_phase) { 29 // Negative indices are reverse indices. 30 size_t j = (i < 0) ? 31 static_cast<size_t>(static_cast<int>(entries.size()) + i) : 32 static_cast<size_t>(i); 33 if (j >= entries.size()) 34 return ::testing::AssertionFailure() << j << " is out of bounds."; 35 const CapturingNetLog::CapturedEntry& entry = entries[j]; 36 if (expected_event != entry.type) { 37 return ::testing::AssertionFailure() 38 << "Actual event: " << NetLog::EventTypeToString(entry.type) 39 << ". Expected event: " << NetLog::EventTypeToString(expected_event) 40 << "."; 41 } 42 if (expected_phase != entry.phase) { 43 return ::testing::AssertionFailure() 44 << "Actual phase: " << entry.phase 45 << ". Expected phase: " << expected_phase << "."; 46 } 47 if (check_time) { 48 if (expected_time != entry.time) { 49 return ::testing::AssertionFailure() 50 << "Actual time: " << entry.time.ToInternalValue() 51 << ". Expected time: " << expected_time.ToInternalValue() 52 << "."; 53 } 54 } 55 return ::testing::AssertionSuccess(); 56 } 57 58 inline ::testing::AssertionResult LogContainsEventAtTime( 59 const CapturingNetLog::CapturedEntryList& log, 60 int i, // Negative indices are reverse indices. 61 const base::TimeTicks& expected_time, 62 NetLog::EventType expected_event, 63 NetLog::EventPhase expected_phase) { 64 return LogContainsEventHelper(log, i, expected_time, true, 65 expected_event, expected_phase); 66 } 67 68 // Version without timestamp. 69 inline ::testing::AssertionResult LogContainsEvent( 70 const CapturingNetLog::CapturedEntryList& log, 71 int i, // Negative indices are reverse indices. 72 NetLog::EventType expected_event, 73 NetLog::EventPhase expected_phase) { 74 return LogContainsEventHelper(log, i, base::TimeTicks(), false, 75 expected_event, expected_phase); 76 } 77 78 // Version for PHASE_BEGIN (and no timestamp). 79 inline ::testing::AssertionResult LogContainsBeginEvent( 80 const CapturingNetLog::CapturedEntryList& log, 81 int i, // Negative indices are reverse indices. 82 NetLog::EventType expected_event) { 83 return LogContainsEvent(log, i, expected_event, NetLog::PHASE_BEGIN); 84 } 85 86 // Version for PHASE_END (and no timestamp). 87 inline ::testing::AssertionResult LogContainsEndEvent( 88 const CapturingNetLog::CapturedEntryList& log, 89 int i, // Negative indices are reverse indices. 90 NetLog::EventType expected_event) { 91 return LogContainsEvent(log, i, expected_event, NetLog::PHASE_END); 92 } 93 94 inline ::testing::AssertionResult LogContainsEntryWithType( 95 const CapturingNetLog::CapturedEntryList& entries, 96 int i, // Negative indices are reverse indices. 97 NetLog::EventType type) { 98 // Negative indices are reverse indices. 99 size_t j = (i < 0) ? 100 static_cast<size_t>(static_cast<int>(entries.size()) + i) : 101 static_cast<size_t>(i); 102 if (j >= entries.size()) 103 return ::testing::AssertionFailure() << j << " is out of bounds."; 104 const CapturingNetLog::CapturedEntry& entry = entries[j]; 105 if (entry.type != type) 106 return ::testing::AssertionFailure() << "Type does not match."; 107 return ::testing::AssertionSuccess(); 108 } 109 110 // Check if the log contains any entry of the given type at |min_index| or 111 // after. 112 inline ::testing::AssertionResult LogContainsEntryWithTypeAfter( 113 const CapturingNetLog::CapturedEntryList& entries, 114 int min_index, // Negative indices are reverse indices. 115 NetLog::EventType type) { 116 // Negative indices are reverse indices. 117 size_t real_index = (min_index < 0) ? 118 static_cast<size_t>(static_cast<int>(entries.size()) + min_index) : 119 static_cast<size_t>(min_index); 120 for (size_t i = real_index; i < entries.size(); ++i) { 121 const CapturingNetLog::CapturedEntry& entry = entries[i]; 122 if (entry.type == type) 123 return ::testing::AssertionSuccess(); 124 } 125 return ::testing::AssertionFailure(); 126 } 127 128 // Expect that the log contains an event, but don't care about where 129 // as long as the first index where it is found is at least |min_index|. 130 // Returns the position where the event was found. 131 inline size_t ExpectLogContainsSomewhere( 132 const CapturingNetLog::CapturedEntryList& entries, 133 size_t min_index, 134 NetLog::EventType expected_event, 135 NetLog::EventPhase expected_phase) { 136 size_t i = 0; 137 for (; i < entries.size(); ++i) { 138 const CapturingNetLog::CapturedEntry& entry = entries[i]; 139 if (entry.type == expected_event && 140 entry.phase == expected_phase) 141 break; 142 } 143 EXPECT_LT(i, entries.size()); 144 EXPECT_GE(i, min_index); 145 return i; 146 } 147 148 // Expect that the log contains an event, but don't care about where 149 // as long as one index where it is found is at least |min_index|. 150 // Returns the first such position where the event was found. 151 inline size_t ExpectLogContainsSomewhereAfter( 152 const CapturingNetLog::CapturedEntryList& entries, 153 size_t min_index, 154 NetLog::EventType expected_event, 155 NetLog::EventPhase expected_phase) { 156 size_t i = min_index; 157 for (; i < entries.size(); ++i) { 158 const CapturingNetLog::CapturedEntry& entry = entries[i]; 159 if (entry.type == expected_event && 160 entry.phase == expected_phase) 161 break; 162 } 163 EXPECT_LT(i, entries.size()); 164 return i; 165 } 166 167 } // namespace net 168 169 #endif // NET_BASE_NET_LOG_UNITTEST_H_ 170