OLD | NEW |
1 # Copyright 2016 The Chromium Authors. All rights reserved. | 1 # Copyright 2016 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 import unittest | 5 import unittest |
6 | 6 |
7 import devtools_monitor | 7 import devtools_monitor |
8 from loading_trace import LoadingTrace | 8 from loading_trace import LoadingTrace |
9 from request_dependencies_lens import RequestDependencyLens | 9 from request_dependencies_lens import RequestDependencyLens |
10 from request_track import (Request, TimingFromDict) | 10 from request_track import (Request, TimingFromDict) |
11 import test_utils | 11 import test_utils |
12 | 12 |
13 | 13 |
14 class RequestDependencyLensTestCase(unittest.TestCase): | 14 class TestRequests(object): |
15 _REDIRECT_REQUEST = Request.FromJsonDict( | 15 FIRST_REDIRECT_REQUEST = Request.FromJsonDict( |
16 {'url': 'http://bla.com', 'request_id': '1234.redirect.1', | 16 {'url': 'http://bla.com', 'request_id': '1234.redirect.1', |
17 'initiator': {'type': 'other'}, | 17 'initiator': {'type': 'other'}, |
| 18 'timestamp': 0.5, 'timing': TimingFromDict({})}) |
| 19 SECOND_REDIRECT_REQUEST = Request.FromJsonDict( |
| 20 {'url': 'http://bla.com/redirect1', 'request_id': '1234.redirect.2', |
| 21 'initiator': {'type': 'redirect', |
| 22 'initiating_request': '1234.redirect.1'}, |
18 'timestamp': 1, 'timing': TimingFromDict({})}) | 23 'timestamp': 1, 'timing': TimingFromDict({})}) |
19 _REDIRECTED_REQUEST = Request.FromJsonDict({ | 24 REDIRECTED_REQUEST = Request.FromJsonDict({ |
20 'url': 'http://bla.com', | 25 'url': 'http://bla.com/index.html', |
21 'request_id': '1234.1', | 26 'request_id': '1234.1', |
22 'frame_id': '123.1', | 27 'frame_id': '123.1', |
23 'initiator': {'type': 'redirect', | 28 'initiator': {'type': 'redirect', |
24 'initiating_request': '1234.redirect.1'}, | 29 'initiating_request': '1234.redirect.2'}, |
25 'timestamp': 2, | 30 'timestamp': 2, |
26 'timing': TimingFromDict({})}) | 31 'timing': TimingFromDict({})}) |
27 _REQUEST = Request.FromJsonDict({'url': 'http://bla.com', | 32 REQUEST = Request.FromJsonDict({'url': 'http://bla.com/index.html', |
28 'request_id': '1234.1', | 33 'request_id': '1234.1', |
29 'frame_id': '123.1', | 34 'frame_id': '123.1', |
30 'initiator': {'type': 'other'}, | 35 'initiator': {'type': 'other'}, |
31 'timestamp': 2, | 36 'timestamp': 2, |
32 'timing': TimingFromDict({})}) | 37 'timing': TimingFromDict({})}) |
33 _JS_REQUEST = Request.FromJsonDict({'url': 'http://bla.com/nyancat.js', | 38 JS_REQUEST = Request.FromJsonDict({'url': 'http://bla.com/nyancat.js', |
34 'request_id': '1234.12', | 39 'request_id': '1234.12', |
35 'frame_id': '123.1', | 40 'frame_id': '123.123', |
36 'initiator': {'type': 'parser', | 41 'initiator': { |
37 'url': 'http://bla.com'}, | 42 'type': 'parser', |
38 'timestamp': 3, | 43 'url': 'http://bla.com/index.html'}, |
39 'timing': TimingFromDict({})}) | 44 'timestamp': 3, |
40 _JS_REQUEST_OTHER_FRAME = Request.FromJsonDict( | 45 'timing': TimingFromDict({})}) |
| 46 JS_REQUEST_OTHER_FRAME = Request.FromJsonDict( |
41 {'url': 'http://bla.com/nyancat.js', | 47 {'url': 'http://bla.com/nyancat.js', |
42 'request_id': '1234.42', | 48 'request_id': '1234.42', |
43 'frame_id': '123.13', | 49 'frame_id': '123.13', |
44 'initiator': {'type': 'parser', | 50 'initiator': {'type': 'parser', |
45 'url': 'http://bla.com'}, | 51 'url': 'http://bla.com/index.html'}, |
46 'timestamp': 4, 'timing': TimingFromDict({})}) | 52 'timestamp': 4, 'timing': TimingFromDict({})}) |
47 _JS_REQUEST_UNRELATED_FRAME = Request.FromJsonDict( | 53 JS_REQUEST_UNRELATED_FRAME = Request.FromJsonDict( |
48 {'url': 'http://bla.com/nyancat.js', | 54 {'url': 'http://bla.com/nyancat.js', |
49 'request_id': '1234.42', | 55 'request_id': '1234.56', |
50 'frame_id': '123.99', | 56 'frame_id': '123.99', |
51 'initiator': {'type': 'parser', | 57 'initiator': {'type': 'parser', |
52 'url': 'http://bla.com'}, | 58 'url': 'http://bla.com/index.html'}, |
53 'timestamp': 5, 'timing': TimingFromDict({})}) | 59 'timestamp': 5, 'timing': TimingFromDict({})}) |
54 _JS_REQUEST_2 = Request.FromJsonDict( | 60 JS_REQUEST_2 = Request.FromJsonDict( |
55 {'url': 'http://bla.com/cat.js', 'request_id': '1234.13', | 61 {'url': 'http://bla.com/cat.js', 'request_id': '1234.13', |
56 'frame_id': '123.1', | 62 'frame_id': '123.123', |
57 'initiator': {'type': 'script', | 63 'initiator': {'type': 'script', |
58 'stack': {'callFrames': [ | 64 'stack': {'callFrames': [ |
59 {'url': 'unknown'}, | 65 {'url': 'unknown'}, |
60 {'url': 'http://bla.com/nyancat.js'}]}}, | 66 {'url': 'http://bla.com/nyancat.js'}]}}, |
61 'timestamp': 10, 'timing': TimingFromDict({})}) | 67 'timestamp': 10, 'timing': TimingFromDict({})}) |
62 _PAGE_EVENTS = [{'method': 'Page.frameAttached', | 68 PAGE_EVENTS = [{'method': 'Page.frameAttached', |
63 'frame_id': '123.13', 'parent_frame_id': '123.1'}] | 69 'frame_id': '123.13', 'parent_frame_id': '123.1'}, |
| 70 {'method': 'Page.frameAttached', |
| 71 'frame_id': '123.123', 'parent_frame_id': '123.1'}] |
64 | 72 |
| 73 @classmethod |
| 74 def CreateLoadingTrace(cls, trace_events=None): |
| 75 return test_utils.LoadingTraceFromEvents( |
| 76 [cls.FIRST_REDIRECT_REQUEST, cls.SECOND_REDIRECT_REQUEST, |
| 77 cls.REDIRECTED_REQUEST, cls.REQUEST, cls.JS_REQUEST, cls.JS_REQUEST_2, |
| 78 cls.JS_REQUEST_OTHER_FRAME, cls.JS_REQUEST_UNRELATED_FRAME], |
| 79 cls.PAGE_EVENTS, trace_events) |
| 80 |
| 81 |
| 82 class RequestDependencyLensTestCase(unittest.TestCase): |
65 def testRedirectDependency(self): | 83 def testRedirectDependency(self): |
66 loading_trace = test_utils.LoadingTraceFromEvents( | 84 loading_trace = test_utils.LoadingTraceFromEvents( |
67 [self._REDIRECT_REQUEST, self._REDIRECTED_REQUEST]) | 85 [TestRequests.FIRST_REDIRECT_REQUEST, |
| 86 TestRequests.SECOND_REDIRECT_REQUEST, TestRequests.REDIRECTED_REQUEST]) |
68 request_dependencies_lens = RequestDependencyLens(loading_trace) | 87 request_dependencies_lens = RequestDependencyLens(loading_trace) |
69 deps = request_dependencies_lens.GetRequestDependencies() | 88 deps = request_dependencies_lens.GetRequestDependencies() |
70 self.assertEquals(1, len(deps)) | 89 self.assertEquals(2, len(deps)) |
71 (first, second, reason) = deps[0] | 90 (first, second, reason) = deps[0] |
72 self.assertEquals('redirect', reason) | 91 self.assertEquals('redirect', reason) |
73 self.assertEquals(self._REDIRECT_REQUEST.request_id, first.request_id) | 92 self.assertEquals(TestRequests.FIRST_REDIRECT_REQUEST.request_id, |
74 self.assertEquals(self._REQUEST.request_id, second.request_id) | 93 first.request_id) |
| 94 self.assertEquals(TestRequests.SECOND_REDIRECT_REQUEST.request_id, |
| 95 second.request_id) |
| 96 (first, second, reason) = deps[1] |
| 97 self.assertEquals('redirect', reason) |
| 98 self.assertEquals(TestRequests.SECOND_REDIRECT_REQUEST.request_id, |
| 99 first.request_id) |
| 100 self.assertEquals(TestRequests.REQUEST.request_id, second.request_id) |
| 101 |
| 102 def testGetRedirectChain(self): |
| 103 loading_trace = test_utils.LoadingTraceFromEvents( |
| 104 [TestRequests.FIRST_REDIRECT_REQUEST, |
| 105 TestRequests.SECOND_REDIRECT_REQUEST, TestRequests.REDIRECTED_REQUEST]) |
| 106 request_dependencies_lens = RequestDependencyLens(loading_trace) |
| 107 whole_chain = [TestRequests.FIRST_REDIRECT_REQUEST, |
| 108 TestRequests.SECOND_REDIRECT_REQUEST, |
| 109 TestRequests.REDIRECTED_REQUEST] |
| 110 chain = request_dependencies_lens.GetRedirectChain( |
| 111 TestRequests.FIRST_REDIRECT_REQUEST) |
| 112 self.assertListEqual(whole_chain, chain) |
| 113 chain = request_dependencies_lens.GetRedirectChain( |
| 114 TestRequests.SECOND_REDIRECT_REQUEST) |
| 115 self.assertListEqual(whole_chain[1:], chain) |
| 116 chain = request_dependencies_lens.GetRedirectChain( |
| 117 TestRequests.REDIRECTED_REQUEST) |
| 118 self.assertEquals(whole_chain[2:], chain) |
75 | 119 |
76 def testScriptDependency(self): | 120 def testScriptDependency(self): |
77 loading_trace = test_utils.LoadingTraceFromEvents( | 121 loading_trace = test_utils.LoadingTraceFromEvents( |
78 [self._JS_REQUEST, self._JS_REQUEST_2]) | 122 [TestRequests.JS_REQUEST, TestRequests.JS_REQUEST_2]) |
79 request_dependencies_lens = RequestDependencyLens(loading_trace) | 123 request_dependencies_lens = RequestDependencyLens(loading_trace) |
80 deps = request_dependencies_lens.GetRequestDependencies() | 124 deps = request_dependencies_lens.GetRequestDependencies() |
81 self.assertEquals(1, len(deps)) | 125 self.assertEquals(1, len(deps)) |
82 self._AssertDependencyIs( | 126 self._AssertDependencyIs( |
83 deps[0], | 127 deps[0], |
84 self._JS_REQUEST.request_id, self._JS_REQUEST_2.request_id, 'script') | 128 TestRequests.JS_REQUEST.request_id, |
| 129 TestRequests.JS_REQUEST_2.request_id, 'script') |
85 | 130 |
86 def testAsyncScriptDependency(self): | 131 def testAsyncScriptDependency(self): |
87 JS_REQUEST_WITH_ASYNC_STACK = Request.FromJsonDict( | 132 JS_REQUEST_WITH_ASYNC_STACK = Request.FromJsonDict( |
88 {'url': 'http://bla.com/cat.js', 'request_id': '1234.14', | 133 {'url': 'http://bla.com/cat.js', 'request_id': '1234.14', |
89 'initiator': { | 134 'initiator': { |
90 'type': 'script', | 135 'type': 'script', |
91 'stack': {'callFrames': [], | 136 'stack': {'callFrames': [], |
92 'parent': {'callFrames': [ | 137 'parent': {'callFrames': [ |
93 {'url': 'http://bla.com/nyancat.js'}]}}}, | 138 {'url': 'http://bla.com/nyancat.js'}]}}}, |
94 'timestamp': 10, 'timing': TimingFromDict({})}) | 139 'timestamp': 10, 'timing': TimingFromDict({})}) |
95 loading_trace = test_utils.LoadingTraceFromEvents( | 140 loading_trace = test_utils.LoadingTraceFromEvents( |
96 [self._JS_REQUEST, JS_REQUEST_WITH_ASYNC_STACK]) | 141 [TestRequests.JS_REQUEST, JS_REQUEST_WITH_ASYNC_STACK]) |
97 request_dependencies_lens = RequestDependencyLens(loading_trace) | 142 request_dependencies_lens = RequestDependencyLens(loading_trace) |
98 deps = request_dependencies_lens.GetRequestDependencies() | 143 deps = request_dependencies_lens.GetRequestDependencies() |
99 self.assertEquals(1, len(deps)) | 144 self.assertEquals(1, len(deps)) |
100 self._AssertDependencyIs( | 145 self._AssertDependencyIs( |
101 deps[0], self._JS_REQUEST.request_id, | 146 deps[0], TestRequests.JS_REQUEST.request_id, |
102 JS_REQUEST_WITH_ASYNC_STACK.request_id, 'script') | 147 JS_REQUEST_WITH_ASYNC_STACK.request_id, 'script') |
103 | 148 |
104 def testParserDependency(self): | 149 def testParserDependency(self): |
105 loading_trace = test_utils.LoadingTraceFromEvents( | 150 loading_trace = test_utils.LoadingTraceFromEvents( |
106 [self._REQUEST, self._JS_REQUEST]) | 151 [TestRequests.REQUEST, TestRequests.JS_REQUEST]) |
107 request_dependencies_lens = RequestDependencyLens(loading_trace) | 152 request_dependencies_lens = RequestDependencyLens(loading_trace) |
108 deps = request_dependencies_lens.GetRequestDependencies() | 153 deps = request_dependencies_lens.GetRequestDependencies() |
109 self.assertEquals(1, len(deps)) | 154 self.assertEquals(1, len(deps)) |
110 self._AssertDependencyIs( | 155 self._AssertDependencyIs( |
111 deps[0], | 156 deps[0], |
112 self._REQUEST.request_id, self._JS_REQUEST.request_id, 'parser') | 157 TestRequests.REQUEST.request_id, TestRequests.JS_REQUEST.request_id, |
| 158 'parser') |
113 | 159 |
114 def testSeveralDependencies(self): | 160 def testSeveralDependencies(self): |
115 loading_trace = test_utils.LoadingTraceFromEvents( | 161 loading_trace = test_utils.LoadingTraceFromEvents( |
116 [self._REDIRECT_REQUEST, self._REDIRECTED_REQUEST, self._JS_REQUEST, | 162 [TestRequests.FIRST_REDIRECT_REQUEST, |
117 self._JS_REQUEST_2]) | 163 TestRequests.SECOND_REDIRECT_REQUEST, |
| 164 TestRequests.REDIRECTED_REQUEST, |
| 165 TestRequests.JS_REQUEST, TestRequests.JS_REQUEST_2]) |
118 request_dependencies_lens = RequestDependencyLens(loading_trace) | 166 request_dependencies_lens = RequestDependencyLens(loading_trace) |
119 deps = request_dependencies_lens.GetRequestDependencies() | 167 deps = request_dependencies_lens.GetRequestDependencies() |
120 self.assertEquals(3, len(deps)) | 168 self.assertEquals(4, len(deps)) |
121 self._AssertDependencyIs( | 169 self._AssertDependencyIs( |
122 deps[0], self._REDIRECT_REQUEST.request_id, self._REQUEST.request_id, | 170 deps[0], TestRequests.FIRST_REDIRECT_REQUEST.request_id, |
123 'redirect') | 171 TestRequests.SECOND_REDIRECT_REQUEST.request_id, 'redirect') |
124 self._AssertDependencyIs( | 172 self._AssertDependencyIs( |
125 deps[1], | 173 deps[1], TestRequests.SECOND_REDIRECT_REQUEST.request_id, |
126 self._REQUEST.request_id, self._JS_REQUEST.request_id, 'parser') | 174 TestRequests.REQUEST.request_id, 'redirect') |
127 self._AssertDependencyIs( | 175 self._AssertDependencyIs( |
128 deps[2], | 176 deps[2], |
129 self._JS_REQUEST.request_id, self._JS_REQUEST_2.request_id, 'script') | 177 TestRequests.REQUEST.request_id, TestRequests.JS_REQUEST.request_id, |
| 178 'parser') |
| 179 self._AssertDependencyIs( |
| 180 deps[3], |
| 181 TestRequests.JS_REQUEST.request_id, |
| 182 TestRequests.JS_REQUEST_2.request_id, 'script') |
130 | 183 |
131 def testDependencyDifferentFrame(self): | 184 def testDependencyDifferentFrame(self): |
132 """Checks that a more recent request from another frame is ignored.""" | 185 """Checks that a more recent request from another frame is ignored.""" |
133 loading_trace = test_utils.LoadingTraceFromEvents( | 186 loading_trace = test_utils.LoadingTraceFromEvents( |
134 [self._JS_REQUEST, self._JS_REQUEST_OTHER_FRAME, self._JS_REQUEST_2]) | 187 [TestRequests.JS_REQUEST, TestRequests.JS_REQUEST_OTHER_FRAME, |
| 188 TestRequests.JS_REQUEST_2]) |
135 request_dependencies_lens = RequestDependencyLens(loading_trace) | 189 request_dependencies_lens = RequestDependencyLens(loading_trace) |
136 deps = request_dependencies_lens.GetRequestDependencies() | 190 deps = request_dependencies_lens.GetRequestDependencies() |
137 self.assertEquals(1, len(deps)) | 191 self.assertEquals(1, len(deps)) |
138 self._AssertDependencyIs( | 192 self._AssertDependencyIs( |
139 deps[0], | 193 deps[0], |
140 self._JS_REQUEST.request_id, self._JS_REQUEST_2.request_id, 'script') | 194 TestRequests.JS_REQUEST.request_id, |
| 195 TestRequests.JS_REQUEST_2.request_id, 'script') |
141 | 196 |
142 def testDependencySameParentFrame(self): | 197 def testDependencySameParentFrame(self): |
143 """Checks that a more recent request from an unrelated frame is ignored | 198 """Checks that a more recent request from an unrelated frame is ignored |
144 if there is one from a related frame.""" | 199 if there is one from a related frame.""" |
145 loading_trace = test_utils.LoadingTraceFromEvents( | 200 loading_trace = test_utils.LoadingTraceFromEvents( |
146 [self._JS_REQUEST_OTHER_FRAME, self._JS_REQUEST_UNRELATED_FRAME, | 201 [TestRequests.JS_REQUEST_OTHER_FRAME, |
147 self._JS_REQUEST_2], self._PAGE_EVENTS) | 202 TestRequests.JS_REQUEST_UNRELATED_FRAME, TestRequests.JS_REQUEST_2], |
| 203 TestRequests.PAGE_EVENTS) |
148 request_dependencies_lens = RequestDependencyLens(loading_trace) | 204 request_dependencies_lens = RequestDependencyLens(loading_trace) |
149 deps = request_dependencies_lens.GetRequestDependencies() | 205 deps = request_dependencies_lens.GetRequestDependencies() |
150 self.assertEquals(1, len(deps)) | 206 self.assertEquals(1, len(deps)) |
151 self._AssertDependencyIs( | 207 self._AssertDependencyIs( |
152 deps[0], | 208 deps[0], |
153 self._JS_REQUEST_OTHER_FRAME.request_id, | 209 TestRequests.JS_REQUEST_OTHER_FRAME.request_id, |
154 self._JS_REQUEST_2.request_id, 'script') | 210 TestRequests.JS_REQUEST_2.request_id, 'script') |
155 | 211 |
156 def _AssertDependencyIs( | 212 def _AssertDependencyIs( |
157 self, dep, first_request_id, second_request_id, reason): | 213 self, dep, first_request_id, second_request_id, reason): |
158 (first, second, dependency_reason) = dep | 214 (first, second, dependency_reason) = dep |
159 self.assertEquals(reason, dependency_reason) | 215 self.assertEquals(reason, dependency_reason) |
160 self.assertEquals(first_request_id, first.request_id) | 216 self.assertEquals(first_request_id, first.request_id) |
161 self.assertEquals(second_request_id, second.request_id) | 217 self.assertEquals(second_request_id, second.request_id) |
162 | 218 |
163 | 219 |
164 if __name__ == '__main__': | 220 if __name__ == '__main__': |
165 unittest.main() | 221 unittest.main() |
OLD | NEW |