def testPltNoLoadEvents(self): trace = self._MakeTrace() # Change the MarkLoad events. for e in trace.tracing_track.GetEvents(): if e.name == 'MarkLoad': e.tracing_event['name'] = 'dummy' loading_report = report.LoadingReport(trace).GenerateReport() self.assertAlmostEqual(self._REQUEST_OFFSET + self._DURATION, loading_report['plt_ms'])
def testAdTrackingRules(self): ad_domain = 'i-ve-got-the-best-ads.com' self.requests[0].url = 'http://www.' + ad_domain trace = self._MakeTrace() loading_report = report.LoadingReport( trace, [ad_domain], []).GenerateReport() self.assertEqual(1, loading_report['ad_requests']) self.assertEqual(1, loading_report['ad_or_tracking_requests']) self.assertEqual(1, loading_report['ad_or_tracking_initiated_requests']) self.assertIsNone(loading_report['tracking_requests'])
def testAdTrackingRules(self): trace = self._MakeTrace() loading_report = report.LoadingReport( trace, [self.ad_domain], []).GenerateReport() self.assertEqual(1, loading_report['ad_requests']) self.assertEqual(1, loading_report['ad_or_tracking_requests']) self.assertEqual(1, loading_report['ad_or_tracking_initiated_requests']) self.assertIsNone(loading_report['tracking_requests']) self.assertEqual( self._FIRST_REQUEST_DATA_LENGTH + metrics.HTTP_OK_LENGTH, loading_report['ad_or_tracking_initiated_transfer_size'])
def testGenerateReport(self): trace = self._MakeTrace() loading_report = report.LoadingReport(trace).GenerateReport() self.assertEqual(trace.url, loading_report['url']) self.assertEqual(self._TEXT_PAINT - self._NAVIGATION_START_TIME, loading_report['first_text_ms']) self.assertEqual(self._SIGNIFICANT_PAINT - self._NAVIGATION_START_TIME, loading_report['significant_ms']) self.assertEqual(self._CONTENTFUL_PAINT - self._NAVIGATION_START_TIME, loading_report['contentful_ms']) self.assertAlmostEqual(self._LOAD_END_TIME - self._NAVIGATION_START_TIME, loading_report['plt_ms']) self.assertEqual(2, loading_report['total_requests']) self.assertAlmostEqual(0.34, loading_report['contentful_byte_frac'], 2) self.assertAlmostEqual(0.1844, loading_report['significant_byte_frac'], 2) self.assertEqual(2, loading_report['plt_requests']) self.assertEqual(1, loading_report['first_text_requests']) self.assertEqual(1, loading_report['contentful_requests']) self.assertEqual(1, loading_report['significant_requests']) self.assertEqual(1, loading_report['plt_preloaded_requests']) self.assertEqual(1, loading_report['first_text_preloaded_requests']) self.assertEqual(1, loading_report['contentful_preloaded_requests']) self.assertEqual(1, loading_report['significant_preloaded_requests']) self.assertEqual(401, loading_report['plt_requests_cost']) self.assertEqual(1, loading_report['first_text_requests_cost']) self.assertEqual(1, loading_report['contentful_requests_cost']) self.assertEqual(1, loading_report['significant_requests_cost']) self.assertEqual(1, loading_report['plt_preloaded_requests_cost']) self.assertEqual(1, loading_report['first_text_preloaded_requests_cost']) self.assertEqual(1, loading_report['contentful_preloaded_requests_cost']) self.assertEqual(1, loading_report['significant_preloaded_requests_cost']) self.assertEqual(400, loading_report['plt_predicted_no_state_prefetch_ms']) self.assertEqual(14, loading_report['first_text_predicted_no_state_prefetch_ms']) self.assertEqual(104, loading_report['contentful_predicted_no_state_prefetch_ms']) self.assertEqual(74, loading_report['significant_predicted_no_state_prefetch_ms']) self.assertEqual('', loading_report['contentful_inversion']) self.assertEqual('', loading_report['significant_inversion']) self.assertIsNone(loading_report['ad_requests']) self.assertIsNone(loading_report['ad_or_tracking_requests']) self.assertIsNone(loading_report['ad_or_tracking_initiated_requests']) self.assertIsNone(loading_report['ad_or_tracking_initiated_transfer_size']) self.assertIsNone(loading_report['ad_or_tracking_script_frac']) self.assertIsNone(loading_report['ad_or_tracking_parsing_frac']) self.assertEqual( self._FIRST_REQUEST_DATA_LENGTH + self._SECOND_REQUEST_DATA_LENGTH + metrics.HTTP_OK_LENGTH * 2, loading_report['transfer_size']) self.assertEqual(0, loading_report['total_queuing_blocked_msec']) self.assertEqual(0, loading_report['total_queuing_load_msec']) self.assertEqual(0, loading_report['average_blocking_request_count']) self.assertEqual(0, loading_report['median_blocking_request_count'])
def testAdsAndTrackingCost(self): load_time = float(self._LOAD_END_TIME - self._NAVIGATION_START_TIME) self.trace_events.append( {'ts': load_time / 3. * self.MILLI_TO_MICRO, 'pid': 1, 'tid': 1, 'ph': 'X', 'dur': load_time / 2. * self.MILLI_TO_MICRO, 'cat': 'devtools.timeline', 'name': 'EvaluateScript', 'args': {'data': {'scriptName': self.ad_url}}}) loading_report = report.LoadingReport( self._MakeTrace(), [self.ad_domain]).GenerateReport() self.assertAlmostEqual(.5, loading_report['ad_or_tracking_script_frac'], 2) self.assertAlmostEqual(0., loading_report['ad_or_tracking_parsing_frac'])
def testThreadBusyness(self): loading_report = report.LoadingReport(self._MakeTrace()).GenerateReport() self.assertAlmostEqual( 1., loading_report['significant_activity_frac']) self.assertAlmostEqual( float(self._TOPLEVEL_EVENT_DURATION - self._TOPLEVEL_EVENT_OFFSET) / (self._CONTENTFUL_PAINT - self._NAVIGATION_START_TIME), loading_report['contentful_activity_frac']) self.assertAlmostEqual( float(self._TOPLEVEL_EVENT_DURATION - self._TOPLEVEL_EVENT_OFFSET) / (self._LOAD_END_TIME - self._NAVIGATION_START_TIME), loading_report['plt_activity_frac'])
def testInversion(self): self.requests[0].timing.loading_finished = 4 * ( self._REQUEST_OFFSET + self._DURATION) self.requests[1].initiator['type'] = 'parser' self.requests[1].initiator['url'] = self.requests[0].url for e in self.trace_events: if e['name'] == 'firstContentfulPaint': e['ts'] = self.MILLI_TO_MICRO * ( self._FIRST_REQUEST_TIME + self._REQUEST_OFFSET + self._DURATION + 1) break loading_report = report.LoadingReport(self._MakeTrace()).GenerateReport() self.assertEqual(self.requests[0].url, loading_report['contentful_inversion']) self.assertEqual(None, loading_report['significant_inversion'])
def testGenerateReport(self): trace = self._MakeTrace() loading_report = report.LoadingReport(trace).GenerateReport() self.assertEqual(trace.url, loading_report['url']) self.assertEqual(self._TEXT_PAINT - self._NAVIGATION_START_TIME, loading_report['first_text_ms']) self.assertEqual(self._SIGNIFICANT_PAINT - self._NAVIGATION_START_TIME, loading_report['significant_paint_ms']) self.assertEqual(self._CONTENTFUL_PAINT - self._NAVIGATION_START_TIME, loading_report['contentful_paint_ms']) self.assertAlmostEqual(self._LOAD_END_TIME - self._NAVIGATION_START_TIME, loading_report['plt_ms']) self.assertAlmostEqual(0.34, loading_report['contentful_byte_frac'], 2) self.assertAlmostEqual(0.1844, loading_report['significant_byte_frac'], 2) self.assertIsNone(loading_report['contentful_inversion']) self.assertIsNone(loading_report['significant_inversion']) self.assertIsNone(loading_report['ad_requests']) self.assertIsNone(loading_report['ad_or_tracking_requests']) self.assertIsNone(loading_report['ad_or_tracking_initiated_requests'])
def testQueueStats(self): # We use three requests, A, B and C. A is not blocked, B is blocked by A, # and C blocked by A and B. BASE_MSEC = self._FIRST_REQUEST_TIME + 4 * self._DURATION self.requests = [] request_A = self.trace_creator.RequestAt(BASE_MSEC, 5) request_B = self.trace_creator.RequestAt(BASE_MSEC + 6, 5) request_C = self.trace_creator.RequestAt(BASE_MSEC + 12, 10) self.requests.extend([request_A, request_B, request_C]) self._AddQueuingEvents(10, request_A.url, BASE_MSEC, BASE_MSEC, BASE_MSEC + 5) self._AddQueuingEvents(20, request_B.url, BASE_MSEC + 1, BASE_MSEC + 6, BASE_MSEC + 11) self._AddQueuingEvents(30, request_C.url, BASE_MSEC + 2, BASE_MSEC + 12, BASE_MSEC + 22) loading_report = report.LoadingReport(self._MakeTrace()).GenerateReport() self.assertEqual(15, loading_report['total_queuing_blocked_msec']) self.assertEqual(35, loading_report['total_queuing_load_msec']) self.assertAlmostEqual(1, loading_report['average_blocking_request_count']) self.assertEqual(1, loading_report['median_blocking_request_count'])
def testActivityBreakdown(self): loading_report = report.LoadingReport(self._MakeTrace()).GenerateReport() load_time = float(self._LOAD_END_TIME - self._NAVIGATION_START_TIME) contentful_time = float( self._CONTENTFUL_PAINT - self._NAVIGATION_START_TIME) self.assertAlmostEqual(self._SCRIPT_EVENT_DURATION / load_time, loading_report['plt_script_frac']) self.assertAlmostEqual( (self._PARSING_EVENT_DURATION - self._SCRIPT_EVENT_DURATION) / load_time, loading_report['plt_parsing_frac']) self.assertAlmostEqual(1., loading_report['significant_script_frac']) self.assertAlmostEqual(0., loading_report['significant_parsing_frac']) self.assertAlmostEqual(self._SCRIPT_EVENT_DURATION / contentful_time, loading_report['contentful_script_frac']) self.assertAlmostEqual( (self._PARSING_EVENT_DURATION - self._SCRIPT_EVENT_DURATION) / contentful_time, loading_report['contentful_parsing_frac'])