Update To 11.40.268.0
[platform/framework/web/crosswalk.git] / src / tools / telemetry / telemetry / unittest / page_set_smoke_test.py
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
5 import logging
6 import os
7 import unittest
8
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
14
15
16 class PageSetSmokeTest(unittest.TestCase):
17
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)
23       return
24
25     logging.info('Testing %s', page_set.file_path)
26
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' %
31                     page_set.file_path)
32
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'):
37         continue
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))
41
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))
51       if page.credentials:
52         try:
53           self.assertTrue(credentials.CanLogin(page.credentials), fail_message)
54         except browser_credentials.CredentialsError:
55           self.fail(fail_message)
56
57   def CheckAttributes(self, page_set):
58     """Verify that page_set and its page's base attributes have the right types.
59     """
60     self.CheckAttributesOfPageSetBasicAttributes(page_set)
61     for page in page_set.pages:
62       self.CheckAttributesOfPageBasicAttributes(page)
63
64   def CheckNoMixedInBetweenLegacyRunMethodsAndRunPageInteractions(
65       self, page_set):
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
70     # fixed.
71     LEGACY_RUN_METHODS = [
72         'RunMediaMetrics',
73         'RunNoOp',
74         'RunRepaint',
75         'RunPrepareForScreenShot',
76         'RunSmoothness',
77         'RunWebrtc'
78         ]
79     for page in page_set.pages:
80       if hasattr(page, 'RunPageInteractions'):
81         for legacy_run_method in LEGACY_RUN_METHODS:
82           self.assertTrue(
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)))
87
88   def CheckAttributesOfPageSetBasicAttributes(self, page_set):
89     if page_set.file_path is not None:
90       self.assertTrue(
91           isinstance(page_set.file_path, str),
92           msg='page_set %\'s file_path must have type string')
93
94     self.assertTrue(
95         isinstance(page_set.archive_data_file, str),
96         msg='page_set\'s archive_data_file path must have type string')
97
98     if page_set.user_agent_type is not None:
99       self.assertTrue(
100           isinstance(page_set.user_agent_type, str),
101           msg='page_set\'s user_agent_type must have type string')
102
103     self.assertTrue(
104         isinstance(page_set.make_javascript_deterministic, bool),
105         msg='page_set\'s make_javascript_deterministic must have type bool')
106
107     self.assertTrue(
108         isinstance(page_set.startup_url, str),
109         msg='page_set\'s startup_url must have type string')
110
111   def CheckAttributesOfPageBasicAttributes(self, page):
112     self.assertTrue(not hasattr(page, 'disabled'))
113     self.assertTrue(
114        isinstance(page.url, str),
115        msg='page %s \'s url must have type string' % page.display_name)
116     self.assertTrue(
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)
120     self.assertTrue(
121        isinstance(page.name, str),
122        msg='page %s \'s name field must have type string' % page.display_name)
123     self.assertTrue(
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:
127       self.assertTrue(
128          isinstance(l, str),
129          msg='label %s in page %s \'s labels must have type string'
130          % (str(l), page.display_name))
131
132   def RunSmokeTest(self, page_sets_dir, top_level_dir):
133     """Run smoke test on all page sets in page_sets_dir.
134
135     Subclass of PageSetSmokeTest is supposed to call this in some test
136     method to run smoke test.
137     """
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.
144         continue
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)