| OLD | NEW |
| 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/net/load_timing_observer.h" | 5 #include "chrome/browser/net/load_timing_observer.h" |
| 6 | 6 |
| 7 #include "base/compiler_specific.h" | 7 #include "base/compiler_specific.h" |
| 8 #include "base/format_macros.h" | 8 #include "base/format_macros.h" |
| 9 #include "base/string_util.h" | 9 #include "base/string_util.h" |
| 10 #include "base/time.h" | 10 #include "base/time.h" |
| 11 #include "net/base/load_flags.h" | 11 #include "net/base/load_flags.h" |
| 12 #include "net/url_request/url_request_netlog_params.h" | 12 #include "net/url_request/url_request_netlog_params.h" |
| 13 #include "testing/gtest/include/gtest/gtest.h" | 13 #include "testing/gtest/include/gtest/gtest.h" |
| 14 | 14 |
| 15 namespace { | 15 namespace { |
| 16 | 16 |
| 17 using net::NetLog; | 17 using net::NetLog; |
| 18 using base::TimeDelta; | 18 using base::TimeDelta; |
| 19 | 19 |
| 20 // Serves to Identify the current thread as the IO thread. |
| 21 class LoadTimingObserverTest : public testing::Test { |
| 22 public: |
| 23 LoadTimingObserverTest() : io_thread_(BrowserThread::IO, &message_loop_) { |
| 24 } |
| 25 |
| 26 private: |
| 27 MessageLoop message_loop_; |
| 28 BrowserThread io_thread_; |
| 29 }; |
| 30 |
| 20 base::TimeTicks current_time; | 31 base::TimeTicks current_time; |
| 21 | 32 |
| 22 void AddStartEntry(LoadTimingObserver& observer, | 33 void AddStartEntry(LoadTimingObserver& observer, |
| 23 const NetLog::Source& source, | 34 const NetLog::Source& source, |
| 24 NetLog::EventType type, | 35 NetLog::EventType type, |
| 25 NetLog::EventParameters* params) { | 36 NetLog::EventParameters* params) { |
| 26 observer.OnAddEntry(type, current_time, source, NetLog::PHASE_BEGIN, params); | 37 observer.OnAddEntry(type, current_time, source, NetLog::PHASE_BEGIN, params); |
| 27 } | 38 } |
| 28 | 39 |
| 29 void AddEndEntry(LoadTimingObserver& observer, | 40 void AddEndEntry(LoadTimingObserver& observer, |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 75 } | 86 } |
| 76 | 87 |
| 77 void AddEndSocketEntries(LoadTimingObserver& observer, uint32 id) { | 88 void AddEndSocketEntries(LoadTimingObserver& observer, uint32 id) { |
| 78 NetLog::Source source(NetLog::SOURCE_SOCKET, id); | 89 NetLog::Source source(NetLog::SOURCE_SOCKET, id); |
| 79 AddEndEntry(observer, source, NetLog::TYPE_SOCKET_ALIVE, NULL); | 90 AddEndEntry(observer, source, NetLog::TYPE_SOCKET_ALIVE, NULL); |
| 80 } | 91 } |
| 81 | 92 |
| 82 } // namespace | 93 } // namespace |
| 83 | 94 |
| 84 // Test that net::URLRequest with no load timing flag is not processed. | 95 // Test that net::URLRequest with no load timing flag is not processed. |
| 85 TEST(LoadTimingObserverTest, NoLoadTimingEnabled) { | 96 TEST_F(LoadTimingObserverTest, NoLoadTimingEnabled) { |
| 86 LoadTimingObserver observer; | 97 LoadTimingObserver observer; |
| 87 | 98 |
| 88 AddStartURLRequestEntries(observer, 0, false); | 99 AddStartURLRequestEntries(observer, 0, false); |
| 89 LoadTimingObserver::URLRequestRecord* record = | 100 LoadTimingObserver::URLRequestRecord* record = |
| 90 observer.GetURLRequestRecord(0); | 101 observer.GetURLRequestRecord(0); |
| 91 ASSERT_TRUE(record == NULL); | 102 ASSERT_TRUE(record == NULL); |
| 92 } | 103 } |
| 93 | 104 |
| 94 // Test that URLRequestRecord is created, deleted and is not growing unbound. | 105 // Test that URLRequestRecord is created, deleted and is not growing unbound. |
| 95 TEST(LoadTimingObserverTest, URLRequestRecord) { | 106 TEST_F(LoadTimingObserverTest, URLRequestRecord) { |
| 96 LoadTimingObserver observer; | 107 LoadTimingObserver observer; |
| 97 | 108 |
| 98 // Create record. | 109 // Create record. |
| 99 AddStartURLRequestEntries(observer, 0, true); | 110 AddStartURLRequestEntries(observer, 0, true); |
| 100 LoadTimingObserver::URLRequestRecord* record = | 111 LoadTimingObserver::URLRequestRecord* record = |
| 101 observer.GetURLRequestRecord(0); | 112 observer.GetURLRequestRecord(0); |
| 102 ASSERT_FALSE(record == NULL); | 113 ASSERT_FALSE(record == NULL); |
| 103 | 114 |
| 104 // Collect record. | 115 // Collect record. |
| 105 AddEndURLRequestEntries(observer, 0); | 116 AddEndURLRequestEntries(observer, 0); |
| 106 record = observer.GetURLRequestRecord(0); | 117 record = observer.GetURLRequestRecord(0); |
| 107 ASSERT_TRUE(record == NULL); | 118 ASSERT_TRUE(record == NULL); |
| 108 | 119 |
| 109 // Check unbound growth. | 120 // Check unbound growth. |
| 110 for (size_t i = 1; i < 1100; ++i) | 121 for (size_t i = 1; i < 1100; ++i) |
| 111 AddStartURLRequestEntries(observer, i, true); | 122 AddStartURLRequestEntries(observer, i, true); |
| 112 record = observer.GetURLRequestRecord(1); | 123 record = observer.GetURLRequestRecord(1); |
| 113 ASSERT_TRUE(record == NULL); | 124 ASSERT_TRUE(record == NULL); |
| 114 } | 125 } |
| 115 | 126 |
| 116 // Test that ConnectJobRecord is created, deleted and is not growing unbound. | 127 // Test that ConnectJobRecord is created, deleted and is not growing unbound. |
| 117 TEST(LoadTimingObserverTest, ConnectJobRecord) { | 128 TEST_F(LoadTimingObserverTest, ConnectJobRecord) { |
| 118 LoadTimingObserver observer; | 129 LoadTimingObserver observer; |
| 119 | 130 |
| 120 // Create record. | 131 // Create record. |
| 121 AddStartConnectJobEntries(observer, 0); | 132 AddStartConnectJobEntries(observer, 0); |
| 122 ASSERT_FALSE(observer.connect_job_to_record_.find(0) == | 133 ASSERT_FALSE(observer.connect_job_to_record_.find(0) == |
| 123 observer.connect_job_to_record_.end()); | 134 observer.connect_job_to_record_.end()); |
| 124 | 135 |
| 125 // Collect record. | 136 // Collect record. |
| 126 AddEndConnectJobEntries(observer, 0); | 137 AddEndConnectJobEntries(observer, 0); |
| 127 ASSERT_TRUE(observer.connect_job_to_record_.find(0) == | 138 ASSERT_TRUE(observer.connect_job_to_record_.find(0) == |
| 128 observer.connect_job_to_record_.end()); | 139 observer.connect_job_to_record_.end()); |
| 129 | 140 |
| 130 // Check unbound growth. | 141 // Check unbound growth. |
| 131 for (size_t i = 1; i < 1100; ++i) | 142 for (size_t i = 1; i < 1100; ++i) |
| 132 AddStartConnectJobEntries(observer, i); | 143 AddStartConnectJobEntries(observer, i); |
| 133 ASSERT_TRUE(observer.connect_job_to_record_.find(1) == | 144 ASSERT_TRUE(observer.connect_job_to_record_.find(1) == |
| 134 observer.connect_job_to_record_.end()); | 145 observer.connect_job_to_record_.end()); |
| 135 } | 146 } |
| 136 | 147 |
| 137 // Test that SocketRecord is created, deleted and is not growing unbound. | 148 // Test that SocketRecord is created, deleted and is not growing unbound. |
| 138 TEST(LoadTimingObserverTest, SocketRecord) { | 149 TEST_F(LoadTimingObserverTest, SocketRecord) { |
| 139 LoadTimingObserver observer; | 150 LoadTimingObserver observer; |
| 140 | 151 |
| 141 // Create record. | 152 // Create record. |
| 142 AddStartSocketEntries(observer, 0); | 153 AddStartSocketEntries(observer, 0); |
| 143 ASSERT_FALSE(observer.socket_to_record_.find(0) == | 154 ASSERT_FALSE(observer.socket_to_record_.find(0) == |
| 144 observer.socket_to_record_.end()); | 155 observer.socket_to_record_.end()); |
| 145 | 156 |
| 146 // Collect record. | 157 // Collect record. |
| 147 AddEndSocketEntries(observer, 0); | 158 AddEndSocketEntries(observer, 0); |
| 148 ASSERT_TRUE(observer.socket_to_record_.find(0) == | 159 ASSERT_TRUE(observer.socket_to_record_.find(0) == |
| 149 observer.socket_to_record_.end()); | 160 observer.socket_to_record_.end()); |
| 150 | 161 |
| 151 | 162 |
| 152 // Check unbound growth. | 163 // Check unbound growth. |
| 153 for (size_t i = 1; i < 1100; ++i) | 164 for (size_t i = 1; i < 1100; ++i) |
| 154 AddStartSocketEntries(observer, i); | 165 AddStartSocketEntries(observer, i); |
| 155 ASSERT_TRUE(observer.socket_to_record_.find(1) == | 166 ASSERT_TRUE(observer.socket_to_record_.find(1) == |
| 156 observer.socket_to_record_.end()); | 167 observer.socket_to_record_.end()); |
| 157 } | 168 } |
| 158 | 169 |
| 159 // Test that basic time is set to the request. | 170 // Test that basic time is set to the request. |
| 160 TEST(LoadTimingObserverTest, BaseTicks) { | 171 TEST_F(LoadTimingObserverTest, BaseTicks) { |
| 161 LoadTimingObserver observer; | 172 LoadTimingObserver observer; |
| 162 current_time += TimeDelta::FromSeconds(1); | 173 current_time += TimeDelta::FromSeconds(1); |
| 163 AddStartURLRequestEntries(observer, 0, true); | 174 AddStartURLRequestEntries(observer, 0, true); |
| 164 | 175 |
| 165 LoadTimingObserver::URLRequestRecord* record = | 176 LoadTimingObserver::URLRequestRecord* record = |
| 166 observer.GetURLRequestRecord(0); | 177 observer.GetURLRequestRecord(0); |
| 167 ASSERT_EQ(1000000, record->base_ticks.ToInternalValue()); | 178 ASSERT_EQ(1000000, record->base_ticks.ToInternalValue()); |
| 168 } | 179 } |
| 169 | 180 |
| 170 // Test proxy time detection. | 181 // Test proxy time detection. |
| 171 TEST(LoadTimingObserverTest, ProxyTime) { | 182 TEST_F(LoadTimingObserverTest, ProxyTime) { |
| 172 LoadTimingObserver observer; | 183 LoadTimingObserver observer; |
| 173 current_time += TimeDelta::FromSeconds(1); | 184 current_time += TimeDelta::FromSeconds(1); |
| 174 | 185 |
| 175 AddStartURLRequestEntries(observer, 0, true); | 186 AddStartURLRequestEntries(observer, 0, true); |
| 176 NetLog::Source source(NetLog::SOURCE_URL_REQUEST, 0); | 187 NetLog::Source source(NetLog::SOURCE_URL_REQUEST, 0); |
| 177 | 188 |
| 178 current_time += TimeDelta::FromSeconds(2); | 189 current_time += TimeDelta::FromSeconds(2); |
| 179 AddStartEntry(observer, source, NetLog::TYPE_PROXY_SERVICE, NULL); | 190 AddStartEntry(observer, source, NetLog::TYPE_PROXY_SERVICE, NULL); |
| 180 current_time += TimeDelta::FromSeconds(3); | 191 current_time += TimeDelta::FromSeconds(3); |
| 181 AddEndEntry(observer, source, NetLog::TYPE_PROXY_SERVICE, NULL); | 192 AddEndEntry(observer, source, NetLog::TYPE_PROXY_SERVICE, NULL); |
| 182 | 193 |
| 183 LoadTimingObserver::URLRequestRecord* record = | 194 LoadTimingObserver::URLRequestRecord* record = |
| 184 observer.GetURLRequestRecord(0); | 195 observer.GetURLRequestRecord(0); |
| 185 ASSERT_EQ(2000, record->timing.proxy_start); | 196 ASSERT_EQ(2000, record->timing.proxy_start); |
| 186 ASSERT_EQ(5000, record->timing.proxy_end); | 197 ASSERT_EQ(5000, record->timing.proxy_end); |
| 187 } | 198 } |
| 188 | 199 |
| 189 // Test connect time detection. | 200 // Test connect time detection. |
| 190 TEST(LoadTimingObserverTest, ConnectTime) { | 201 TEST_F(LoadTimingObserverTest, ConnectTime) { |
| 191 LoadTimingObserver observer; | 202 LoadTimingObserver observer; |
| 192 current_time += TimeDelta::FromSeconds(1); | 203 current_time += TimeDelta::FromSeconds(1); |
| 193 | 204 |
| 194 AddStartURLRequestEntries(observer, 0, true); | 205 AddStartURLRequestEntries(observer, 0, true); |
| 195 NetLog::Source source(NetLog::SOURCE_URL_REQUEST, 0); | 206 NetLog::Source source(NetLog::SOURCE_URL_REQUEST, 0); |
| 196 | 207 |
| 197 current_time += TimeDelta::FromSeconds(2); | 208 current_time += TimeDelta::FromSeconds(2); |
| 198 AddStartEntry(observer, source, NetLog::TYPE_SOCKET_POOL, NULL); | 209 AddStartEntry(observer, source, NetLog::TYPE_SOCKET_POOL, NULL); |
| 199 current_time += TimeDelta::FromSeconds(3); | 210 current_time += TimeDelta::FromSeconds(3); |
| 200 AddEndEntry(observer, source, NetLog::TYPE_SOCKET_POOL, NULL); | 211 AddEndEntry(observer, source, NetLog::TYPE_SOCKET_POOL, NULL); |
| 201 | 212 |
| 202 LoadTimingObserver::URLRequestRecord* record = | 213 LoadTimingObserver::URLRequestRecord* record = |
| 203 observer.GetURLRequestRecord(0); | 214 observer.GetURLRequestRecord(0); |
| 204 ASSERT_EQ(2000, record->timing.connect_start); | 215 ASSERT_EQ(2000, record->timing.connect_start); |
| 205 ASSERT_EQ(5000, record->timing.connect_end); | 216 ASSERT_EQ(5000, record->timing.connect_end); |
| 206 } | 217 } |
| 207 | 218 |
| 208 // Test dns time detection. | 219 // Test dns time detection. |
| 209 TEST(LoadTimingObserverTest, DnsTime) { | 220 TEST_F(LoadTimingObserverTest, DnsTime) { |
| 210 LoadTimingObserver observer; | 221 LoadTimingObserver observer; |
| 211 | 222 |
| 212 // Start request. | 223 // Start request. |
| 213 NetLog::Source source(NetLog::SOURCE_URL_REQUEST, 0); | 224 NetLog::Source source(NetLog::SOURCE_URL_REQUEST, 0); |
| 214 AddStartURLRequestEntries(observer, 0, true); | 225 AddStartURLRequestEntries(observer, 0, true); |
| 215 current_time += TimeDelta::FromSeconds(1); | 226 current_time += TimeDelta::FromSeconds(1); |
| 216 | 227 |
| 217 // Add resolver entry. | 228 // Add resolver entry. |
| 218 AddStartConnectJobEntries(observer, 1); | 229 AddStartConnectJobEntries(observer, 1); |
| 219 NetLog::Source connect_source(NetLog::SOURCE_CONNECT_JOB, 1); | 230 NetLog::Source connect_source(NetLog::SOURCE_CONNECT_JOB, 1); |
| (...skipping 13 matching lines...) Expand all Loading... |
| 233 NetLog::TYPE_SOCKET_POOL_BOUND_TO_CONNECT_JOB, | 244 NetLog::TYPE_SOCKET_POOL_BOUND_TO_CONNECT_JOB, |
| 234 params.get()); | 245 params.get()); |
| 235 | 246 |
| 236 LoadTimingObserver::URLRequestRecord* record = | 247 LoadTimingObserver::URLRequestRecord* record = |
| 237 observer.GetURLRequestRecord(0); | 248 observer.GetURLRequestRecord(0); |
| 238 ASSERT_EQ(1000, record->timing.dns_start); | 249 ASSERT_EQ(1000, record->timing.dns_start); |
| 239 ASSERT_EQ(3000, record->timing.dns_end); | 250 ASSERT_EQ(3000, record->timing.dns_end); |
| 240 } | 251 } |
| 241 | 252 |
| 242 // Test send time detection. | 253 // Test send time detection. |
| 243 TEST(LoadTimingObserverTest, SendTime) { | 254 TEST_F(LoadTimingObserverTest, SendTime) { |
| 244 LoadTimingObserver observer; | 255 LoadTimingObserver observer; |
| 245 | 256 |
| 246 // Start request. | 257 // Start request. |
| 247 NetLog::Source source(NetLog::SOURCE_URL_REQUEST, 0); | 258 NetLog::Source source(NetLog::SOURCE_URL_REQUEST, 0); |
| 248 AddStartURLRequestEntries(observer, 0, true); | 259 AddStartURLRequestEntries(observer, 0, true); |
| 249 current_time += TimeDelta::FromSeconds(2); | 260 current_time += TimeDelta::FromSeconds(2); |
| 250 | 261 |
| 251 // Add send request entry. | 262 // Add send request entry. |
| 252 AddStartEntry(observer, | 263 AddStartEntry(observer, |
| 253 source, | 264 source, |
| 254 NetLog::TYPE_HTTP_TRANSACTION_SEND_REQUEST, | 265 NetLog::TYPE_HTTP_TRANSACTION_SEND_REQUEST, |
| 255 NULL); | 266 NULL); |
| 256 current_time += TimeDelta::FromSeconds(5); | 267 current_time += TimeDelta::FromSeconds(5); |
| 257 AddEndEntry(observer, | 268 AddEndEntry(observer, |
| 258 source, | 269 source, |
| 259 NetLog::TYPE_HTTP_TRANSACTION_SEND_REQUEST, | 270 NetLog::TYPE_HTTP_TRANSACTION_SEND_REQUEST, |
| 260 NULL); | 271 NULL); |
| 261 | 272 |
| 262 LoadTimingObserver::URLRequestRecord* record = | 273 LoadTimingObserver::URLRequestRecord* record = |
| 263 observer.GetURLRequestRecord(0); | 274 observer.GetURLRequestRecord(0); |
| 264 ASSERT_EQ(2000, record->timing.send_start); | 275 ASSERT_EQ(2000, record->timing.send_start); |
| 265 ASSERT_EQ(7000, record->timing.send_end); | 276 ASSERT_EQ(7000, record->timing.send_end); |
| 266 } | 277 } |
| 267 | 278 |
| 268 // Test receive time detection. | 279 // Test receive time detection. |
| 269 TEST(LoadTimingObserverTest, ReceiveTime) { | 280 TEST_F(LoadTimingObserverTest, ReceiveTime) { |
| 270 LoadTimingObserver observer; | 281 LoadTimingObserver observer; |
| 271 | 282 |
| 272 // Start request. | 283 // Start request. |
| 273 NetLog::Source source(NetLog::SOURCE_URL_REQUEST, 0); | 284 NetLog::Source source(NetLog::SOURCE_URL_REQUEST, 0); |
| 274 AddStartURLRequestEntries(observer, 0, true); | 285 AddStartURLRequestEntries(observer, 0, true); |
| 275 current_time += TimeDelta::FromSeconds(2); | 286 current_time += TimeDelta::FromSeconds(2); |
| 276 | 287 |
| 277 // Add send request entry. | 288 // Add send request entry. |
| 278 AddStartEntry(observer, | 289 AddStartEntry(observer, |
| 279 source, | 290 source, |
| 280 NetLog::TYPE_HTTP_TRANSACTION_READ_HEADERS, | 291 NetLog::TYPE_HTTP_TRANSACTION_READ_HEADERS, |
| 281 NULL); | 292 NULL); |
| 282 current_time += TimeDelta::FromSeconds(5); | 293 current_time += TimeDelta::FromSeconds(5); |
| 283 AddEndEntry(observer, | 294 AddEndEntry(observer, |
| 284 source, | 295 source, |
| 285 NetLog::TYPE_HTTP_TRANSACTION_READ_HEADERS, | 296 NetLog::TYPE_HTTP_TRANSACTION_READ_HEADERS, |
| 286 NULL); | 297 NULL); |
| 287 | 298 |
| 288 LoadTimingObserver::URLRequestRecord* record = | 299 LoadTimingObserver::URLRequestRecord* record = |
| 289 observer.GetURLRequestRecord(0); | 300 observer.GetURLRequestRecord(0); |
| 290 ASSERT_EQ(2000, record->timing.receive_headers_start); | 301 ASSERT_EQ(2000, record->timing.receive_headers_start); |
| 291 ASSERT_EQ(7000, record->timing.receive_headers_end); | 302 ASSERT_EQ(7000, record->timing.receive_headers_end); |
| 292 } | 303 } |
| 293 | 304 |
| 294 // Test ssl time detection. | 305 // Test ssl time detection. |
| 295 TEST(LoadTimingObserverTest, SslTime) { | 306 TEST_F(LoadTimingObserverTest, SslTime) { |
| 296 LoadTimingObserver observer; | 307 LoadTimingObserver observer; |
| 297 | 308 |
| 298 // Start request. | 309 // Start request. |
| 299 NetLog::Source source(NetLog::SOURCE_URL_REQUEST, 0); | 310 NetLog::Source source(NetLog::SOURCE_URL_REQUEST, 0); |
| 300 AddStartURLRequestEntries(observer, 0, true); | 311 AddStartURLRequestEntries(observer, 0, true); |
| 301 current_time += TimeDelta::FromSeconds(1); | 312 current_time += TimeDelta::FromSeconds(1); |
| 302 | 313 |
| 303 // Add resolver entry. | 314 // Add resolver entry. |
| 304 AddStartSocketEntries(observer, 1); | 315 AddStartSocketEntries(observer, 1); |
| 305 NetLog::Source socket_source(NetLog::SOURCE_SOCKET, 1); | 316 NetLog::Source socket_source(NetLog::SOURCE_SOCKET, 1); |
| 306 AddStartEntry(observer, socket_source, NetLog::TYPE_SSL_CONNECT, NULL); | 317 AddStartEntry(observer, socket_source, NetLog::TYPE_SSL_CONNECT, NULL); |
| 307 current_time += TimeDelta::FromSeconds(2); | 318 current_time += TimeDelta::FromSeconds(2); |
| 308 AddEndEntry(observer, socket_source, NetLog::TYPE_SSL_CONNECT, NULL); | 319 AddEndEntry(observer, socket_source, NetLog::TYPE_SSL_CONNECT, NULL); |
| 309 | 320 |
| 310 // Bind to connect job. | 321 // Bind to connect job. |
| 311 scoped_refptr<net::NetLogSourceParameter> params( | 322 scoped_refptr<net::NetLogSourceParameter> params( |
| 312 new net::NetLogSourceParameter("socket", socket_source)); | 323 new net::NetLogSourceParameter("socket", socket_source)); |
| 313 AddStartEntry(observer, | 324 AddStartEntry(observer, |
| 314 source, | 325 source, |
| 315 NetLog::TYPE_SOCKET_POOL_BOUND_TO_SOCKET, | 326 NetLog::TYPE_SOCKET_POOL_BOUND_TO_SOCKET, |
| 316 params.get()); | 327 params.get()); |
| 317 | 328 |
| 318 LoadTimingObserver::URLRequestRecord* record = | 329 LoadTimingObserver::URLRequestRecord* record = |
| 319 observer.GetURLRequestRecord(0); | 330 observer.GetURLRequestRecord(0); |
| 320 ASSERT_EQ(1000, record->timing.ssl_start); | 331 ASSERT_EQ(1000, record->timing.ssl_start); |
| 321 ASSERT_EQ(3000, record->timing.ssl_end); | 332 ASSERT_EQ(3000, record->timing.ssl_end); |
| 322 } | 333 } |
| OLD | NEW |