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