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.
5 #include "extensions/browser/api/web_request/web_request_time_tracker.h"
7 #include "testing/gmock/include/gmock/gmock.h"
8 #include "testing/gtest/include/gtest/gtest.h"
11 const base::TimeDelta kRequestDelta
= base::TimeDelta::FromMilliseconds(100);
12 const base::TimeDelta kTinyDelay
= base::TimeDelta::FromMilliseconds(1);
13 const base::TimeDelta kModerateDelay
= base::TimeDelta::FromMilliseconds(25);
14 const base::TimeDelta kExcessiveDelay
= base::TimeDelta::FromMilliseconds(75);
16 class ExtensionWebRequestTimeTrackerDelegateMock
17 : public ExtensionWebRequestTimeTrackerDelegate
{
19 MOCK_METHOD4(NotifyExcessiveDelays
,
20 void (void*, size_t, size_t, const std::set
<std::string
>&));
21 MOCK_METHOD4(NotifyModerateDelays
,
22 void (void*, size_t, size_t, const std::set
<std::string
>&));
27 //class ExtensionWebRequestTimeTrackerTest : public testing::Test {};
29 TEST(ExtensionWebRequestTimeTrackerTest
, Basic
) {
30 ExtensionWebRequestTimeTracker tracker
;
34 tracker
.LogRequestStartTime(42, start
, GURL(), profile
);
35 EXPECT_EQ(1u, tracker
.request_time_logs_
.size());
36 ASSERT_EQ(1u, tracker
.request_ids_
.size());
37 EXPECT_EQ(42, tracker
.request_ids_
.front());
38 tracker
.LogRequestEndTime(42, start
+ kRequestDelta
);
39 EXPECT_EQ(1u, tracker
.request_time_logs_
.size());
40 EXPECT_EQ(0u, tracker
.moderate_delays_
.size());
41 EXPECT_EQ(0u, tracker
.excessive_delays_
.size());
44 TEST(ExtensionWebRequestTimeTrackerTest
, CancelOrRedirect
) {
45 ExtensionWebRequestTimeTracker tracker
;
49 tracker
.LogRequestStartTime(1, start
, GURL(), profile
);
50 EXPECT_EQ(1u, tracker
.request_time_logs_
.size());
51 tracker
.SetRequestCanceled(1);
52 tracker
.LogRequestEndTime(1, start
+ kRequestDelta
);
53 EXPECT_EQ(0u, tracker
.request_time_logs_
.size());
55 tracker
.LogRequestStartTime(2, start
, GURL(), profile
);
56 EXPECT_EQ(1u, tracker
.request_time_logs_
.size());
57 tracker
.SetRequestRedirected(2);
58 tracker
.LogRequestEndTime(2, start
+ kRequestDelta
);
59 EXPECT_EQ(0u, tracker
.request_time_logs_
.size());
62 TEST(ExtensionWebRequestTimeTrackerTest
, Delays
) {
63 ExtensionWebRequestTimeTracker tracker
;
65 std::string
extension1_id("1");
66 std::string
extension2_id("2");
69 // Start 3 requests with different amounts of delay from 2 extensions.
70 tracker
.LogRequestStartTime(1, start
, GURL(), profile
);
71 tracker
.LogRequestStartTime(2, start
, GURL(), profile
);
72 tracker
.LogRequestStartTime(3, start
, GURL(), profile
);
73 tracker
.IncrementExtensionBlockTime(extension1_id
, 1, kTinyDelay
);
74 tracker
.IncrementExtensionBlockTime(extension1_id
, 2, kTinyDelay
);
75 tracker
.IncrementExtensionBlockTime(extension1_id
, 3, kTinyDelay
);
76 tracker
.IncrementExtensionBlockTime(extension2_id
, 2, kModerateDelay
);
77 tracker
.IncrementExtensionBlockTime(extension2_id
, 3, kExcessiveDelay
);
78 tracker
.IncrementTotalBlockTime(1, kTinyDelay
);
79 tracker
.IncrementTotalBlockTime(2, kModerateDelay
);
80 tracker
.IncrementTotalBlockTime(3, kExcessiveDelay
);
81 tracker
.LogRequestEndTime(1, start
+ kRequestDelta
);
82 tracker
.LogRequestEndTime(2, start
+ kRequestDelta
);
83 tracker
.LogRequestEndTime(3, start
+ kRequestDelta
);
84 EXPECT_EQ(3u, tracker
.request_time_logs_
.size());
85 EXPECT_EQ(1u, tracker
.moderate_delays_
.size());
86 EXPECT_EQ(1u, tracker
.moderate_delays_
.count(2));
87 EXPECT_EQ(1u, tracker
.excessive_delays_
.size());
88 EXPECT_EQ(1u, tracker
.excessive_delays_
.count(3));
90 // Now issue a bunch more requests and ensure that the old delays are
92 for (int64 i
= 4; i
< 500; ++i
) {
93 tracker
.LogRequestStartTime(i
, start
, GURL(), profile
);
94 tracker
.LogRequestEndTime(i
, start
+ kRequestDelta
);
96 EXPECT_EQ(0u, tracker
.moderate_delays_
.size());
97 EXPECT_EQ(0u, tracker
.excessive_delays_
.size());
100 TEST(ExtensionWebRequestTimeTrackerTest
, Delegate
) {
103 ExtensionWebRequestTimeTrackerDelegateMock
* delegate(
104 new ExtensionWebRequestTimeTrackerDelegateMock
);
105 ExtensionWebRequestTimeTracker tracker
;
106 tracker
.SetDelegate(delegate
);
108 std::string
extension1_id("1");
109 void* profile
= NULL
;
110 // Set of all extensions that blocked network requests.
111 std::set
<std::string
> extensions
;
112 extensions
.insert(extension1_id
);
114 const int num_moderate_delays
= 51;
115 const int num_excessive_delays
= 11;
118 // Check that (only) the last moderate delay triggers the delegate callback.
119 for (int64 i
= 0; i
< num_moderate_delays
; ++i
) {
121 if (i
== num_moderate_delays
-1) {
122 EXPECT_CALL(*delegate
,
123 NotifyModerateDelays(profile
, i
+1, request_nr
, extensions
));
125 tracker
.LogRequestStartTime(request_nr
, start
, GURL(), profile
);
126 tracker
.IncrementExtensionBlockTime(extension1_id
, request_nr
,
128 tracker
.IncrementTotalBlockTime(request_nr
, kModerateDelay
);
129 tracker
.LogRequestEndTime(request_nr
, start
+ kRequestDelta
);
130 Mock::VerifyAndClearExpectations(delegate
);
133 // Check that (only) the last excessive delay triggers the delegate callback.
134 for (int64 i
= 0; i
< num_excessive_delays
; ++i
) {
136 if (i
== num_excessive_delays
-1) {
137 EXPECT_CALL(*delegate
,
138 NotifyExcessiveDelays(profile
, i
+1, request_nr
, extensions
));
140 tracker
.LogRequestStartTime(request_nr
, start
, GURL(), profile
);
141 tracker
.IncrementExtensionBlockTime(extension1_id
, request_nr
,
143 tracker
.IncrementTotalBlockTime(request_nr
, kExcessiveDelay
);
144 tracker
.LogRequestEndTime(request_nr
, start
+ kRequestDelta
);
145 Mock::VerifyAndClearExpectations(delegate
);