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. 4 5import logging 6import os 7import unittest 8 9from telemetry.core import browser_credentials 10from telemetry.core import discover 11from telemetry.page import page_set as page_set_module 12from telemetry.page import page_set_archive_info 13 14 15class PageSetSmokeTest(unittest.TestCase): 16 17 def CheckArchive(self, page_set): 18 """Verify that all URLs of pages in page_set have an associated archive. """ 19 # TODO: Eventually these should be fatal. 20 if not page_set.archive_data_file: 21 logging.warning('Skipping %s: no archive data file', page_set.file_path) 22 return 23 24 logging.info('Testing %s', page_set.file_path) 25 26 archive_data_file_path = os.path.join(page_set.base_dir, 27 page_set.archive_data_file) 28 self.assertTrue(os.path.exists(archive_data_file_path), 29 msg='Archive data file not found for %s' % 30 page_set.file_path) 31 32 wpr_archive_info = page_set_archive_info.PageSetArchiveInfo.FromFile( 33 archive_data_file_path, ignore_archive=True) 34 for page in page_set.pages: 35 if not page.url.startswith('http'): 36 continue 37 self.assertTrue(wpr_archive_info.WprFilePathForPage(page), 38 msg='No archive found for %s in %s' % ( 39 page.url, page_set.archive_data_file)) 40 41 def CheckCredentials(self, page_set): 42 """Verify that all pages in page_set use proper credentials""" 43 credentials = browser_credentials.BrowserCredentials() 44 if page_set.credentials_path: 45 credentials.credentials_path = ( 46 os.path.join(page_set.base_dir, page_set.credentials_path)) 47 for page in page_set.pages: 48 fail_message = ('page %s of %s has invalid credentials %s' % 49 (page.url, page_set.file_path, page.credentials)) 50 if page.credentials: 51 try: 52 self.assertTrue(credentials.CanLogin(page.credentials), fail_message) 53 except browser_credentials.CredentialsError: 54 self.fail(fail_message) 55 56 def CheckTypes(self, page_set): 57 """Verify that page_set and its page's base attributes have the right types. 58 """ 59 self.CheckTypesOfPageSetBasicAttributes(page_set) 60 for page in page_set.pages: 61 self.CheckTypesOfPageBasicAttributes(page) 62 63 def CheckTypesOfPageSetBasicAttributes(self, page_set): 64 if page_set.file_path is not None: 65 self.assertTrue( 66 isinstance(page_set.file_path, str), 67 msg='page_set %\'s file_path must have type string') 68 69 self.assertTrue( 70 isinstance(page_set.archive_data_file, str), 71 msg='page_set\'s archive_data_file path must have type string') 72 73 if page_set.user_agent_type is not None: 74 self.assertTrue( 75 isinstance(page_set.user_agent_type, str), 76 msg='page_set\'s user_agent_type must have type string') 77 78 self.assertTrue( 79 isinstance(page_set.make_javascript_deterministic, bool), 80 msg='page_set\'s make_javascript_deterministic must have type bool') 81 82 self.assertTrue( 83 isinstance(page_set.startup_url, str), 84 msg='page_set\'s startup_url must have type string') 85 86 def CheckTypesOfPageBasicAttributes(self, page): 87 self.assertTrue( 88 isinstance(page.url, str), 89 msg='page %s \'s url must have type string' % page.display_name) 90 self.assertTrue( 91 isinstance(page.page_set, page_set_module.PageSet), 92 msg='page %s \'s page_set must be an instance of ' 93 'telemetry.page.page_set.PageSet' % page.display_name) 94 self.assertTrue( 95 isinstance(page.name, str), 96 msg='page %s \'s name field must have type string' % page.display_name) 97 98 def RunSmokeTest(self, page_sets_dir, top_level_dir): 99 """Run smoke test on all page sets in page_sets_dir. 100 101 Subclass of PageSetSmokeTest is supposed to call this in some test 102 method to run smoke test. 103 """ 104 page_sets = discover.DiscoverClasses(page_sets_dir, top_level_dir, 105 page_set_module.PageSet).values() 106 for page_set_class in page_sets: 107 page_set = page_set_class() 108 logging.info('Testing %s', page_set.file_path) 109 self.CheckArchive(page_set) 110 self.CheckCredentials(page_set) 111 self.CheckTypes(page_set) 112