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.
9 from telemetry.core import browser_credentials
10 from telemetry.core import discover
11 from telemetry.page import page_set as page_set_module
12 from telemetry.page import page_set_archive_info
13 from telemetry.util import classes
16 class PageSetSmokeTest(unittest.TestCase):
18 def CheckArchive(self, page_set):
19 """Verify that all URLs of pages in page_set have an associated archive. """
20 # TODO: Eventually these should be fatal.
21 if not page_set.archive_data_file:
22 logging.warning('Skipping %s: no archive data file', page_set.file_path)
25 logging.info('Testing %s', page_set.file_path)
27 archive_data_file_path = os.path.join(page_set.base_dir,
28 page_set.archive_data_file)
29 self.assertTrue(os.path.exists(archive_data_file_path),
30 msg='Archive data file not found for %s' %
33 wpr_archive_info = page_set_archive_info.PageSetArchiveInfo.FromFile(
34 archive_data_file_path, ignore_archive=True)
35 for page in page_set.pages:
36 if not page.url.startswith('http'):
38 self.assertTrue(wpr_archive_info.WprFilePathForPage(page),
39 msg='No archive found for %s in %s' % (
40 page.url, page_set.archive_data_file))
42 def CheckCredentials(self, page_set):
43 """Verify that all pages in page_set use proper credentials"""
44 for page in page_set.pages:
45 credentials = browser_credentials.BrowserCredentials()
46 if page.credentials_path:
47 credentials.credentials_path = (
48 os.path.join(page.base_dir, page.credentials_path))
49 fail_message = ('page %s of %s has invalid credentials %s' %
50 (page.url, page_set.file_path, page.credentials))
53 self.assertTrue(credentials.CanLogin(page.credentials), fail_message)
54 except browser_credentials.CredentialsError:
55 self.fail(fail_message)
57 def CheckAttributes(self, page_set):
58 """Verify that page_set and its page's base attributes have the right types.
60 self.CheckAttributesOfPageSetBasicAttributes(page_set)
61 for page in page_set.pages:
62 self.CheckAttributesOfPageBasicAttributes(page)
64 def CheckNoMixedInBetweenLegacyRunMethodsAndRunPageInteractions(
66 # This test is to make sure that page has been converted to use single
67 # RunPageInteractions does not contain legacy run method.
68 # For more context see: crbug.com/418375
69 # TODO(nednguyen, ernstm): remove this test when crbug.com/418375 is marked
71 LEGACY_RUN_METHODS = [
75 'RunPrepareForScreenShot',
79 for page in page_set.pages:
80 if hasattr(page, 'RunPageInteractions'):
81 for legacy_run_method in LEGACY_RUN_METHODS:
83 not hasattr(page, legacy_run_method),
84 msg=('page %s in page_set %s has both legacy Run.. methods and '
85 'RunPageInteractions defined. ' % (
86 page, page_set.file_path)))
88 def CheckAttributesOfPageSetBasicAttributes(self, page_set):
89 if page_set.file_path is not None:
91 isinstance(page_set.file_path, str),
92 msg='page_set %\'s file_path must have type string')
95 isinstance(page_set.archive_data_file, str),
96 msg='page_set\'s archive_data_file path must have type string')
98 if page_set.user_agent_type is not None:
100 isinstance(page_set.user_agent_type, str),
101 msg='page_set\'s user_agent_type must have type string')
104 isinstance(page_set.make_javascript_deterministic, bool),
105 msg='page_set\'s make_javascript_deterministic must have type bool')
108 isinstance(page_set.startup_url, str),
109 msg='page_set\'s startup_url must have type string')
111 def CheckAttributesOfPageBasicAttributes(self, page):
112 self.assertTrue(not hasattr(page, 'disabled'))
114 isinstance(page.url, str),
115 msg='page %s \'s url must have type string' % page.display_name)
117 isinstance(page.page_set, page_set_module.PageSet),
118 msg='page %s \'s page_set must be an instance of '
119 'telemetry.page.page_set.PageSet' % page.display_name)
121 isinstance(page.name, str),
122 msg='page %s \'s name field must have type string' % page.display_name)
124 isinstance(page.labels, set),
125 msg='page %s \'s labels field must have type set' % page.display_name)
126 for l in page.labels:
129 msg='label %s in page %s \'s labels must have type string'
130 % (str(l), page.display_name))
132 def RunSmokeTest(self, page_sets_dir, top_level_dir):
133 """Run smoke test on all page sets in page_sets_dir.
135 Subclass of PageSetSmokeTest is supposed to call this in some test
136 method to run smoke test.
138 page_sets = discover.DiscoverClasses(page_sets_dir, top_level_dir,
139 page_set_module.PageSet).values()
140 for page_set_class in page_sets:
141 if not classes.IsDirectlyConstructable(page_set_class):
142 # We can't test page sets that aren't directly constructable since we
143 # don't know what arguments to put for the constructor.
145 page_set = page_set_class()
146 logging.info('Testing %s', page_set.file_path)
147 self.CheckArchive(page_set)
148 self.CheckCredentials(page_set)
149 self.CheckAttributes(page_set)
150 self.CheckNoMixedInBetweenLegacyRunMethodsAndRunPageInteractions(page_set)