| # Copyright 2015 The Chromium Authors | 
 | # Use of this source code is governed by a BSD-style license that can be | 
 | # found in the LICENSE file. | 
 |  | 
 | import unittest | 
 |  | 
 | import six | 
 |  | 
 | from telemetry.page import shared_page_state | 
 | from telemetry.core import optparse_argparse_migration as oam | 
 |  | 
 | from contrib.cluster_telemetry import rasterize_and_record_micro_ct | 
 | from contrib.cluster_telemetry import skpicture_printer | 
 |  | 
 |  | 
 | class MockErrorParser(object): | 
 |  | 
 |   def __init__(self): | 
 |     self.err_msg = None | 
 |  | 
 |   def error(self, err_msg): | 
 |     self.err_msg = err_msg | 
 |  | 
 |  | 
 | class CTBenchmarks(unittest.TestCase): | 
 |  | 
 |   def setUp(self): | 
 |     self.ct_benchmarks = [ | 
 |         rasterize_and_record_micro_ct.RasterizeAndRecordMicroCT(), | 
 |         skpicture_printer.SkpicturePrinterCT(), | 
 |     ] | 
 |     self.shared_page_state_class = shared_page_state.SharedMobilePageState | 
 |     self.archive_data_file = '/b/test' | 
 |     self.urls_list = 'http://test1.com,http://test2.com,http://test3.net' | 
 |     self.mock_parser = MockErrorParser() | 
 |  | 
 |   def testCTBenchmarks(self): | 
 |     for benchmark in self.ct_benchmarks: | 
 |       parser = oam.CreateFromOptparseInputs() | 
 |       parser.user_agent = 'mobile' | 
 |       parser.archive_data_file = self.archive_data_file | 
 |       parser.urls_list = self.urls_list | 
 |  | 
 |       benchmark.AddBenchmarkCommandLineArgs(parser) | 
 |       benchmark.ProcessCommandLineArgs(None, parser) | 
 |       ct_page_set = benchmark.CreateStorySet(parser) | 
 |  | 
 |       self.assertEqual(len(self.urls_list.split(',')), len(ct_page_set.stories)) | 
 |       self.assertEqual(self.archive_data_file, ct_page_set.archive_data_file) | 
 |       for i in range(len(self.urls_list.split(','))): | 
 |         url = self.urls_list.split(',')[i] | 
 |         story = ct_page_set.stories[i] | 
 |         self.assertEqual(url, story.url) | 
 |         self.assertEqual(self.shared_page_state_class, story.shared_state_class) | 
 |         self.assertEqual(self.archive_data_file, story.archive_data_file) | 
 |  | 
 |   def testCTBenchmarks_wrongAgent(self): | 
 |     for benchmark in self.ct_benchmarks: | 
 |       parser = oam.CreateFromOptparseInputs() | 
 |       parser.user_agent = 'mobileeeeee' | 
 |       parser.archive_data_file = self.archive_data_file | 
 |       parser.urls_list = self.urls_list | 
 |  | 
 |       benchmark.AddBenchmarkCommandLineArgs(parser) | 
 |       benchmark.ProcessCommandLineArgs(None, parser) | 
 |       try: | 
 |         benchmark.CreateStorySet(parser) | 
 |         self.fail('Expected ValueError') | 
 |       except ValueError as e: | 
 |         self.assertEqual('user_agent mobileeeeee is unrecognized', str(e)) | 
 |  | 
 |   def testCTBenchmarks_missingDataFile(self): | 
 |     for benchmark in self.ct_benchmarks: | 
 |       parser = oam.CreateFromOptparseInputs() | 
 |       parser.user_agent = 'mobile' | 
 |       parser.urls_list = self.urls_list | 
 |       parser.use_live_sites = False | 
 |       benchmark.AddBenchmarkCommandLineArgs(parser) | 
 |  | 
 |       # Should fail due to missing archive_data_file. | 
 |       try: | 
 |         benchmark.ProcessCommandLineArgs(None, parser) | 
 |         self.fail('Expected AttributeError') | 
 |       except AttributeError as e: | 
 |         if six.PY2: | 
 |           expected_error = ( | 
 |               "ArgumentParser instance has no attribute 'archive_data_file'") | 
 |           actual_error = e.message | 
 |         else: | 
 |           expected_error = ( | 
 |               "'ArgumentParser' object has no attribute 'archive_data_file'") | 
 |           actual_error = str(e) | 
 |         self.assertEqual(actual_error, expected_error) | 
 |  | 
 |       # Now add an empty archive_data_file. | 
 |       parser.archive_data_file = '' | 
 |       benchmark.ProcessCommandLineArgs(self.mock_parser, parser) | 
 |       self.assertEqual('Please specify --archive-data-file.', | 
 |                        self.mock_parser.err_msg) | 
 |  | 
 |   def testCTBenchmarks_missingDataFileUseLiveSites(self): | 
 |     for benchmark in self.ct_benchmarks: | 
 |       parser = oam.CreateFromOptparseInputs() | 
 |       parser.user_agent = 'mobile' | 
 |       parser.urls_list = self.urls_list | 
 |       parser.use_live_sites = True | 
 |       parser.archive_data_file = None | 
 |       benchmark.AddBenchmarkCommandLineArgs(parser) | 
 |  | 
 |       # Should pass. | 
 |       benchmark.ProcessCommandLineArgs(self.mock_parser, parser) | 
 |       self.assertIsNone(self.mock_parser.err_msg) | 
 |  | 
 |   def testCTBenchmarks_missingUrlsList(self): | 
 |     for benchmark in self.ct_benchmarks: | 
 |       parser = oam.CreateFromOptparseInputs() | 
 |       parser.user_agent = 'mobile' | 
 |       parser.archive_data_file = self.archive_data_file | 
 |       benchmark.AddBenchmarkCommandLineArgs(parser) | 
 |  | 
 |       # Should fail due to missing urls_list. | 
 |       try: | 
 |         benchmark.ProcessCommandLineArgs(None, parser) | 
 |         self.fail('Expected AttributeError') | 
 |       except AttributeError as e: | 
 |         if six.PY2: | 
 |           self.assertEqual( | 
 |               "ArgumentParser instance has no attribute 'urls_list'", str(e)) | 
 |         else: | 
 |           self.assertEqual( | 
 |               "'ArgumentParser' object has no attribute 'urls_list'", str(e)) | 
 |  | 
 |       # Now add an empty urls_list. | 
 |       parser.urls_list = '' | 
 |       benchmark.ProcessCommandLineArgs(self.mock_parser, parser) | 
 |       self.assertEqual('Please specify --urls-list.', self.mock_parser.err_msg) |