Commit 6a14e6fe authored by mattcary's avatar mattcary Committed by Commit bot

Upgrade loading_model to use the new request_track and loading_trace.

Review URL: https://codereview.chromium.org/1610273002

Cr-Commit-Position: refs/heads/master@{#370673}
parent 33c282f0
This diff is collapsed.
...@@ -8,22 +8,62 @@ import unittest ...@@ -8,22 +8,62 @@ import unittest
import dag import dag
import loading_model import loading_model
import log_parser import loading_trace
import request_track
import request_dependencies_lens
class SimpleLens(object):
def __init__(self, trace):
self._trace = trace
def GetRequestDependencies(self):
url_to_rq = {}
deps = []
for rq in self._trace.request_track.GetEvents():
assert rq.url not in url_to_rq
url_to_rq[rq.url] = rq
for rq in self._trace.request_track.GetEvents():
if rq.initiator in url_to_rq:
deps.append((rq, url_to_rq[rq.initiator], ''))
return deps
class MockRequestTrack(object):
def __init__(self, requests):
self._requests = requests
def GetEvents(self):
return self._requests
class LoadingModelTestCase(unittest.TestCase): class LoadingModelTestCase(unittest.TestCase):
def setUp(self):
request_dependencies_lens.RequestDependencyLens = SimpleLens
self._next_request_id = 0
def MakeParserRequest(self, url, source_url, start_time, end_time, def MakeParserRequest(self, url, source_url, start_time, end_time,
magic_content_type=False): magic_content_type=False):
timing_data = {f: -1 for f in log_parser.Timing._fields} rq = request_track.Request.FromJsonDict({
# We should ignore connectEnd. 'request_id': self._next_request_id,
timing_data['connectEnd'] = (end_time - start_time) / 2 'url': 'http://' + str(url),
timing_data['receiveHeadersEnd'] = end_time - start_time 'initiator': 'http://' + str(source_url),
timing_data['requestTime'] = start_time / 1000.0 'response_headers': {'Content-Type':
return log_parser.RequestData( 'null' if not magic_content_type
None, {'Content-Type': 'null' if not magic_content_type else 'magic-debug-content' },
else 'magic-debug-content' }, 'timing': request_track.TimingFromDict({
None, start_time, timing_data, 'http://' + str(url), False, # connectEnd should be ignored.
{'type': 'parser', 'url': 'http://' + str(source_url)}) 'connectEnd': (end_time - start_time) / 2,
'receiveHeadersEnd': end_time - start_time,
'requestTime': start_time / 1000.0})
})
self._next_request_id += 1
return rq
def MakeGraph(self, requests):
return loading_model.ResourceGraph(loading_trace.LoadingTrace(
None, None, None, MockRequestTrack(requests), None))
def SortedIndicies(self, graph): def SortedIndicies(self, graph):
return [n.Index() for n in dag.TopologicalSort(graph._nodes)] return [n.Index() for n in dag.TopologicalSort(graph._nodes)]
...@@ -39,7 +79,7 @@ class LoadingModelTestCase(unittest.TestCase): ...@@ -39,7 +79,7 @@ class LoadingModelTestCase(unittest.TestCase):
self.MakeParserRequest(4, 3, 127, 128), self.MakeParserRequest(4, 3, 127, 128),
self.MakeParserRequest(5, 'null', 100, 105), self.MakeParserRequest(5, 'null', 100, 105),
self.MakeParserRequest(6, 5, 105, 110)] self.MakeParserRequest(6, 5, 105, 110)]
graph = loading_model.ResourceGraph(requests) graph = self.MakeGraph(requests)
self.assertEqual(self.SuccessorIndicies(graph._nodes[0]), [1, 2]) self.assertEqual(self.SuccessorIndicies(graph._nodes[0]), [1, 2])
self.assertEqual(self.SuccessorIndicies(graph._nodes[1]), [3]) self.assertEqual(self.SuccessorIndicies(graph._nodes[1]), [3])
self.assertEqual(self.SuccessorIndicies(graph._nodes[2]), []) self.assertEqual(self.SuccessorIndicies(graph._nodes[2]), [])
...@@ -60,7 +100,7 @@ class LoadingModelTestCase(unittest.TestCase): ...@@ -60,7 +100,7 @@ class LoadingModelTestCase(unittest.TestCase):
self.MakeParserRequest(4, 3, 127, 128), self.MakeParserRequest(4, 3, 127, 128),
self.MakeParserRequest(5, 'null', 100, 105), self.MakeParserRequest(5, 'null', 100, 105),
self.MakeParserRequest(6, 5, 105, 110)] self.MakeParserRequest(6, 5, 105, 110)]
graph = loading_model.ResourceGraph(requests) graph = self.MakeGraph(requests)
path_list = [] path_list = []
self.assertEqual(28, graph.Cost(path_list)) self.assertEqual(28, graph.Cost(path_list))
self.assertEqual([0, 1, 3, 4], [n.Index() for n in path_list]) self.assertEqual([0, 1, 3, 4], [n.Index() for n in path_list])
...@@ -76,10 +116,11 @@ class LoadingModelTestCase(unittest.TestCase): ...@@ -76,10 +116,11 @@ class LoadingModelTestCase(unittest.TestCase):
magic_content_type=True), magic_content_type=True),
self.MakeParserRequest(2, 0, 121, 122, self.MakeParserRequest(2, 0, 121, 122,
magic_content_type=True), magic_content_type=True),
self.MakeParserRequest(3, 0, 112, 119), self.MakeParserRequest(3, 0, 112, 119,
magic_content_type=True),
self.MakeParserRequest(4, 2, 122, 126), self.MakeParserRequest(4, 2, 122, 126),
self.MakeParserRequest(5, 2, 122, 126)] self.MakeParserRequest(5, 2, 122, 126)]
graph = loading_model.ResourceGraph(requests) graph = self.MakeGraph(requests)
self.assertEqual(self.SuccessorIndicies(graph._nodes[0]), [1, 3]) self.assertEqual(self.SuccessorIndicies(graph._nodes[0]), [1, 3])
self.assertEqual(self.SuccessorIndicies(graph._nodes[1]), [2]) self.assertEqual(self.SuccessorIndicies(graph._nodes[1]), [2])
self.assertEqual(self.SuccessorIndicies(graph._nodes[2]), [4, 5]) self.assertEqual(self.SuccessorIndicies(graph._nodes[2]), [4, 5])
...@@ -88,10 +129,10 @@ class LoadingModelTestCase(unittest.TestCase): ...@@ -88,10 +129,10 @@ class LoadingModelTestCase(unittest.TestCase):
self.assertEqual(self.SuccessorIndicies(graph._nodes[5]), []) self.assertEqual(self.SuccessorIndicies(graph._nodes[5]), [])
self.assertEqual(self.SortedIndicies(graph), [0, 1, 3, 2, 4, 5]) self.assertEqual(self.SortedIndicies(graph), [0, 1, 3, 2, 4, 5])
# Change node 1 so it is a parent of 3, which become parent of 2. # Change node 1 so it is a parent of 3, which becomes the parent of 2.
requests[1] = self.MakeParserRequest(1, 0, 110, 111, requests[1] = self.MakeParserRequest(1, 0, 110, 111,
magic_content_type=True) magic_content_type=True)
graph = loading_model.ResourceGraph(requests) graph = self.MakeGraph(requests)
self.assertEqual(self.SuccessorIndicies(graph._nodes[0]), [1]) self.assertEqual(self.SuccessorIndicies(graph._nodes[0]), [1])
self.assertEqual(self.SuccessorIndicies(graph._nodes[1]), [3]) self.assertEqual(self.SuccessorIndicies(graph._nodes[1]), [3])
self.assertEqual(self.SuccessorIndicies(graph._nodes[2]), [4, 5]) self.assertEqual(self.SuccessorIndicies(graph._nodes[2]), [4, 5])
...@@ -101,14 +142,15 @@ class LoadingModelTestCase(unittest.TestCase): ...@@ -101,14 +142,15 @@ class LoadingModelTestCase(unittest.TestCase):
self.assertEqual(self.SortedIndicies(graph), [0, 1, 3, 2, 4, 5]) self.assertEqual(self.SortedIndicies(graph), [0, 1, 3, 2, 4, 5])
# Add an initiator dependence to 1 that will become the parent of 3. # Add an initiator dependence to 1 that will become the parent of 3.
requests[1] = self.MakeParserRequest(1, 0, 110, 111)
requests.append(self.MakeParserRequest(6, 1, 111, 112))
graph = loading_model.ResourceGraph(requests)
# Check it doesn't change until we change the content type of 1.
self.assertEqual(self.SuccessorIndicies(graph._nodes[1]), [3, 6])
requests[1] = self.MakeParserRequest(1, 0, 110, 111, requests[1] = self.MakeParserRequest(1, 0, 110, 111,
magic_content_type=True) magic_content_type=True)
graph = loading_model.ResourceGraph(requests) requests.append(self.MakeParserRequest(6, 1, 111, 112))
graph = self.MakeGraph(requests)
# Check it doesn't change until we change the content type of 6.
self.assertEqual(self.SuccessorIndicies(graph._nodes[6]), [])
requests[6] = self.MakeParserRequest(6, 1, 111, 112,
magic_content_type=True)
graph = self.MakeGraph(requests)
self.assertEqual(self.SuccessorIndicies(graph._nodes[0]), [1]) self.assertEqual(self.SuccessorIndicies(graph._nodes[0]), [1])
self.assertEqual(self.SuccessorIndicies(graph._nodes[1]), [6]) self.assertEqual(self.SuccessorIndicies(graph._nodes[1]), [6])
self.assertEqual(self.SuccessorIndicies(graph._nodes[2]), [4, 5]) self.assertEqual(self.SuccessorIndicies(graph._nodes[2]), [4, 5])
...@@ -127,8 +169,8 @@ class LoadingModelTestCase(unittest.TestCase): ...@@ -127,8 +169,8 @@ class LoadingModelTestCase(unittest.TestCase):
self.MakeParserRequest(4, 2, 122, 126), self.MakeParserRequest(4, 2, 122, 126),
self.MakeParserRequest(5, 2, 122, 126)] self.MakeParserRequest(5, 2, 122, 126)]
for r in requests: for r in requests:
r.headers['Content-Type'] = 'image/gif' r.response_headers['Content-Type'] = 'image/gif'
graph = loading_model.ResourceGraph(requests) graph = self.MakeGraph(requests)
self.assertEqual(self.SuccessorIndicies(graph._nodes[0]), [1, 2, 3]) self.assertEqual(self.SuccessorIndicies(graph._nodes[0]), [1, 2, 3])
self.assertEqual(self.SuccessorIndicies(graph._nodes[1]), []) self.assertEqual(self.SuccessorIndicies(graph._nodes[1]), [])
self.assertEqual(self.SuccessorIndicies(graph._nodes[2]), [4, 5]) self.assertEqual(self.SuccessorIndicies(graph._nodes[2]), [4, 5])
......
...@@ -117,10 +117,35 @@ class Request(object): ...@@ -117,10 +117,35 @@ class Request(object):
def IsDataRequest(self): def IsDataRequest(self):
return self.protocol == 'data' return self.protocol == 'data'
# For testing. def MaxAge(self):
"""Returns the max-age of a resource, or -1."""
# TODO(lizeb): Handle the "Expires" header as well.
cache_control = {}
if not self.response_headers:
return -1
cache_control_str = self.response_headers.get('Cache-Control', None)
if cache_control_str is not None:
directives = [s.strip() for s in cache_control_str.split(',')]
for directive in directives:
parts = [s.strip() for s in directive.split('=')]
if len(parts) == 1:
cache_control[parts[0]] = True
else:
cache_control[parts[0]] = parts[1]
if (u'no-store' in cache_control
or u'no-cache' in cache_control
or len(cache_control) == 0):
return -1
if 'max-age' in cache_control:
return int(cache_control['max-age'])
return -1
def __eq__(self, o): def __eq__(self, o):
return self.__dict__ == o.__dict__ return self.__dict__ == o.__dict__
def __hash__(self):
return hash(self.request_id)
class RequestTrack(devtools_monitor.Track): class RequestTrack(devtools_monitor.Track):
"""Aggregates request data.""" """Aggregates request data."""
......
...@@ -268,6 +268,21 @@ class RequestTrackTestCase(unittest.TestCase): ...@@ -268,6 +268,21 @@ class RequestTrackTestCase(unittest.TestCase):
request_track = RequestTrack.FromJsonDict(json_dict) request_track = RequestTrack.FromJsonDict(json_dict)
self.assertEquals(self.request_track, request_track) self.assertEquals(self.request_track, request_track)
def testMaxAge(self):
rq = Request()
self.assertEqual(-1, rq.MaxAge())
rq.response_headers = {}
self.assertEqual(-1, rq.MaxAge())
rq.response_headers[
'Cache-Control'] = 'private,s-maxage=0,max-age=0,must-revalidate'
self.assertEqual(0, rq.MaxAge())
rq.response_headers[
'Cache-Control'] = 'private,s-maxage=0,no-store,max-age=100'
self.assertEqual(-1, rq.MaxAge())
rq.response_headers[
'Cache-Control'] = 'private,s-maxage=0'
self.assertEqual(-1, rq.MaxAge())
@classmethod @classmethod
def _ValidSequence(cls, request_track): def _ValidSequence(cls, request_track):
request_track.Handle( request_track.Handle(
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment