OLD | NEW |
1 #!/usr/bin/env python | 1 #!/usr/bin/env python |
2 # Copyright (c) 2013 The Chromium Authors. All rights reserved. | 2 # Copyright (c) 2013 The Chromium Authors. All rights reserved. |
3 # Use of this source code is governed by a BSD-style license that can be | 3 # Use of this source code is governed by a BSD-style license that can be |
4 # found in the LICENSE file. | 4 # found in the LICENSE file. |
5 | 5 |
6 """Test cases for results_dashboard.""" | 6 """Test cases for results_dashboard.""" |
7 | 7 |
8 import datetime | 8 import datetime |
9 import json | 9 import json |
10 import os | 10 import os |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
47 self.build_dir = tempfile.mkdtemp() | 47 self.build_dir = tempfile.mkdtemp() |
48 os.makedirs(os.path.join(self.build_dir, results_dashboard.CACHE_DIR)) | 48 os.makedirs(os.path.join(self.build_dir, results_dashboard.CACHE_DIR)) |
49 self.cache_filename = os.path.join(self.build_dir, | 49 self.cache_filename = os.path.join(self.build_dir, |
50 results_dashboard.CACHE_DIR, | 50 results_dashboard.CACHE_DIR, |
51 results_dashboard.CACHE_FILENAME) | 51 results_dashboard.CACHE_FILENAME) |
52 | 52 |
53 def tearDown(self): | 53 def tearDown(self): |
54 self.mox.UnsetStubs() | 54 self.mox.UnsetStubs() |
55 shutil.rmtree(self.build_dir) | 55 shutil.rmtree(self.build_dir) |
56 | 56 |
57 def _SendResults(self, send_results_args, expected_new_json, errors, | 57 def _TestSendResults(self, send_results_args, expected_new_json, errors, |
58 mock_timestamp=False, webkit_master=False): | 58 mock_timestamp=False, webkit_master=False): |
59 """Test one call of SendResults with the given set of arguments. | 59 """Test one call of SendResults with the given set of arguments. |
60 | 60 |
61 Args: | 61 Args: |
62 send_results_args: The list of arguments to pass to SendResults. | 62 send_results_args: The list of arguments to pass to SendResults. |
63 expected_new_json: A list of JSON string expected to be sent. | 63 expected_new_json: A list of JSON string expected to be sent. |
64 errors: A list of corresponding errors expected to be received | 64 errors: A list of corresponding errors expected to be received |
65 (Each item in the list is either a string or None.) | 65 (Each item in the list is either a string or None.) |
66 mock_timestamp: Whether to stub out datetime with FakeDateTime(). | 66 mock_timestamp: Whether to stub out datetime with FakeDateTime(). |
67 webkit_master: Whether GetActiveMaster should give the webkit master. | 67 webkit_master: Whether GetActiveMaster should give the webkit master. |
(...skipping 22 matching lines...) Expand all Loading... |
90 if error: | 90 if error: |
91 urllib2.urlopen(IsEncodedJson(json_line)).AndRaise(error) | 91 urllib2.urlopen(IsEncodedJson(json_line)).AndRaise(error) |
92 else: | 92 else: |
93 urllib2.urlopen(IsEncodedJson(json_line)) | 93 urllib2.urlopen(IsEncodedJson(json_line)) |
94 self.mox.ReplayAll() | 94 self.mox.ReplayAll() |
95 results_dashboard.SendResults(*send_results_args) | 95 results_dashboard.SendResults(*send_results_args) |
96 self.mox.VerifyAll() | 96 self.mox.VerifyAll() |
97 | 97 |
98 def test_SingleLogLine(self): | 98 def test_SingleLogLine(self): |
99 args = [ | 99 args = [ |
100 'bar-summary.dat', | 100 { |
101 ['{"traces": {"baz": ["100.0", "5.0"]},' | 101 'bar-summary.dat': [ |
102 ' "rev": "12345", "webkit_rev": "6789", "webrtc_rev": "3456",' | 102 '{"traces": {"baz": ["100.0", "5.0"]},' |
103 ' "v8_rev": "2345"}'], | 103 ' "rev": "12345", "webkit_rev": "6789", "webrtc_rev": "3456",' |
| 104 ' "v8_rev": "2345"}' |
| 105 ], |
| 106 }, |
104 'linux-release', | 107 'linux-release', |
105 'foo', | 108 'foo', |
106 'https://chrome-perf.googleplex.com', | 109 'https://chrome-perf.googleplex.com', |
107 'chromium.perf', | 110 'chromium.perf', |
108 'XP Perf (1)', | 111 'XP Perf (1)', |
109 '7890', | 112 '7890', |
110 self.build_dir, | 113 self.build_dir, |
111 {}] | 114 {}] |
112 expected_new_json = [json.dumps([{ | 115 expected_new_json = [json.dumps([{ |
113 'master': 'ChromiumPerf', | 116 'master': 'ChromiumPerf', |
114 'bot': 'linux-release', | 117 'bot': 'linux-release', |
115 'test': 'foo/bar/baz', | 118 'test': 'foo/bar/baz', |
116 'revision': 12345, | 119 'revision': 12345, |
117 'value': '100.0', | 120 'value': '100.0', |
118 'error': '5.0', | 121 'error': '5.0', |
119 'masterid': 'chromium.perf', | 122 'masterid': 'chromium.perf', |
120 'buildername': 'XP Perf (1)', | 123 'buildername': 'XP Perf (1)', |
121 'buildnumber': '7890', | 124 'buildnumber': '7890', |
122 'supplemental_columns': { | 125 'supplemental_columns': { |
123 'r_webkit_rev': '6789', | 126 'r_webkit_rev': '6789', |
124 'r_webrtc_rev': '3456', | 127 'r_webrtc_rev': '3456', |
125 'r_v8_rev': '2345', | 128 'r_v8_rev': '2345', |
126 }}])] | 129 }}])] |
127 errors = [None] | 130 errors = [None] |
128 self._SendResults(args, expected_new_json, errors) | 131 self._TestSendResults(args, expected_new_json, errors) |
129 | 132 |
130 def test_SupplementalColumns(self): | 133 def test_SupplementalColumns(self): |
131 args = [ | 134 args = [ |
132 'bar-summary.dat', | 135 { |
133 ['{"traces": {"baz": ["100.0", "5.0"]},' | 136 'bar-summary.dat': [ |
134 ' "rev": "12345", "webkit_rev": "6789", "webrtc_rev": "3456",' | 137 '{"traces": {"baz": ["100.0", "5.0"]},' |
135 ' "v8_rev": "2345"}'], | 138 ' "rev": "12345", "webkit_rev": "6789", "webrtc_rev": "3456",' |
| 139 ' "v8_rev": "2345"}' |
| 140 ], |
| 141 }, |
136 'linux-release', | 142 'linux-release', |
137 'foo', | 143 'foo', |
138 'https://chrome-perf.googleplex.com', | 144 'https://chrome-perf.googleplex.com', |
139 'chromium.perf', | 145 'chromium.perf', |
140 'XP Perf (1)', | 146 'XP Perf (1)', |
141 '7890', self.build_dir, | 147 '7890', self.build_dir, |
142 { | 148 { |
143 'r_webkit_rev': '6789', | 149 'r_webkit_rev': '6789', |
144 'r_webrtc_rev': '3456', | 150 'r_webrtc_rev': '3456', |
145 'r_v8_rev': '2345', | 151 'r_v8_rev': '2345', |
(...skipping 11 matching lines...) Expand all Loading... |
157 'buildername': 'XP Perf (1)', | 163 'buildername': 'XP Perf (1)', |
158 'buildnumber': '7890', | 164 'buildnumber': '7890', |
159 'supplemental_columns': { | 165 'supplemental_columns': { |
160 'r_webkit_rev': '6789', | 166 'r_webkit_rev': '6789', |
161 'r_webrtc_rev': '3456', | 167 'r_webrtc_rev': '3456', |
162 'r_v8_rev': '2345', | 168 'r_v8_rev': '2345', |
163 'r_foo': 'SHA1', | 169 'r_foo': 'SHA1', |
164 'r_bar': 'SHA2', | 170 'r_bar': 'SHA2', |
165 }}])] | 171 }}])] |
166 errors = [None] | 172 errors = [None] |
167 self._SendResults(args, expected_new_json, errors) | 173 self._TestSendResults(args, expected_new_json, errors) |
168 | 174 |
169 def test_UnitsLogLine(self): | 175 def test_UnitsLogLine(self): |
170 args = [ | 176 args = [ |
171 'bar-summary.dat', | 177 { |
172 ['{"traces": {"baz": ["100.0", "5.0"]},' | 178 'bar-summary.dat': [ |
173 ' "rev": "12345", "webkit_rev": "6789", "webrtc_rev": "3456", ' | 179 '{"traces": {"baz": ["100.0", "5.0"]},' |
174 ' "v8_rev": "2345", "units": "ms"}', | 180 ' "rev": "12345", "webkit_rev": "6789", "webrtc_rev": "3456", ' |
175 '{"traces": {"bam": ["100.0", "5.0"]},' | 181 ' "v8_rev": "2345", "units": "ms"}', |
176 ' "rev": "12345", "webkit_rev": "6789", "webrtc_rev": "3456", ' | 182 '{"traces": {"bam": ["100.0", "5.0"]},' |
177 ' "v8_rev": "2345", "units": ""}'], | 183 ' "rev": "12345", "webkit_rev": "6789", "webrtc_rev": "3456", ' |
| 184 ' "v8_rev": "2345", "units": ""}' |
| 185 ], |
| 186 }, |
178 'linux-release', | 187 'linux-release', |
179 'foo', | 188 'foo', |
180 'https://chrome-perf.googleplex.com', | 189 'https://chrome-perf.googleplex.com', |
181 'chromium.perf', | 190 'chromium.perf', |
182 'XP Perf (1)', | 191 'XP Perf (1)', |
183 '7890', | 192 '7890', |
184 self.build_dir, | 193 self.build_dir, |
185 {}] | 194 {}] |
186 expected_new_json = [json.dumps([{ | 195 expected_new_json = [json.dumps([{ |
187 'master': 'ChromiumPerf', | 196 'master': 'ChromiumPerf', |
(...skipping 19 matching lines...) Expand all Loading... |
207 'error': '5.0', | 216 'error': '5.0', |
208 'masterid': 'chromium.perf', | 217 'masterid': 'chromium.perf', |
209 'buildername': 'XP Perf (1)', | 218 'buildername': 'XP Perf (1)', |
210 'buildnumber': '7890', | 219 'buildnumber': '7890', |
211 'supplemental_columns': { | 220 'supplemental_columns': { |
212 'r_webkit_rev': '6789', | 221 'r_webkit_rev': '6789', |
213 'r_webrtc_rev': '3456', | 222 'r_webrtc_rev': '3456', |
214 'r_v8_rev': '2345', | 223 'r_v8_rev': '2345', |
215 }}])] | 224 }}])] |
216 errors = [None] | 225 errors = [None] |
217 self._SendResults(args, expected_new_json, errors) | 226 self._TestSendResults(args, expected_new_json, errors) |
218 | 227 |
219 def test_ImportantLogLine(self): | 228 def test_ImportantLogLine(self): |
220 args = [ | 229 args = [ |
221 'bar-summary.dat', | 230 { |
222 ['{"traces": {"one": ["1.0", "5.0"], "two": ["2.0", "0.0"]},' | 231 'bar-summary.dat': [ |
223 ' "rev": "12345", "webkit_rev": "6789", "webrtc_rev": "3456",' | 232 '{"traces": {"one": ["1.0", "5.0"], "two": ["2.0", "0.0"]},' |
224 ' "v8_rev": "2345", "units": "ms", ' | 233 ' "rev": "12345", "webkit_rev": "6789", "webrtc_rev": "3456",' |
225 '"important": ["one"]}'], | 234 ' "v8_rev": "2345", "units": "ms", ' |
| 235 '"important": ["one"]}' |
| 236 ], |
| 237 }, |
226 'linux-release', | 238 'linux-release', |
227 'foo', | 239 'foo', |
228 'https://chrome-perf.googleplex.com', | 240 'https://chrome-perf.googleplex.com', |
229 'chromium.perf', | 241 'chromium.perf', |
230 'XP Perf (1)', | 242 'XP Perf (1)', |
231 '7890', | 243 '7890', |
232 self.build_dir, | 244 self.build_dir, |
233 {}] | 245 {}] |
234 expected_new_json = [json.dumps([{ | 246 expected_new_json = [json.dumps([{ |
235 'master': 'ChromiumPerf', | 247 'master': 'ChromiumPerf', |
(...skipping 21 matching lines...) Expand all Loading... |
257 'units': 'ms', | 269 'units': 'ms', |
258 'masterid': 'chromium.perf', | 270 'masterid': 'chromium.perf', |
259 'buildername': 'XP Perf (1)', | 271 'buildername': 'XP Perf (1)', |
260 'buildnumber': '7890', | 272 'buildnumber': '7890', |
261 'supplemental_columns': { | 273 'supplemental_columns': { |
262 'r_webkit_rev': '6789', | 274 'r_webkit_rev': '6789', |
263 'r_webrtc_rev': '3456', | 275 'r_webrtc_rev': '3456', |
264 'r_v8_rev': '2345', | 276 'r_v8_rev': '2345', |
265 }}])] | 277 }}])] |
266 errors = [None] | 278 errors = [None] |
267 self._SendResults(args, expected_new_json, errors) | 279 self._TestSendResults(args, expected_new_json, errors) |
268 | 280 |
269 def test_MultipleLogLines(self): | 281 def test_MultipleLogLines(self): |
270 args = [ | 282 args = [ |
271 'bar-summary.dat', [ | 283 { |
272 '{"traces": {"baz": ["100.0", "5.0"]},' | 284 'bar-summary.dat': [ |
273 ' "rev": "12345", "webkit_rev": "6789", "webrtc_rev": "3456",' | 285 '{"traces": {"baz": ["100.0", "5.0"]},' |
274 ' "v8_rev": "2345"}', | 286 ' "rev": "12345", "webkit_rev": "6789", "webrtc_rev": "3456",' |
275 '{"traces": {"box": ["101.0", "4.0"]},' | 287 ' "v8_rev": "2345"}', |
276 ' "rev": "12345", "webkit_rev": "6789", "webrtc_rev": "3456",' | 288 '{"traces": {"box": ["101.0", "4.0"]},' |
277 ' "v8_rev": "2345"}'], | 289 ' "rev": "12345", "webkit_rev": "6789", "webrtc_rev": "3456",' |
| 290 ' "v8_rev": "2345"}' |
| 291 ], |
| 292 }, |
278 'linux-release', | 293 'linux-release', |
279 'foo', | 294 'foo', |
280 'https://chrome-perf.googleplex.com', | 295 'https://chrome-perf.googleplex.com', |
281 'chromium.perf', | 296 'chromium.perf', |
282 'XP Perf (1)', | 297 'XP Perf (1)', |
283 '7890', | 298 '7890', |
284 self.build_dir, | 299 self.build_dir, |
285 {}] | 300 {}] |
286 expected_new_json = [json.dumps([{ | 301 expected_new_json = [json.dumps([{ |
287 'master': 'ChromiumPerf', | 302 'master': 'ChromiumPerf', |
(...skipping 18 matching lines...) Expand all Loading... |
306 'error': '4.0', | 321 'error': '4.0', |
307 'masterid': 'chromium.perf', | 322 'masterid': 'chromium.perf', |
308 'buildername': 'XP Perf (1)', | 323 'buildername': 'XP Perf (1)', |
309 'buildnumber': '7890', | 324 'buildnumber': '7890', |
310 'supplemental_columns': { | 325 'supplemental_columns': { |
311 'r_webkit_rev': '6789', | 326 'r_webkit_rev': '6789', |
312 'r_webrtc_rev': '3456', | 327 'r_webrtc_rev': '3456', |
313 'r_v8_rev': '2345', | 328 'r_v8_rev': '2345', |
314 }}])] | 329 }}])] |
315 errors = [None] | 330 errors = [None] |
316 self._SendResults(args, expected_new_json, errors) | 331 self._TestSendResults(args, expected_new_json, errors) |
317 | 332 |
318 def test_ModifiedTraceNames(self): | 333 def test_ModifiedTraceNames(self): |
319 args = [ | 334 args = [ |
320 'bar-summary.dat', | 335 { |
321 ['{"traces": {"bar": ["100.0", "5.0"], "bar_ref": ["99.0", "2.0"],' | 336 'bar-summary.dat': [ |
322 ' "baz/y": ["101.0", "3.0"], "notchanged": ["102.0", "1.0"]},' | 337 '{"traces": {"bar": ["100.0", "5.0"],' |
323 ' "rev": "12345", "webkit_rev": "6789", "webrtc_rev": "3456",' | 338 ' "bar_ref": ["99.0", "2.0"],' |
324 ' "v8_rev": "2345"}'], | 339 ' "baz/y": ["101.0", "3.0"], "notchanged": ["102.0", "1.0"]},' |
| 340 ' "rev": "12345", "webkit_rev": "6789", "webrtc_rev": "3456",' |
| 341 ' "v8_rev": "2345"}' |
| 342 ], |
| 343 }, |
325 'linux-release', | 344 'linux-release', |
326 'foo', | 345 'foo', |
327 'https://chrome-perf.googleplex.com', | 346 'https://chrome-perf.googleplex.com', |
328 'chromium.perf', | 347 'chromium.perf', |
329 'XP Perf (1)', | 348 'XP Perf (1)', |
330 '7890', | 349 '7890', |
331 self.build_dir, | 350 self.build_dir, |
332 {}] | 351 {}] |
333 expected_new_json = [json.dumps([{ | 352 expected_new_json = [json.dumps([{ |
334 'master': 'ChromiumPerf', | 353 'master': 'ChromiumPerf', |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
381 'error': '1.0', | 400 'error': '1.0', |
382 'masterid': 'chromium.perf', | 401 'masterid': 'chromium.perf', |
383 'buildername': 'XP Perf (1)', | 402 'buildername': 'XP Perf (1)', |
384 'buildnumber': '7890', | 403 'buildnumber': '7890', |
385 'supplemental_columns': { | 404 'supplemental_columns': { |
386 'r_webkit_rev': '6789', | 405 'r_webkit_rev': '6789', |
387 'r_webrtc_rev': '3456', | 406 'r_webrtc_rev': '3456', |
388 'r_v8_rev': '2345', | 407 'r_v8_rev': '2345', |
389 }}])] | 408 }}])] |
390 errors = [None] | 409 errors = [None] |
391 self._SendResults(args, expected_new_json, errors) | 410 self._TestSendResults(args, expected_new_json, errors) |
392 | 411 |
393 def test_MultiValueRowUpload(self): | 412 def test_MultiValueRowUpload(self): |
394 args = [ | 413 args = [ |
395 'my_endure_graph-summary.dat', | 414 { |
396 ['{"traces": {' | 415 'my_endure_graph-summary.dat': [ |
397 '"total_dom_nodes": [["10", "123"], ["20.5", "234"]],' | 416 '{"traces": {' |
398 '"event_listeners": [["10", "12"], ["20.5", "40"]]},' | 417 '"total_dom_nodes": [["10", "123"], ["20.5", "234"]],' |
399 ' "rev": "12345",' | 418 '"event_listeners": [["10", "12"], ["20.5", "40"]]},' |
400 ' "webkit_rev": "6789",' | 419 ' "rev": "12345",' |
401 ' "webrtc_rev": "3456",' | 420 ' "webkit_rev": "6789",' |
402 ' "v8_rev": "2345",' | 421 ' "webrtc_rev": "3456",' |
403 ' "units": "count",' | 422 ' "v8_rev": "2345",' |
404 ' "units_x": "seconds",' | 423 ' "units": "count",' |
405 ' "stack": false}'], | 424 ' "units_x": "seconds",' |
| 425 ' "stack": false}' |
| 426 ], |
| 427 }, |
406 'linux-release', | 428 'linux-release', |
407 'endure/test_name', | 429 'endure/test_name', |
408 'https://chrome-perf.googleplex.com', | 430 'https://chrome-perf.googleplex.com', |
409 'chromium.perf', | 431 'chromium.perf', |
410 'Linux (1)', | 432 'Linux (1)', |
411 '1234', | 433 '1234', |
412 self.build_dir, | 434 self.build_dir, |
413 {}] | 435 {}] |
414 expected_new_json = [json.dumps([{ | 436 expected_new_json = [json.dumps([{ |
415 'master': 'ChromiumPerf', | 437 'master': 'ChromiumPerf', |
(...skipping 20 matching lines...) Expand all Loading... |
436 'buildername': 'Linux (1)', | 458 'buildername': 'Linux (1)', |
437 'buildnumber': '1234', | 459 'buildnumber': '1234', |
438 'units': 'count', | 460 'units': 'count', |
439 'units_x': 'seconds', | 461 'units_x': 'seconds', |
440 'supplemental_columns': { | 462 'supplemental_columns': { |
441 'r_webkit_rev': '6789', | 463 'r_webkit_rev': '6789', |
442 'r_webrtc_rev': '3456', | 464 'r_webrtc_rev': '3456', |
443 'r_v8_rev': '2345' | 465 'r_v8_rev': '2345' |
444 }}])] | 466 }}])] |
445 errors = [None, None] | 467 errors = [None, None] |
446 self._SendResults(args, expected_new_json, errors) | 468 self._TestSendResults(args, expected_new_json, errors) |
447 | 469 |
448 def test_ByUrlGraph(self): | 470 def test_ByUrlGraph(self): |
449 args = [ | 471 args = [ |
450 'bar_by_url-summary.dat', | 472 { |
451 ['{"traces": {"baz": ["100.0", "5.0"]},' | 473 'bar_by_url-summary.dat': [ |
452 ' "rev": "12345", "webkit_rev": "6789", "webrtc_rev": "3456",' | 474 '{"traces": {"baz": ["100.0", "5.0"]},' |
453 '"v8_rev": "2345"}'], | 475 ' "rev": "12345", "webkit_rev": "6789", "webrtc_rev": "3456",' |
| 476 '"v8_rev": "2345"}' |
| 477 ], |
| 478 }, |
454 'linux-release', | 479 'linux-release', |
455 'foo', | 480 'foo', |
456 'https://chrome-perf.googleplex.com', | 481 'https://chrome-perf.googleplex.com', |
457 'chromium.perf', | 482 'chromium.perf', |
458 'XP Perf (1)', | 483 'XP Perf (1)', |
459 '7890', | 484 '7890', |
460 self.build_dir, | 485 self.build_dir, |
461 {}] | 486 {}] |
462 expected_new_json = [json.dumps([{ | 487 expected_new_json = [json.dumps([{ |
463 'master': 'ChromiumPerf', | 488 'master': 'ChromiumPerf', |
464 'bot': 'linux-release', | 489 'bot': 'linux-release', |
465 'test': 'foo/bar/baz', | 490 'test': 'foo/bar/baz', |
466 'revision': 12345, | 491 'revision': 12345, |
467 'value': '100.0', | 492 'value': '100.0', |
468 'error': '5.0', | 493 'error': '5.0', |
469 'masterid': 'chromium.perf', | 494 'masterid': 'chromium.perf', |
470 'buildername': 'XP Perf (1)', | 495 'buildername': 'XP Perf (1)', |
471 'buildnumber': '7890', | 496 'buildnumber': '7890', |
472 'supplemental_columns': { | 497 'supplemental_columns': { |
473 'r_webkit_rev': '6789', | 498 'r_webkit_rev': '6789', |
474 'r_webrtc_rev': '3456', | 499 'r_webrtc_rev': '3456', |
475 'r_v8_rev': '2345', | 500 'r_v8_rev': '2345', |
476 }}])] | 501 }}])] |
477 errors = [None] | 502 errors = [None] |
478 self._SendResults(args, expected_new_json, errors) | 503 self._TestSendResults(args, expected_new_json, errors) |
479 | 504 |
480 def test_GitHashToTimestamp(self): | 505 def test_GitHashToTimestamp(self): |
481 args = [ | 506 args = [ |
482 'mean_frame_time-summary.dat', | 507 { |
483 ['{"traces": {"mean_frame_time": ["77.0964285714", "138.142773233"]},' | 508 'mean_frame_time-summary.dat': [ |
484 ' "rev": "2eca27b067e3e57c70e40b8b95d0030c5d7c1a7f",' | 509 '{"traces":' |
485 ' "webkit_rev": "bf9aa8d62561bb2e4d7bc09e9d9e8c6a665ddc88",' | 510 ' {"mean_frame_time": ["77.0964285714", "138.142773233"]},' |
486 ' "webrtc_rev": "bf9aa8d62561bb2e4d7bc09e9d9e8c6a665ddc86",' | 511 ' "rev": "2eca27b067e3e57c70e40b8b95d0030c5d7c1a7f",' |
487 ' "v8_rev": "bf9aa8d62561bb2e4d7bc09e9d9e8c6a665ddc87",' | 512 ' "webkit_rev": "bf9aa8d62561bb2e4d7bc09e9d9e8c6a665ddc88",' |
488 ' "ver": "undefined", "chan": "undefined", "units": "ms",' | 513 ' "webrtc_rev": "bf9aa8d62561bb2e4d7bc09e9d9e8c6a665ddc86",' |
489 ' "important": ["mean_frame_time"]}'], | 514 ' "v8_rev": "bf9aa8d62561bb2e4d7bc09e9d9e8c6a665ddc87",' |
| 515 ' "ver": "undefined", "chan": "undefined", "units": "ms",' |
| 516 ' "important": ["mean_frame_time"]}' |
| 517 ], |
| 518 }, |
490 'linux-release', | 519 'linux-release', |
491 'smoothness_measurement', | 520 'smoothness_measurement', |
492 'https://chrome-perf.googleplex.com', | 521 'https://chrome-perf.googleplex.com', |
493 'chromium.perf', | 522 'chromium.perf', |
494 'Linux (1)', | 523 'Linux (1)', |
495 '1234', | 524 '1234', |
496 self.build_dir, | 525 self.build_dir, |
497 {}] | 526 {}] |
498 expected_new_json = [json.dumps([{ | 527 expected_new_json = [json.dumps([{ |
499 'master': 'ChromiumPerf', | 528 'master': 'ChromiumPerf', |
500 'bot': 'linux-release', | 529 'bot': 'linux-release', |
501 'test': 'smoothness_measurement/mean_frame_time', | 530 'test': 'smoothness_measurement/mean_frame_time', |
502 'revision': 1375315200, | 531 'revision': 1375315200, |
503 'value': '77.0964285714', | 532 'value': '77.0964285714', |
504 'error': '138.142773233', | 533 'error': '138.142773233', |
505 'masterid': 'chromium.perf', | 534 'masterid': 'chromium.perf', |
506 'buildername': 'Linux (1)', | 535 'buildername': 'Linux (1)', |
507 'buildnumber': '1234', | 536 'buildnumber': '1234', |
508 'important': True, | 537 'important': True, |
509 'units': 'ms', | 538 'units': 'ms', |
510 'supplemental_columns': { | 539 'supplemental_columns': { |
511 'r_chromium': '2eca27b067e3e57c70e40b8b95d0030c5d7c1a7f', | 540 'r_chromium': '2eca27b067e3e57c70e40b8b95d0030c5d7c1a7f', |
512 'r_webkit_rev': 'bf9aa8d62561bb2e4d7bc09e9d9e8c6a665ddc88', | 541 'r_webkit_rev': 'bf9aa8d62561bb2e4d7bc09e9d9e8c6a665ddc88', |
513 'r_webrtc_rev': 'bf9aa8d62561bb2e4d7bc09e9d9e8c6a665ddc86', | 542 'r_webrtc_rev': 'bf9aa8d62561bb2e4d7bc09e9d9e8c6a665ddc86', |
514 'r_v8_rev': 'bf9aa8d62561bb2e4d7bc09e9d9e8c6a665ddc87', | 543 'r_v8_rev': 'bf9aa8d62561bb2e4d7bc09e9d9e8c6a665ddc87', |
515 }}])] | 544 }}])] |
516 errors = [None] | 545 errors = [None] |
517 self._SendResults(args, expected_new_json, errors, mock_timestamp=True) | 546 self._TestSendResults(args, expected_new_json, errors, mock_timestamp=True) |
518 | 547 |
519 def test_WebkitUsesTimestamp(self): | 548 def test_WebkitUsesTimestamp(self): |
520 args = [ | 549 args = [ |
521 'mean_frame_time-summary.dat', | 550 { |
522 ['{"traces": {"mean_frame_time": ["77.0964285714", "138.142773233"]},' | 551 'mean_frame_time-summary.dat': [ |
523 ' "rev": "12345",' | 552 '{"traces":' |
524 ' "webkit_rev": "23456",' | 553 ' {"mean_frame_time": ["77.0964285714", "138.142773233"]},' |
525 ' "webrtc_rev": "3456",' | 554 ' "rev": "12345",' |
526 ' "v8_rev": "34567",' | 555 ' "webkit_rev": "23456",' |
527 ' "ver": "undefined", "chan": "undefined", "units": "ms",' | 556 ' "webrtc_rev": "3456",' |
528 ' "important": ["mean_frame_time"]}'], | 557 ' "v8_rev": "34567",' |
| 558 ' "ver": "undefined", "chan": "undefined", "units": "ms",' |
| 559 ' "important": ["mean_frame_time"]}' |
| 560 ], |
| 561 }, |
529 'linux-release', | 562 'linux-release', |
530 'smoothness_measurement', | 563 'smoothness_measurement', |
531 'https://chrome-perf.googleplex.com', | 564 'https://chrome-perf.googleplex.com', |
532 'chromium.webkit', | 565 'chromium.webkit', |
533 'Linux (1)', | 566 'Linux (1)', |
534 '1234', | 567 '1234', |
535 self.build_dir, | 568 self.build_dir, |
536 {}] | 569 {}] |
537 expected_new_json = [json.dumps([{ | 570 expected_new_json = [json.dumps([{ |
538 'master': 'ChromiumWebkit', | 571 'master': 'ChromiumWebkit', |
539 'bot': 'linux-release', | 572 'bot': 'linux-release', |
540 'test': 'smoothness_measurement/mean_frame_time', | 573 'test': 'smoothness_measurement/mean_frame_time', |
541 'revision': 1375315200, | 574 'revision': 1375315200, |
542 'value': '77.0964285714', | 575 'value': '77.0964285714', |
543 'error': '138.142773233', | 576 'error': '138.142773233', |
544 'masterid': 'chromium.webkit', | 577 'masterid': 'chromium.webkit', |
545 'buildername': 'Linux (1)', | 578 'buildername': 'Linux (1)', |
546 'buildnumber': '1234', | 579 'buildnumber': '1234', |
547 'important': True, | 580 'important': True, |
548 'units': 'ms', | 581 'units': 'ms', |
549 'supplemental_columns': { | 582 'supplemental_columns': { |
550 'r_chromium_svn': 12345, | 583 'r_chromium_svn': 12345, |
551 'r_webkit_rev': '23456', | 584 'r_webkit_rev': '23456', |
552 'r_webrtc_rev': '3456', | 585 'r_webrtc_rev': '3456', |
553 'r_v8_rev': '34567', | 586 'r_v8_rev': '34567', |
554 }}])] | 587 }}])] |
555 errors = [None] | 588 errors = [None] |
556 self._SendResults(args, expected_new_json, errors, mock_timestamp=True, | 589 self._TestSendResults(args, expected_new_json, errors, mock_timestamp=True, |
557 webkit_master=True) | 590 webkit_master=True) |
558 | 591 |
559 def test_FailureRetried(self): | 592 def test_FailureRetried(self): |
560 args = [ | 593 args = [ |
561 'bar-summary.dat', | 594 { |
562 ['{"traces": {"baz": ["100.0", "5.0"]},' | 595 'bar-summary.dat': [ |
563 ' "rev": "12345", "webkit_rev": "6789", "webrtc_rev": "3456",' | 596 '{"traces": {"baz": ["100.0", "5.0"]},' |
564 ' "v8_rev": "2345"}'], | 597 ' "rev": "12345", "webkit_rev": "6789", "webrtc_rev": "3456",' |
| 598 ' "v8_rev": "2345"}' |
| 599 ], |
| 600 }, |
565 'linux-release', | 601 'linux-release', |
566 'foo', | 602 'foo', |
567 'https://chrome-perf.googleplex.com', | 603 'https://chrome-perf.googleplex.com', |
568 'chromium.perf', | 604 'chromium.perf', |
569 'XP Perf (1)', | 605 'XP Perf (1)', |
570 '7890', | 606 '7890', |
571 self.build_dir, | 607 self.build_dir, |
572 {}] | 608 {}] |
573 expected_new_json = [json.dumps([{ | 609 expected_new_json = [json.dumps([{ |
574 'master': 'ChromiumPerf', | 610 'master': 'ChromiumPerf', |
575 'bot': 'linux-release', | 611 'bot': 'linux-release', |
576 'test': 'foo/bar/baz', | 612 'test': 'foo/bar/baz', |
577 'revision': 12345, | 613 'revision': 12345, |
578 'value': '100.0', | 614 'value': '100.0', |
579 'error': '5.0', | 615 'error': '5.0', |
580 'masterid': 'chromium.perf', | 616 'masterid': 'chromium.perf', |
581 'buildername': 'XP Perf (1)', | 617 'buildername': 'XP Perf (1)', |
582 'buildnumber': '7890', | 618 'buildnumber': '7890', |
583 'supplemental_columns': { | 619 'supplemental_columns': { |
584 'r_webkit_rev': '6789', | 620 'r_webkit_rev': '6789', |
585 'r_webrtc_rev': '3456', | 621 'r_webrtc_rev': '3456', |
586 'r_v8_rev': '2345', | 622 'r_v8_rev': '2345', |
587 }}])] | 623 }}])] |
588 errors = [urllib2.URLError('reason')] | 624 errors = [urllib2.URLError('reason')] |
589 self._SendResults(args, expected_new_json, errors) | 625 self._TestSendResults(args, expected_new_json, errors) |
590 args2 = [ | 626 args2 = [ |
591 'bar-summary.dat', | 627 { |
592 ['{"traces": {"baz": ["101.0", "6.0"]},' | 628 'bar-summary.dat': [ |
593 ' "rev": "12346", "webkit_rev": "6790", "webrtc_rev": "3456",' | 629 '{"traces": {"baz": ["101.0", "6.0"]},' |
594 ' "v8_rev": "2345"}'], | 630 ' "rev": "12346", "webkit_rev": "6790", "webrtc_rev": "3456",' |
| 631 ' "v8_rev": "2345"}' |
| 632 ], |
| 633 }, |
595 'linux-release', | 634 'linux-release', |
596 'foo', | 635 'foo', |
597 'https://chrome-perf.googleplex.com', | 636 'https://chrome-perf.googleplex.com', |
598 'chromium.perf', | 637 'chromium.perf', |
599 'XP Perf (1)', | 638 'XP Perf (1)', |
600 '7890', | 639 '7890', |
601 self.build_dir, | 640 self.build_dir, |
602 {}] | 641 {}] |
603 expected_new_json.append(json.dumps([{ | 642 expected_new_json.append(json.dumps([{ |
604 'master': 'ChromiumPerf', | 643 'master': 'ChromiumPerf', |
605 'bot': 'linux-release', | 644 'bot': 'linux-release', |
606 'test': 'foo/bar/baz', | 645 'test': 'foo/bar/baz', |
607 'revision': 12346, | 646 'revision': 12346, |
608 'value': '101.0', | 647 'value': '101.0', |
609 'error': '6.0', | 648 'error': '6.0', |
610 'masterid': 'chromium.perf', | 649 'masterid': 'chromium.perf', |
611 'buildername': 'XP Perf (1)', | 650 'buildername': 'XP Perf (1)', |
612 'buildnumber': '7890', | 651 'buildnumber': '7890', |
613 'supplemental_columns': { | 652 'supplemental_columns': { |
614 'r_webkit_rev': '6790', | 653 'r_webkit_rev': '6790', |
615 'r_webrtc_rev': '3456', | 654 'r_webrtc_rev': '3456', |
616 'r_v8_rev': '2345', | 655 'r_v8_rev': '2345', |
617 } | 656 } |
618 }])) | 657 }])) |
619 errors = [None, None] | 658 errors = [None, None] |
620 self._SendResults(args2, expected_new_json, errors) | 659 self._TestSendResults(args2, expected_new_json, errors) |
621 | 660 |
622 def test_SuccessNotRetried(self): | 661 def test_SuccessNotRetried(self): |
623 args = [ | 662 args = [ |
624 'bar-summary.dat', | 663 { |
625 ['{"traces": {"baz": ["100.0", "5.0"]},' | 664 'bar-summary.dat': [ |
626 ' "rev": "12345", "webkit_rev": "6789", "webrtc_rev": "3456",' | 665 '{"traces": {"baz": ["100.0", "5.0"]},' |
627 ' "v8_rev": "2345"}'], | 666 ' "rev": "12345", "webkit_rev": "6789", "webrtc_rev": "3456",' |
| 667 ' "v8_rev": "2345"}' |
| 668 ], |
| 669 }, |
628 'linux-release', | 670 'linux-release', |
629 'foo', | 671 'foo', |
630 'https://chrome-perf.googleplex.com', | 672 'https://chrome-perf.googleplex.com', |
631 'chromium.perf', | 673 'chromium.perf', |
632 'XP Perf (1)', | 674 'XP Perf (1)', |
633 '7890', | 675 '7890', |
634 self.build_dir, | 676 self.build_dir, |
635 {}] | 677 {}] |
636 expected_new_json = [json.dumps([{ | 678 expected_new_json = [json.dumps([{ |
637 'master': 'ChromiumPerf', | 679 'master': 'ChromiumPerf', |
638 'bot': 'linux-release', | 680 'bot': 'linux-release', |
639 'test': 'foo/bar/baz', | 681 'test': 'foo/bar/baz', |
640 'revision': 12345, | 682 'revision': 12345, |
641 'value': '100.0', | 683 'value': '100.0', |
642 'error': '5.0', | 684 'error': '5.0', |
643 'masterid': 'chromium.perf', | 685 'masterid': 'chromium.perf', |
644 'buildername': 'XP Perf (1)', | 686 'buildername': 'XP Perf (1)', |
645 'buildnumber': '7890', | 687 'buildnumber': '7890', |
646 'supplemental_columns': { | 688 'supplemental_columns': { |
647 'r_webkit_rev': '6789', | 689 'r_webkit_rev': '6789', |
648 'r_webrtc_rev': '3456', | 690 'r_webrtc_rev': '3456', |
649 'r_v8_rev': '2345', | 691 'r_v8_rev': '2345', |
650 }}])] | 692 }}])] |
651 errors = [None] | 693 errors = [None] |
652 self._SendResults(args, expected_new_json, errors) | 694 self._TestSendResults(args, expected_new_json, errors) |
653 args2 = [ | 695 args2 = [ |
654 'bar-summary.dat', | 696 { |
655 ['{"traces": {"baz": ["101.0", "6.0"]},' | 697 'bar-summary.dat': [ |
656 ' "rev": "12346", "webkit_rev": "6790", "webrtc_rev": "3456",' | 698 '{"traces": {"baz": ["101.0", "6.0"]},' |
657 ' "v8_rev": "2345"}'], | 699 ' "rev": "12346", "webkit_rev": "6790", "webrtc_rev": "3456",' |
| 700 ' "v8_rev": "2345"}' |
| 701 ], |
| 702 }, |
658 'linux-release', | 703 'linux-release', |
659 'foo', | 704 'foo', |
660 'https://chrome-perf.googleplex.com', | 705 'https://chrome-perf.googleplex.com', |
661 'chromium.perf', | 706 'chromium.perf', |
662 'XP Perf (1)', | 707 'XP Perf (1)', |
663 '7890', | 708 '7890', |
664 self.build_dir, | 709 self.build_dir, |
665 {}] | 710 {}] |
666 expected_new_json2 = [json.dumps([{ | 711 expected_new_json2 = [json.dumps([{ |
667 'master': 'ChromiumPerf', | 712 'master': 'ChromiumPerf', |
668 'bot': 'linux-release', | 713 'bot': 'linux-release', |
669 'test': 'foo/bar/baz', | 714 'test': 'foo/bar/baz', |
670 'revision': 12346, | 715 'revision': 12346, |
671 'value': '101.0', | 716 'value': '101.0', |
672 'error': '6.0', | 717 'error': '6.0', |
673 'masterid': 'chromium.perf', | 718 'masterid': 'chromium.perf', |
674 'buildername': 'XP Perf (1)', | 719 'buildername': 'XP Perf (1)', |
675 'buildnumber': '7890', | 720 'buildnumber': '7890', |
676 'supplemental_columns': { | 721 'supplemental_columns': { |
677 'r_webkit_rev': '6790', | 722 'r_webkit_rev': '6790', |
678 'r_webrtc_rev': '3456', | 723 'r_webrtc_rev': '3456', |
679 'r_v8_rev': '2345', | 724 'r_v8_rev': '2345', |
680 } | 725 } |
681 }])] | 726 }])] |
682 errors = [None] | 727 errors = [None] |
683 self._SendResults(args2, expected_new_json2, errors) | 728 self._TestSendResults(args2, expected_new_json2, errors) |
684 | 729 |
685 def test_FailureCached(self): | 730 def test_FailureCached(self): |
686 args = [ | 731 args = [ |
687 'bar-summary.dat', | 732 { |
688 ['{"traces": {"baz": ["100.0", "5.0"]},' | 733 'bar-summary.dat': [ |
689 ' "rev": "12345", "webkit_rev": "6789", "webrtc_rev": "3456",' | 734 '{"traces": {"baz": ["100.0", "5.0"]},' |
690 ' "v8_rev": "2345"}'], | 735 ' "rev": "12345", "webkit_rev": "6789", "webrtc_rev": "3456",' |
| 736 ' "v8_rev": "2345"}' |
| 737 ], |
| 738 }, |
691 'linux-release', | 739 'linux-release', |
692 'foo', | 740 'foo', |
693 'https://chrome-perf.googleplex.com', | 741 'https://chrome-perf.googleplex.com', |
694 'chromium.perf', | 742 'chromium.perf', |
695 'XP Perf (1)', | 743 'XP Perf (1)', |
696 '7890', | 744 '7890', |
697 self.build_dir, | 745 self.build_dir, |
698 {}] | 746 {}] |
699 expected_new_json = [json.dumps([{ | 747 expected_new_json = [json.dumps([{ |
700 'master': 'ChromiumPerf', | 748 'master': 'ChromiumPerf', |
701 'bot': 'linux-release', | 749 'bot': 'linux-release', |
702 'test': 'foo/bar/baz', | 750 'test': 'foo/bar/baz', |
703 'revision': 12345, | 751 'revision': 12345, |
704 'value': '100.0', | 752 'value': '100.0', |
705 'error': '5.0', | 753 'error': '5.0', |
706 'masterid': 'chromium.perf', | 754 'masterid': 'chromium.perf', |
707 'buildername': 'XP Perf (1)', | 755 'buildername': 'XP Perf (1)', |
708 'buildnumber': '7890', | 756 'buildnumber': '7890', |
709 'supplemental_columns': { | 757 'supplemental_columns': { |
710 'r_webkit_rev': '6789', | 758 'r_webkit_rev': '6789', |
711 'r_webrtc_rev': '3456', | 759 'r_webrtc_rev': '3456', |
712 'r_v8_rev': '2345', | 760 'r_v8_rev': '2345', |
713 }}])] | 761 }}])] |
714 errors = [urllib2.URLError('reason')] | 762 errors = [urllib2.URLError('reason')] |
715 self._SendResults(args, expected_new_json, errors) | 763 self._TestSendResults(args, expected_new_json, errors) |
716 cache_file = open(self.cache_filename, 'rb') | 764 cache_file = open(self.cache_filename, 'rb') |
717 actual_cache = cache_file.read() | 765 actual_cache = cache_file.read() |
718 cache_file.close() | 766 cache_file.close() |
719 # Compare the dicts loaded from the JSON instead of the actual JSON string, | 767 # Compare the dicts loaded from the JSON instead of the actual JSON string, |
720 # because the order of the fields in the string doesn't matter. | 768 # because the order of the fields in the string doesn't matter. |
721 self.assertEqual(json.loads(expected_new_json[0]), json.loads(actual_cache)) | 769 self.assertEqual(json.loads(expected_new_json[0]), json.loads(actual_cache)) |
722 | 770 |
723 def test_NoResendAfterMultipleErrors(self): | 771 def test_NoResendAfterMultipleErrors(self): |
724 previous_lines = '\n'.join([ | 772 previous_lines = '\n'.join([ |
725 json.dumps([{ | 773 json.dumps([{ |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
765 'supplemental_columns': { | 813 'supplemental_columns': { |
766 'r_webkit_rev': '6789', | 814 'r_webkit_rev': '6789', |
767 'r_webrtc_rev': '3456', | 815 'r_webrtc_rev': '3456', |
768 'r_v8_rev': '2345', | 816 'r_v8_rev': '2345', |
769 }}]) | 817 }}]) |
770 ]) | 818 ]) |
771 cache_file = open(self.cache_filename, 'wb') | 819 cache_file = open(self.cache_filename, 'wb') |
772 cache_file.write(previous_lines) | 820 cache_file.write(previous_lines) |
773 cache_file.close() | 821 cache_file.close() |
774 args = [ | 822 args = [ |
775 'bar-summary.dat', | 823 { |
776 ['{"traces": {"baz": ["102.0", "5.0"]},' | 824 'bar-summary.dat': [ |
777 ' "rev": "12348", "webkit_rev": "6789", "v8_rev": "2345"}'], | 825 '{"traces": {"baz": ["102.0", "5.0"]},' |
| 826 ' "rev": "12348", "webkit_rev": "6789", "v8_rev": "2345"}' |
| 827 ], |
| 828 }, |
778 'linux-release', | 829 'linux-release', |
779 'foo', | 830 'foo', |
780 'https://chrome-perf.googleplex.com', | 831 'https://chrome-perf.googleplex.com', |
781 'chromium.perf', | 832 'chromium.perf', |
782 'XP Perf (1)', | 833 'XP Perf (1)', |
783 '7890', | 834 '7890', |
784 self.build_dir, | 835 self.build_dir, |
785 {}] | 836 {}] |
786 expected_new_json = [json.dumps([{ | 837 expected_new_json = [json.dumps([{ |
787 'master': 'ChromiumPerf', | 838 'master': 'ChromiumPerf', |
788 'bot': 'linux-release', | 839 'bot': 'linux-release', |
789 'test': 'foo/bar/baz', | 840 'test': 'foo/bar/baz', |
790 'revision': 12345, | 841 'revision': 12345, |
791 'value': '100.0', | 842 'value': '100.0', |
792 'error': '5.0', | 843 'error': '5.0', |
793 'masterid': 'chromium.perf', | 844 'masterid': 'chromium.perf', |
794 'buildername': 'XP Perf (1)', | 845 'buildername': 'XP Perf (1)', |
795 'buildnumber': '7890', | 846 'buildnumber': '7890', |
796 'supplemental_columns': { | 847 'supplemental_columns': { |
797 'r_webkit_rev': '6789', | 848 'r_webkit_rev': '6789', |
798 'r_webrtc_rev': '3456', | 849 'r_webrtc_rev': '3456', |
799 'r_v8_rev': '2345', | 850 'r_v8_rev': '2345', |
800 }}])] | 851 }}])] |
801 errors = [urllib2.URLError('reason')] | 852 errors = [urllib2.URLError('reason')] |
802 self._SendResults(args, expected_new_json, errors) | 853 self._TestSendResults(args, expected_new_json, errors) |
803 cache_file = open(self.cache_filename, 'rb') | 854 cache_file = open(self.cache_filename, 'rb') |
804 actual_cache_lines = [l.strip() for l in cache_file.readlines()] | 855 actual_cache_lines = [l.strip() for l in cache_file.readlines()] |
805 cache_file.close() | 856 cache_file.close() |
806 self.assertEqual(4, len(actual_cache_lines)) | 857 self.assertEqual(4, len(actual_cache_lines)) |
807 for line in previous_lines.split('\n') + expected_new_json: | 858 for line in previous_lines.split('\n') + expected_new_json: |
808 self.assertTrue(line in actual_cache_lines) | 859 self.assertTrue(line in actual_cache_lines) |
809 | 860 |
| 861 def test_ChunkList(self): |
| 862 """Tests the list-chunking function.""" |
| 863 # Access to a protected member. |
| 864 # pylint: disable=W0212 |
| 865 self.assertEqual( |
| 866 [[1, 2, 3], [4, 5, 6], [7]], |
| 867 results_dashboard._ChunkList([1, 2, 3, 4, 5, 6, 7], 3)) |
| 868 self.assertEqual( |
| 869 [[1, 2, 3, 4, 5, 6, 7]], |
| 870 results_dashboard._ChunkList([1, 2, 3, 4, 5, 6, 7], 7)) |
| 871 self.assertEqual( |
| 872 [], results_dashboard._ChunkList([], 3)) |
| 873 self.assertEqual( |
| 874 [[1, 2, 3], [4, 5, 6]], |
| 875 results_dashboard._ChunkList([1, 2, 3, 4, 5, 6], 3)) |
| 876 |
810 | 877 |
811 if __name__ == '__main__': | 878 if __name__ == '__main__': |
812 unittest.main() | 879 unittest.main() |
OLD | NEW |