OLD | NEW |
| (Empty) |
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 #include "chrome/browser/extensions/api/web_request/web_request_time_tracker.h" | |
6 | |
7 #include "testing/gmock/include/gmock/gmock.h" | |
8 #include "testing/gtest/include/gtest/gtest.h" | |
9 | |
10 namespace { | |
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); | |
15 | |
16 class ExtensionWebRequestTimeTrackerDelegateMock | |
17 : public ExtensionWebRequestTimeTrackerDelegate { | |
18 public: | |
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>&)); | |
23 }; | |
24 | |
25 } // namespace | |
26 | |
27 //class ExtensionWebRequestTimeTrackerTest : public testing::Test {}; | |
28 | |
29 TEST(ExtensionWebRequestTimeTrackerTest, Basic) { | |
30 ExtensionWebRequestTimeTracker tracker; | |
31 base::Time start; | |
32 void* profile = NULL; | |
33 | |
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()); | |
42 } | |
43 | |
44 TEST(ExtensionWebRequestTimeTrackerTest, CancelOrRedirect) { | |
45 ExtensionWebRequestTimeTracker tracker; | |
46 base::Time start; | |
47 void* profile = NULL; | |
48 | |
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()); | |
54 | |
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()); | |
60 } | |
61 | |
62 TEST(ExtensionWebRequestTimeTrackerTest, Delays) { | |
63 ExtensionWebRequestTimeTracker tracker; | |
64 base::Time start; | |
65 std::string extension1_id("1"); | |
66 std::string extension2_id("2"); | |
67 void* profile = NULL; | |
68 | |
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)); | |
89 | |
90 // Now issue a bunch more requests and ensure that the old delays are | |
91 // forgotten. | |
92 for (int64 i = 4; i < 500; ++i) { | |
93 tracker.LogRequestStartTime(i, start, GURL(), profile); | |
94 tracker.LogRequestEndTime(i, start + kRequestDelta); | |
95 } | |
96 EXPECT_EQ(0u, tracker.moderate_delays_.size()); | |
97 EXPECT_EQ(0u, tracker.excessive_delays_.size()); | |
98 } | |
99 | |
100 TEST(ExtensionWebRequestTimeTrackerTest, Delegate) { | |
101 using testing::Mock; | |
102 | |
103 ExtensionWebRequestTimeTrackerDelegateMock* delegate( | |
104 new ExtensionWebRequestTimeTrackerDelegateMock); | |
105 ExtensionWebRequestTimeTracker tracker; | |
106 tracker.SetDelegate(delegate); | |
107 base::Time start; | |
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); | |
113 | |
114 const int num_moderate_delays = 51; | |
115 const int num_excessive_delays = 11; | |
116 int request_nr = 0; | |
117 | |
118 // Check that (only) the last moderate delay triggers the delegate callback. | |
119 for (int64 i = 0; i < num_moderate_delays; ++i) { | |
120 request_nr++; | |
121 if (i == num_moderate_delays-1) { | |
122 EXPECT_CALL(*delegate, | |
123 NotifyModerateDelays(profile , i+1, request_nr, extensions)); | |
124 } | |
125 tracker.LogRequestStartTime(request_nr, start, GURL(), profile); | |
126 tracker.IncrementExtensionBlockTime(extension1_id, request_nr, | |
127 kModerateDelay); | |
128 tracker.IncrementTotalBlockTime(request_nr, kModerateDelay); | |
129 tracker.LogRequestEndTime(request_nr, start + kRequestDelta); | |
130 Mock::VerifyAndClearExpectations(delegate); | |
131 } | |
132 | |
133 // Check that (only) the last excessive delay triggers the delegate callback. | |
134 for (int64 i = 0; i < num_excessive_delays; ++i) { | |
135 request_nr++; | |
136 if (i == num_excessive_delays-1) { | |
137 EXPECT_CALL(*delegate, | |
138 NotifyExcessiveDelays(profile, i+1, request_nr, extensions)); | |
139 } | |
140 tracker.LogRequestStartTime(request_nr, start, GURL(), profile); | |
141 tracker.IncrementExtensionBlockTime(extension1_id, request_nr, | |
142 kExcessiveDelay); | |
143 tracker.IncrementTotalBlockTime(request_nr, kExcessiveDelay); | |
144 tracker.LogRequestEndTime(request_nr, start + kRequestDelta); | |
145 Mock::VerifyAndClearExpectations(delegate); | |
146 } | |
147 } | |
OLD | NEW |