1 # Copyright 2014 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.
8 from common
import network_metrics
9 from telemetry
.testing
import test_page_test_results
10 from telemetry
.timeline
import event
13 HTML_BODY
= """<!DOCTYPE HTML>
17 <div id="test"> TEST HTML</div>
20 IMAGE_BODY
= """fake image data"""
21 GZIPPED_HTML_LEN
= network_metrics
.HTTPResponse
.GetGizppedBodyLength(HTML_BODY
)
22 # Make up original content length for the image.
23 IMAGE_OCL
= 3 * len(IMAGE_BODY
)
26 class NetworkMetricTest(unittest
.TestCase
):
28 def MakeNetworkTimelineEvent(
29 url
, response_headers
, body
=None, base64_encoded_body
=False,
30 served_from_cache
=False, request_headers
=None, status
=200,
32 if not request_headers
:
34 e
= event
.TimelineEvent('network', 'HTTPResponse', 0, 0)
36 e
.args
['requestId'] = 0
37 e
.args
['response'] = {
40 'headers': response_headers
,
41 'requestHeaders': request_headers
,
42 'remotePort': remote_port
,
45 e
.args
['base64_encoded_body'] = base64_encoded_body
46 e
.args
['served_from_cache'] = served_from_cache
49 def testHTTPResponse(self
):
50 url
= 'http://test.url'
51 self
.assertLess(GZIPPED_HTML_LEN
, len(HTML_BODY
))
53 # A plain text HTML response
54 resp
= network_metrics
.HTTPResponse(self
.MakeNetworkTimelineEvent(
57 'Content-Type': 'text/html',
58 'Content-Length': str(len(HTML_BODY
)),
61 self
.assertEqual(url
, resp
.response
.url
)
62 body
, base64_encoded
= resp
.response
.GetBody()
63 self
.assertEqual(HTML_BODY
, body
)
64 self
.assertFalse(base64_encoded
)
65 self
.assertEqual('text/html', resp
.response
.GetHeader('Content-Type'))
67 self
.assertEqual(len(HTML_BODY
), resp
.content_length
)
68 self
.assertEqual(None, resp
.response
.GetHeader('Content-Encoding'))
69 self
.assertFalse(resp
.has_original_content_length
)
70 self
.assertEqual(0.0, resp
.data_saving_rate
)
72 # A gzipped HTML response
73 resp
= network_metrics
.HTTPResponse(self
.MakeNetworkTimelineEvent(
76 'Content-Type': 'text/html',
77 'Content-Encoding': 'gzip',
78 'X-Original-Content-Length': str(len(HTML_BODY
)),
81 body
, base64_encoded
= resp
.response
.GetBody()
82 self
.assertFalse(base64_encoded
)
83 self
.assertEqual(GZIPPED_HTML_LEN
, resp
.content_length
)
84 self
.assertEqual('gzip', resp
.response
.GetHeader('Content-Encoding'))
85 self
.assertTrue(resp
.has_original_content_length
)
86 self
.assertEqual(len(HTML_BODY
), resp
.original_content_length
)
88 float(len(HTML_BODY
) - GZIPPED_HTML_LEN
) / len(HTML_BODY
),
89 resp
.data_saving_rate
)
91 # A JPEG image response.
92 resp
= network_metrics
.HTTPResponse(self
.MakeNetworkTimelineEvent(
93 url
='http://test.image',
95 'Content-Type': 'image/jpeg',
96 'Content-Encoding': 'gzip',
97 'X-Original-Content-Length': str(IMAGE_OCL
),
99 body
=base64
.b64encode(IMAGE_BODY
),
100 base64_encoded_body
=True))
101 body
, base64_encoded
= resp
.response
.GetBody()
102 self
.assertTrue(base64_encoded
)
103 self
.assertEqual(IMAGE_BODY
, base64
.b64decode(body
))
104 self
.assertEqual(len(IMAGE_BODY
), resp
.content_length
)
105 self
.assertTrue(resp
.has_original_content_length
)
106 self
.assertEqual(IMAGE_OCL
, resp
.original_content_length
)
107 self
.assertFalse(resp
.response
.served_from_cache
)
108 self
.assertEqual(float(IMAGE_OCL
- len(IMAGE_BODY
)) / IMAGE_OCL
,
109 resp
.data_saving_rate
)
111 # A JPEG image response from cache.
112 resp
= network_metrics
.HTTPResponse(self
.MakeNetworkTimelineEvent(
113 url
='http://test.image',
115 'Content-Type': 'image/jpeg',
116 'Content-Encoding': 'gzip',
117 'X-Original-Content-Length': str(IMAGE_OCL
),
119 body
=base64
.b64encode(IMAGE_BODY
),
120 base64_encoded_body
=True,
121 served_from_cache
=True))
122 self
.assertEqual(len(IMAGE_BODY
), resp
.content_length
)
123 self
.assertTrue(resp
.has_original_content_length
)
124 self
.assertEqual(IMAGE_OCL
, resp
.original_content_length
)
125 # Cached resource has zero saving.
126 self
.assertTrue(resp
.response
.served_from_cache
)
127 self
.assertEqual(0.0, resp
.data_saving_rate
)
129 def testNetworkMetricResults(self
):
132 self
.MakeNetworkTimelineEvent(
133 url
='http://test.html1',
135 'Content-Type': 'text/html',
136 'Content-Length': str(len(HTML_BODY
)),
140 self
.MakeNetworkTimelineEvent(
141 url
='http://test.html2',
143 'Content-Type': 'text/html',
144 'Content-Encoding': 'gzip',
145 'X-Original-Content-Length': str(len(HTML_BODY
)),
148 # A base64 encoded image.
149 self
.MakeNetworkTimelineEvent(
150 url
='http://test.image',
152 'Content-Type': 'image/jpeg',
153 'Content-Encoding': 'gzip',
154 'X-Original-Content-Length': str(IMAGE_OCL
),
156 body
=base64
.b64encode(IMAGE_BODY
),
157 base64_encoded_body
=True),
159 metric
= network_metrics
.NetworkMetric()
160 metric
._events
= events
161 metric
.compute_data_saving
= True
163 self
.assertTrue(len(events
), len(list(metric
.IterResponses(None))))
164 results
= test_page_test_results
.TestPageTestResults(self
)
165 metric
.AddResults(None, results
)
167 cl
= len(HTML_BODY
) + GZIPPED_HTML_LEN
+ len(IMAGE_BODY
)
168 results
.AssertHasPageSpecificScalarValue('content_length', 'bytes', cl
)
170 ocl
= len(HTML_BODY
) + len(HTML_BODY
) + IMAGE_OCL
171 results
.AssertHasPageSpecificScalarValue(
172 'original_content_length', 'bytes', ocl
)
174 saving_percent
= float(ocl
- cl
) * 100/ ocl
175 results
.AssertHasPageSpecificScalarValue(
176 'data_saving', 'percent', saving_percent
)