1010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)# Copyright 2014 The Chromium Authors. All rights reserved.
2010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)# Use of this source code is governed by a BSD-style license that can be
3010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)# found in the LICENSE file.
4010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
5010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)import logging
6010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)import os
7010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)import unittest
8010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)from telemetry.core import browser_credentials
10010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)from telemetry.core import discover
11010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)from telemetry.page import page_set as page_set_module
12010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)from telemetry.page import page_set_archive_info
13010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
14010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
15010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)class PageSetSmokeTest(unittest.TestCase):
16010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  def CheckArchive(self, page_set):
1846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    """Verify that all URLs of pages in page_set have an associated archive. """
1946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    # TODO: Eventually these should be fatal.
2046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    if not page_set.archive_data_file:
2146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      logging.warning('Skipping %s: no archive data file', page_set.file_path)
2246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      return
2346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
2446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    logging.info('Testing %s', page_set.file_path)
25010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
2646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    archive_data_file_path = os.path.join(page_set.base_dir,
2746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                                          page_set.archive_data_file)
2846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    self.assertTrue(os.path.exists(archive_data_file_path),
2946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                    msg='Archive data file not found for %s' %
3046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                    page_set.file_path)
3146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
3246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    wpr_archive_info = page_set_archive_info.PageSetArchiveInfo.FromFile(
3346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        archive_data_file_path, ignore_archive=True)
3446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    for page in page_set.pages:
3546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      if not page.url.startswith('http'):
36010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        continue
3746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      self.assertTrue(wpr_archive_info.WprFilePathForPage(page),
3846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                      msg='No archive found for %s in %s' % (
3946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                          page.url, page_set.archive_data_file))
4046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
4146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  def CheckCredentials(self, page_set):
4246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    """Verify that all pages in page_set use proper credentials"""
4346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    credentials = browser_credentials.BrowserCredentials()
4446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    if page_set.credentials_path:
4546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      credentials.credentials_path = (
4646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)          os.path.join(page_set.base_dir, page_set.credentials_path))
4746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    for page in page_set.pages:
4846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      fail_message = ('page %s of %s has invalid credentials %s' %
4946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                      (page.url, page_set.file_path, page.credentials))
5046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      if page.credentials:
5146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        try:
5246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)          self.assertTrue(credentials.CanLogin(page.credentials), fail_message)
5346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        except browser_credentials.CredentialsError:
5446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)          self.fail(fail_message)
55010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
5646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  def CheckTypes(self, page_set):
5746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    """Verify that page_set and its page's base attributes have the right types.
5846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    """
5946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    self.CheckTypesOfPageSetBasicAttributes(page_set)
6046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    for page in page_set.pages:
6146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      self.CheckTypesOfPageBasicAttributes(page)
62010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
6346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  def CheckTypesOfPageSetBasicAttributes(self, page_set):
6446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    if page_set.file_path is not None:
6546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      self.assertTrue(
6646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)          isinstance(page_set.file_path, str),
6746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)          msg='page_set %\'s file_path must have type string')
68cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
6946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    self.assertTrue(
7046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        isinstance(page_set.archive_data_file, str),
7146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        msg='page_set\'s archive_data_file path must have type string')
7246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
7346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    if page_set.user_agent_type is not None:
7446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      self.assertTrue(
7546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)          isinstance(page_set.user_agent_type, str),
7646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)          msg='page_set\'s user_agent_type must have type string')
7746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
7846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    self.assertTrue(
7946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        isinstance(page_set.make_javascript_deterministic, bool),
8046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        msg='page_set\'s make_javascript_deterministic must have type bool')
8146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
8246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    self.assertTrue(
8346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        isinstance(page_set.startup_url, str),
8446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        msg='page_set\'s startup_url must have type string')
8546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
8646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  def CheckTypesOfPageBasicAttributes(self, page):
8746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    self.assertTrue(
8846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)       isinstance(page.url, str),
8946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)       msg='page %s \'s url must have type string' % page.display_name)
9046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    self.assertTrue(
9146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)       isinstance(page.page_set, page_set_module.PageSet),
9246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)       msg='page %s \'s page_set must be an instance of '
9346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)       'telemetry.page.page_set.PageSet' % page.display_name)
9446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    self.assertTrue(
9546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)       isinstance(page.name, str),
9646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)       msg='page %s \'s name field must have type string' % page.display_name)
9746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
98f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  def RunSmokeTest(self, page_sets_dir, top_level_dir):
9946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    """Run smoke test on all page sets in page_sets_dir.
10046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
10146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    Subclass of PageSetSmokeTest is supposed to call this in some test
10246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    method to run smoke test.
10346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    """
104f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    page_sets = discover.DiscoverClasses(page_sets_dir, top_level_dir,
105f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                         page_set_module.PageSet).values()
106f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    for page_set_class in page_sets:
107f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      page_set = page_set_class()
10846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      logging.info('Testing %s', page_set.file_path)
10946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      self.CheckArchive(page_set)
11046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      self.CheckCredentials(page_set)
11146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      self.CheckTypes(page_set)
112