def test_DictConstruction(self): graph = test_utils.TestResourceGraph({ 'request_track': { 'events': [ test_utils.MakeRequest(0, 'null', 100, 100.5, 101).ToJsonDict(), test_utils.MakeRequest(1, 0, 102, 102.5, 103).ToJsonDict(), test_utils.MakeRequest(2, 0, 102, 102.5, 103).ToJsonDict(), test_utils.MakeRequest(3, 2, 104, 114.5, 105).ToJsonDict() ], 'metadata': { request_track.RequestTrack._DUPLICATES_KEY: 0, request_track.RequestTrack._INCONSISTENT_INITIATORS_KEY: 0 } }, 'url': 'foo.com', 'tracing_track': { 'events': [] }, 'page_track': { 'events': [] }, 'metadata': {} }) self.assertEqual(self.SuccessorIndicies(graph._nodes[0]), [1, 2]) self.assertEqual(self.SuccessorIndicies(graph._nodes[1]), []) self.assertEqual(self.SuccessorIndicies(graph._nodes[2]), [3]) self.assertEqual(self.SuccessorIndicies(graph._nodes[3]), [])
def test_MaxPath(self): requests = [ test_utils.MakeRequest(0, 'null', 100, 110, 111), test_utils.MakeRequest(1, 0, 115, 120, 121), test_utils.MakeRequest(2, 0, 112, 120, 121), test_utils.MakeRequest(3, 1, 122, 126, 127), test_utils.MakeRequest(4, 3, 127, 128, 129), test_utils.MakeRequest(5, 'null', 100, 105, 106), test_utils.MakeRequest(6, 5, 105, 110, 111) ] graph = test_utils.TestResourceGraph.FromRequestList(requests) path_list = [] self.assertEqual(29, graph.Cost(path_list)) self.assertEqual([0, 1, 3, 4], [n.Index() for n in path_list])
def test_Costing(self): requests = [ test_utils.MakeRequest(0, 'null', 100, 105, 110), test_utils.MakeRequest(1, 0, 115, 117, 120), test_utils.MakeRequest(2, 0, 112, 116, 120), test_utils.MakeRequest(3, 1, 122, 124, 126), test_utils.MakeRequest(4, 3, 127, 127.5, 128), test_utils.MakeRequest(5, 'null', 100, 103, 105), test_utils.MakeRequest(6, 5, 105, 107, 110) ] graph = test_utils.TestResourceGraph.FromRequestList(requests) self.assertEqual(self.SuccessorIndicies(graph._nodes[0]), [1, 2]) self.assertEqual(self.SuccessorIndicies(graph._nodes[1]), [3]) self.assertEqual(self.SuccessorIndicies(graph._nodes[2]), []) self.assertEqual(self.SuccessorIndicies(graph._nodes[3]), [4]) self.assertEqual(self.SuccessorIndicies(graph._nodes[4]), []) self.assertEqual(self.SuccessorIndicies(graph._nodes[5]), [6]) self.assertEqual(self.SuccessorIndicies(graph._nodes[6]), []) self.assertEqual(self.SortedIndicies(graph), [0, 5, 1, 2, 6, 3, 4]) self.assertEqual(28, graph.Cost()) graph.Set(cache_all=True) self.assertEqual(8, graph.Cost())
def test_TimingSplitImage(self): # If we're all image types, then we shouldn't split by timing. requests = [ test_utils.MakeRequest(0, 'null', 100, 110, 110), test_utils.MakeRequest(1, 0, 115, 120, 120), test_utils.MakeRequest(2, 0, 121, 122, 122), test_utils.MakeRequest(3, 0, 112, 119, 119), test_utils.MakeRequest(4, 2, 122, 126, 126), test_utils.MakeRequest(5, 2, 122, 126, 126) ] for r in requests: r.response_headers['Content-Type'] = 'image/gif' graph = test_utils.TestResourceGraph.FromRequestList(requests) self.assertEqual(self.SuccessorIndicies(graph._nodes[0]), [1, 2, 3]) self.assertEqual(self.SuccessorIndicies(graph._nodes[1]), []) self.assertEqual(self.SuccessorIndicies(graph._nodes[2]), [4, 5]) self.assertEqual(self.SuccessorIndicies(graph._nodes[3]), []) self.assertEqual(self.SuccessorIndicies(graph._nodes[4]), []) self.assertEqual(self.SuccessorIndicies(graph._nodes[5]), []) self.assertEqual(self.SortedIndicies(graph), [0, 1, 2, 3, 4, 5])
def testHandleTimingDependenciesImages(self): # If we're all image types, then we shouldn't split by timing. requests = [ test_utils.MakeRequest(0, 'null', 100, 110, 110), test_utils.MakeRequest(1, 0, 115, 120, 120), test_utils.MakeRequest(2, 0, 121, 122, 122), test_utils.MakeRequest(3, 0, 112, 119, 119), test_utils.MakeRequest(4, 2, 122, 126, 126), test_utils.MakeRequest(5, 2, 122, 126, 126) ] for r in requests: r.response_headers['Content-Type'] = 'image/gif' g = self._GraphFromRequests(requests) self.assertSetEqual(self._Successors(g, requests[0]), set([requests[1], requests[2], requests[3]])) self.assertSetEqual(self._Successors(g, requests[1]), set()) self.assertSetEqual(self._Successors(g, requests[2]), set([requests[4], requests[5]])) self.assertSetEqual(self._Successors(g, requests[3]), set()) self.assertSetEqual(self._Successors(g, requests[4]), set()) self.assertSetEqual(self._Successors(g, requests[5]), set())
def test_TimingSplit(self): # Timing adds node 1 as a parent to 2 but not 3. requests = [ test_utils.MakeRequest(0, 'null', 100, 110, 110, magic_content_type=True), test_utils.MakeRequest(1, 0, 115, 120, 120, magic_content_type=True), test_utils.MakeRequest(2, 0, 121, 122, 122, magic_content_type=True), test_utils.MakeRequest(3, 0, 112, 119, 119, magic_content_type=True), test_utils.MakeRequest(4, 2, 122, 126, 126), test_utils.MakeRequest(5, 2, 122, 126, 126) ] graph = test_utils.TestResourceGraph.FromRequestList(requests) self.assertEqual(self.SuccessorIndicies(graph._nodes[0]), [1, 3]) self.assertEqual(self.SuccessorIndicies(graph._nodes[1]), [2]) self.assertEqual(self.SuccessorIndicies(graph._nodes[2]), [4, 5]) self.assertEqual(self.SuccessorIndicies(graph._nodes[3]), []) self.assertEqual(self.SuccessorIndicies(graph._nodes[4]), []) self.assertEqual(self.SuccessorIndicies(graph._nodes[5]), []) self.assertEqual(self.SortedIndicies(graph), [0, 1, 3, 2, 4, 5]) # Change node 1 so it is a parent of 3, which becomes the parent of 2. requests[1] = test_utils.MakeRequest(1, 0, 110, 111, 111, magic_content_type=True) graph = test_utils.TestResourceGraph.FromRequestList(requests) self.assertEqual(self.SuccessorIndicies(graph._nodes[0]), [1]) self.assertEqual(self.SuccessorIndicies(graph._nodes[1]), [3]) self.assertEqual(self.SuccessorIndicies(graph._nodes[2]), [4, 5]) self.assertEqual(self.SuccessorIndicies(graph._nodes[3]), [2]) self.assertEqual(self.SuccessorIndicies(graph._nodes[4]), []) self.assertEqual(self.SuccessorIndicies(graph._nodes[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. requests[1] = test_utils.MakeRequest(1, 0, 110, 111, 111, magic_content_type=True) requests.append(test_utils.MakeRequest(6, 1, 111, 112, 112)) graph = test_utils.TestResourceGraph.FromRequestList(requests) # Check it doesn't change until we change the content type of 6. self.assertEqual(self.SuccessorIndicies(graph._nodes[6]), []) requests[6] = test_utils.MakeRequest(6, 1, 111, 112, 112, magic_content_type=True) graph = test_utils.TestResourceGraph.FromRequestList(requests) self.assertEqual(self.SuccessorIndicies(graph._nodes[0]), [1]) self.assertEqual(self.SuccessorIndicies(graph._nodes[1]), [6]) self.assertEqual(self.SuccessorIndicies(graph._nodes[2]), [4, 5]) self.assertEqual(self.SuccessorIndicies(graph._nodes[3]), [2]) self.assertEqual(self.SuccessorIndicies(graph._nodes[4]), []) self.assertEqual(self.SuccessorIndicies(graph._nodes[5]), []) self.assertEqual(self.SuccessorIndicies(graph._nodes[6]), [3]) self.assertEqual(self.SortedIndicies(graph), [0, 1, 6, 3, 2, 4, 5])
def testBreakdownEdgeActivityByInitiator(self): requests = [ test_utils.MakeRequest(0, 1, 10, 20, 30), test_utils.MakeRequest(0, 1, 50, 60, 70) ] raw_events = [{ u'args': { u'beginData': { u'url': requests[0].url } }, u'cat': u'devtools.timeline', u'dur': 12 * 1000, u'name': u'ParseHTML', u'ph': u'X', u'pid': 1, u'tid': 1, u'ts': 25 * 1000 }, { u'args': { u'data': { 'scriptName': requests[0].url } }, u'cat': u'devtools.timeline,v8', u'dur': 0, u'name': u'EvaluateScript', u'ph': u'X', u'pid': 1, u'tid': 1, u'ts': 0 }, { u'cat': u'toplevel', u'dur': 100 * 1000, u'name': u'MessageLoop::RunTask', u'ph': u'X', u'pid': 1, u'tid': 1, u'ts': 0 }] activity = self._ActivityLens(requests, raw_events) dep = (requests[0], requests[1], 'parser') self.assertEquals( { 'unrelated_work': 18, 'idle': 0, 'script': 0, 'parsing': 12, 'other_url': 0, 'unknown_url': 0 }, activity.BreakdownEdgeActivityByInitiator(dep)) dep = (requests[0], requests[1], 'other') # Truncating the event from the parent request end. self.assertEquals( { 'unrelated_work': 13, 'idle': 0, 'script': 0, 'parsing': 7, 'other_url': 0, 'unknown_url': 0 }, activity.BreakdownEdgeActivityByInitiator(dep)) # Unknown URL raw_events[0]['args']['beginData']['url'] = None activity = self._ActivityLens(requests, raw_events) dep = (requests[0], requests[1], 'parser') self.assertEquals( { 'unrelated_work': 18, 'idle': 0, 'script': 0, 'parsing': 0, 'other_url': 0, 'unknown_url': 12 }, activity.BreakdownEdgeActivityByInitiator(dep)) # Script raw_events[1]['ts'] = 40 * 1000 raw_events[1]['dur'] = 6 * 1000 activity = self._ActivityLens(requests, raw_events) dep = (requests[0], requests[1], 'script') self.assertEquals( { 'unrelated_work': 7, 'idle': 0, 'script': 6, 'parsing': 0, 'other_url': 0, 'unknown_url': 7 }, activity.BreakdownEdgeActivityByInitiator(dep)) # Other URL raw_events[1]['args']['data']['scriptName'] = 'http://other.com/url' activity = self._ActivityLens(requests, raw_events) self.assertEquals( { 'unrelated_work': 7, 'idle': 0, 'script': 0., 'parsing': 0., 'other_url': 6., 'unknown_url': 7. }, activity.BreakdownEdgeActivityByInitiator(dep))
def testHandleTimingDependencies(self): # Timing adds node 1 as a parent to 2 but not 3. requests = [ test_utils.MakeRequest(0, 'null', 100, 110, 110, magic_content_type=True), test_utils.MakeRequest(1, 0, 115, 120, 120, magic_content_type=True), test_utils.MakeRequest(2, 0, 121, 122, 122, magic_content_type=True), test_utils.MakeRequest(3, 0, 112, 119, 119, magic_content_type=True), test_utils.MakeRequest(4, 2, 122, 126, 126), test_utils.MakeRequest(5, 2, 122, 126, 126) ] g = self._GraphFromRequests(requests) self.assertSetEqual(self._Successors(g, requests[0]), set([requests[1], requests[3]])) self.assertSetEqual(self._Successors(g, requests[1]), set([requests[2]])) self.assertSetEqual(self._Successors(g, requests[2]), set([requests[4], requests[5]])) self.assertSetEqual(self._Successors(g, requests[3]), set()) self.assertSetEqual(self._Successors(g, requests[4]), set()) self.assertSetEqual(self._Successors(g, requests[5]), set()) # Change node 1 so it is a parent of 3, which becomes the parent of 2. requests[1] = test_utils.MakeRequest(1, 0, 110, 111, 111, magic_content_type=True) g = self._GraphFromRequests(requests) self.assertSetEqual(self._Successors(g, requests[0]), set([requests[1]])) self.assertSetEqual(self._Successors(g, requests[1]), set([requests[3]])) self.assertSetEqual(self._Successors(g, requests[2]), set([requests[4], requests[5]])) self.assertSetEqual(self._Successors(g, requests[3]), set([requests[2]])) self.assertSetEqual(self._Successors(g, requests[4]), set()) self.assertSetEqual(self._Successors(g, requests[5]), set()) # Add an initiator dependence to 1 that will become the parent of 3. requests[1] = test_utils.MakeRequest(1, 0, 110, 111, 111, magic_content_type=True) requests.append(test_utils.MakeRequest(6, 1, 111, 112, 112)) g = self._GraphFromRequests(requests) # Check it doesn't change until we change the content type of 6. self.assertEqual(self._Successors(g, requests[6]), set()) requests[6] = test_utils.MakeRequest(6, 1, 111, 112, 112, magic_content_type=True) g = self._GraphFromRequests(requests) self.assertSetEqual(self._Successors(g, requests[0]), set([requests[1]])) self.assertSetEqual(self._Successors(g, requests[1]), set([requests[6]])) self.assertSetEqual(self._Successors(g, requests[2]), set([requests[4], requests[5]])) self.assertSetEqual(self._Successors(g, requests[3]), set([requests[2]])) self.assertSetEqual(self._Successors(g, requests[4]), set()) self.assertSetEqual(self._Successors(g, requests[5]), set()) self.assertSetEqual(self._Successors(g, requests[6]), set([requests[3]]))