15f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)# Copyright 2014 The Chromium Authors. All rights reserved. 25f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)# Use of this source code is governed by a BSD-style license that can be 35f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)# found in the LICENSE file. 45f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)import csv 55f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)import os 66e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)import StringIO 75f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)import unittest 85f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 96e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)from telemetry.page import page_set 105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)from telemetry.results import csv_output_formatter 115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)from telemetry.results import page_test_results 125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)from telemetry.value import histogram 135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)from telemetry.value import scalar 145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)def _MakePageSet(): 175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ps = page_set.PageSet(file_path=os.path.dirname(__file__)) 185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ps.AddPageWithDefaultRunNavigate('http://www.foo.com/') 195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ps.AddPageWithDefaultRunNavigate('http://www.bar.com/') 205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return ps 215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class CsvOutputFormatterTest(unittest.TestCase): 245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) def setUp(self): 255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) self._output = StringIO.StringIO() 265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) self._page_set = _MakePageSet() 275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) self._formatter = csv_output_formatter.CsvOutputFormatter(self._output) 285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) @property 305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) def lines(self): 315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) lines = StringIO.StringIO(self._output.getvalue()).readlines() 325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return lines 335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) @property 355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) def output_header_row(self): 365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) rows = list(csv.reader(self.lines)) 375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return rows[0] 385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) @property 405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) def output_data_rows(self): 415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) rows = list(csv.reader(self.lines)) 425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return rows[1:] 435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) def test_with_no_results_on_second_run(self): 455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) results = page_test_results.PageTestResults() 465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) results.WillRunPage(self._page_set[0]) 475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) results.AddValue(scalar.ScalarValue(self._page_set[0], 'foo', 'seconds', 3)) 485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) results.DidRunPage(self._page_set[0]) 495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) results.WillRunPage(self._page_set[1]) 515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) results.DidRunPage(self._page_set[1]) 525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) self._formatter.Format(results) 545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) self.assertEqual(['page_name', 'foo (seconds)'], self.output_header_row) 565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) # TODO(chrishenry): Is this really the right behavior? Should this 575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) # not output a second row with '-' as its results? 585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) expected = [[self._page_set[0].url, '3.0']] 595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) self.assertEqual(expected, self.output_data_rows) 605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) def test_fewer_results_on_second_run(self): 625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) results = page_test_results.PageTestResults() 635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) results.WillRunPage(self._page_set[0]) 645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) results.AddValue(scalar.ScalarValue(self._page_set[0], 'foo', 'seconds', 3)) 655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) results.AddValue(scalar.ScalarValue(self._page_set[0], 'bar', 'seconds', 4)) 665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) results.DidRunPage(self._page_set[0]) 675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) results.WillRunPage(self._page_set[1]) 695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) results.AddValue(scalar.ScalarValue(self._page_set[1], 'bar', 'seconds', 5)) 705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) results.DidRunPage(self._page_set[1]) 715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) self._formatter.Format(results) 735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) self.assertEqual(['page_name', 'bar (seconds)', 'foo (seconds)'], 745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) self.output_header_row) 755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) expected = [[self._page_set[0].url, '4.0', '3.0'], 765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) [self._page_set[1].url, '5.0', '-']] 775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) self.assertEqual(expected, self.output_data_rows) 785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) def test_with_output_at_print_summary_time(self): 805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) results = page_test_results.PageTestResults() 815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) results.WillRunPage(self._page_set[0]) 825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) results.AddValue(scalar.ScalarValue(self._page_set[0], 'foo', 'seconds', 3)) 835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) results.DidRunPage(self._page_set[0]) 845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) results.WillRunPage(self._page_set[1]) 865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) results.AddValue(scalar.ScalarValue(self._page_set[1], 'bar', 'seconds', 4)) 875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) results.DidRunPage(self._page_set[1]) 885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) self._formatter.Format(results) 905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) self.assertEqual( 925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) self.output_header_row, 935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ['page_name', 'bar (seconds)', 'foo (seconds)']) 945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) expected = [[self._page_set[0].display_name, '-', '3.0'], 965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) [self._page_set[1].display_name, '4.0', '-']] 975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) self.assertEqual(expected, self.output_data_rows) 985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) def test_histogram(self): 1005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) results = page_test_results.PageTestResults() 1015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) results.WillRunPage(self._page_set[0]) 1025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) results.AddValue(histogram.HistogramValue( 1035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) self._page_set[0], 'a', '', 1045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) raw_value_json='{"buckets": [{"low": 1, "high": 2, "count": 1}]}')) 1055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) results.DidRunPage(self._page_set[0]) 1065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) results.WillRunPage(self._page_set[1]) 1085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) results.AddValue(histogram.HistogramValue( 1095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) self._page_set[1], 'a', '', 1105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) raw_value_json='{"buckets": [{"low": 2, "high": 3, "count": 1}]}')) 1115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) results.DidRunPage(self._page_set[1]) 1125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) self._formatter.Format(results) 1145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) self.assertEqual( 1165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) self.output_header_row, 1175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ['page_name', 'a ()']) 1185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) self.assertEqual( 1195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) self.output_data_rows, 1205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) [[self._page_set[0].display_name, '1.5'], 1215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) [self._page_set[1].display_name, '2.5']]) 122