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