Esempio n. 1
0
    def testGetOrphanedPages(self):
        expected_orphaned_pages = set(
            ['apps/unreachable.html', 'apps/devtools_disconnected.html'])

        link_error_detector = LinkErrorDetector(file_system, self.render,
                                                'templates/public',
                                                ('apps/crx.html', ))
        orphaned_pages = link_error_detector.GetOrphanedPages()

        self.assertEqual(expected_orphaned_pages, set(orphaned_pages))
class BrokenLinkTester(object):
    '''Run link error detector tests.
  '''
    def __init__(self, server_instance, renderer):
        self.link_error_detector = LinkErrorDetector(
            server_instance.host_file_system_provider.GetTrunk(),
            renderer,
            PUBLIC_TEMPLATES,
            root_pages=('extensions/index.html', 'apps/about_apps.html'))

    def TestBrokenLinks(self):
        broken_links = self.link_error_detector.GetBrokenLinks()
        return (len(broken_links), 'Warning: Found %d broken links:\n%s' %
                (len(broken_links), StringifyBrokenLinks(broken_links)))

    def TestOrphanedPages(self):
        orphaned_pages = self.link_error_detector.GetOrphanedPages()
        return (len(orphaned_pages), 'Warning: Found %d orphaned pages:\n%s' %
                (len(orphaned_pages), '\n'.join(orphaned_pages)))
Esempio n. 3
0
    def testGetBrokenLinks(self):
        expected_broken_links = set([
            (404, 'apps/crx.html', 'apps/broken.html',
             'target page not found'),
            (404, 'apps/index.html', 'apps/broken.json',
             'target page not found'),
            (404, 'apps/unreachable.html', 'apps/invalid.html',
             'target page not found'),
            (404, 'apps/devtools_events.html', 'apps/fake.html#invalid',
             'target page not found'),
            (200, 'apps/devtools_events.html', 'apps/index.html#invalid',
             'target anchor not found'),
            (200, 'apps/unreachable.html', '#aoesu', 'target anchor not found')
        ])

        link_error_detector = LinkErrorDetector(file_system, self.render,
                                                'templates/public',
                                                ('apps/index.html'))
        broken_links = link_error_detector.GetBrokenLinks()

        self.assertEqual(expected_broken_links, set(broken_links))
Esempio n. 4
0
    def testCronAndPublicFiles(self):
        '''Runs cron then requests every public file. Cron needs to be run first
    because the public file requests are offline.
    '''
        if _EXPLICIT_TEST_FILES is not None:
            return

        print('Running cron...')
        start_time = time.time()
        try:
            response = Handler(Request.ForTest('/_cron/stable')).Get()
            self.assertEqual(200, response.status)
            self.assertEqual('Success', response.content.ToString())
        finally:
            print('Took %s seconds' % (time.time() - start_time))

        print("Checking for broken links...")
        start_time = time.time()
        link_error_detector = LinkErrorDetector(
            LocalFileSystem(os.path.join(sys.path[0], os.pardir, os.pardir)),
            lambda path: Handler(Request.ForTest(path)).Get(),
            'templates/public',
            ('extensions/index.html', 'apps/about_apps.html'))

        broken_links = link_error_detector.GetBrokenLinks()
        if broken_links:
            # TODO(jshumway): Test should fail when broken links are detected.
            print('Warning: Found %d broken links:' % (len(broken_links)))
            print(StringifyBrokenLinks(broken_links))

        print('Took %s seconds.' % (time.time() - start_time))

        print('Searching for orphaned pages...')
        start_time = time.time()
        orphaned_pages = link_error_detector.GetOrphanedPages()
        if orphaned_pages:
            # TODO(jshumway): Test should fail when orphaned pages are detected.
            print('Warning: Found %d orphaned pages:' % len(orphaned_pages))
            for page in orphaned_pages:
                print(page)
        print('Took %s seconds.' % (time.time() - start_time))

        public_files = _GetPublicFiles()

        print('Rendering %s public files...' % len(public_files.keys()))
        start_time = time.time()
        try:
            for path, content in public_files.iteritems():
                if path.endswith('redirects.json'):
                    continue

                def check_result(response):
                    self.assertEqual(
                        200, response.status,
                        'Got %s when rendering %s' % (response.status, path))
                    # This is reaaaaally rough since usually these will be tiny templates
                    # that render large files. At least it'll catch zero-length responses.
                    self.assertTrue(
                        len(response.content) >= len(content),
                        'Content was "%s" when rendering %s' %
                        (response.content, path))

                check_result(Handler(Request.ForTest(path)).Get())

                # Make sure that leaving out the .html will temporarily redirect to the
                # path with the .html.
                if path.startswith(('apps/', 'extensions/')):
                    redirect_result = Handler(
                        Request.ForTest(posixpath.splitext(path)[0])).Get()
                    self.assertEqual((path, False),
                                     redirect_result.GetRedirect())

                # Make sure including a channel will permanently redirect to the same
                # path without a channel.
                for channel in BranchUtility.GetAllChannelNames():
                    redirect_result = Handler(
                        Request.ForTest('%s/%s' % (channel, path))).Get()
                    self.assertEqual((path, True),
                                     redirect_result.GetRedirect())

                # Samples are internationalized, test some locales.
                if path.endswith('/samples.html'):
                    for lang in ['en-US', 'es', 'ar']:
                        check_result(
                            Handler(
                                Request.ForTest(path,
                                                headers={
                                                    'Accept-Language':
                                                    '%s;q=0.8' % lang
                                                })).Get())
        finally:
            print('Took %s seconds' % (time.time() - start_time))
 def __init__(self, server_instance, renderer):
     self.link_error_detector = LinkErrorDetector(
         server_instance.host_file_system_provider.GetTrunk(),
         renderer,
         PUBLIC_TEMPLATES,
         root_pages=('extensions/index.html', 'apps/about_apps.html'))
Esempio n. 6
0
  def testCronAndPublicFiles(self):
    '''Runs cron then requests every public file. Cron needs to be run first
    because the public file requests are offline.
    '''
    if _EXPLICIT_TEST_FILES is not None:
      return

    print('Running cron...')
    start_time = time.time()
    try:
      response = Handler(Request.ForTest('/_cron')).Get()
      self.assertEqual(200, response.status)
      self.assertEqual('Success', response.content.ToString())
    finally:
      print('Took %s seconds' % (time.time() - start_time))

    print("Checking for broken links...")
    start_time = time.time()
    link_error_detector = LinkErrorDetector(
        # TODO(kalman): Use of ChrootFileSystem here indicates a hack. Fix.
        ChrootFileSystem(LocalFileSystem.Create(), EXTENSIONS),
        lambda path: Handler(Request.ForTest(path)).Get(),
        'templates/public',
        ('extensions/index.html', 'apps/about_apps.html'))

    broken_links = link_error_detector.GetBrokenLinks()
    if broken_links and _VERBOSE:
      print('The broken links are:')
      print(StringifyBrokenLinks(broken_links))

    broken_links_set = set(broken_links)

    known_broken_links_path = os.path.join(
        sys.path[0], 'known_broken_links.json')
    try:
      with open(known_broken_links_path, 'r') as f:
        # The JSON file converts tuples and sets into lists, and for this
        # set union/difference logic they need to be converted back.
        known_broken_links = set(tuple(item) for item in json.load(f))
    except IOError:
      known_broken_links = set()

    newly_broken_links = broken_links_set - known_broken_links
    fixed_links = known_broken_links - broken_links_set

    if _REBASE:
      print('Rebasing broken links with %s newly broken and %s fixed links.' %
            (len(newly_broken_links), len(fixed_links)))
      with open(known_broken_links_path, 'w') as f:
        json.dump(broken_links, f,
                  indent=2, separators=(',', ': '), sort_keys=True)
    else:
      if fixed_links or newly_broken_links:
        print('Found %s broken links, and some have changed. '
              'If this is acceptable or expected then run %s with the --rebase '
              'option.' % (len(broken_links), os.path.split(__file__)[-1]))
      elif broken_links:
        print('Found %s broken links, but there were no changes.' %
              len(broken_links))
      if fixed_links:
        print('%s broken links have been fixed:' % len(fixed_links))
        print(StringifyBrokenLinks(fixed_links))
      if newly_broken_links:
        print('There are %s new broken links:' % len(newly_broken_links))
        print(StringifyBrokenLinks(newly_broken_links))
        self.fail('See logging for details.')

    print('Took %s seconds.' % (time.time() - start_time))

    print('Searching for orphaned pages...')
    start_time = time.time()
    orphaned_pages = link_error_detector.GetOrphanedPages()
    if orphaned_pages:
      # TODO(jshumway): Test should fail when orphaned pages are detected.
      print('Warning: Found %d orphaned pages:' % len(orphaned_pages))
      for page in orphaned_pages:
        print(page)
    print('Took %s seconds.' % (time.time() - start_time))

    public_files = _GetPublicFiles()

    print('Rendering %s public files...' % len(public_files.keys()))
    start_time = time.time()
    try:
      for path, content in public_files.iteritems():
        if path.endswith('redirects.json'):
          continue
        def check_result(response):
          self.assertEqual(200, response.status,
              'Got %s when rendering %s' % (response.status, path))
          # This is reaaaaally rough since usually these will be tiny templates
          # that render large files. At least it'll catch zero-length responses.
          self.assertTrue(len(response.content) >= len(content),
              'Content was "%s" when rendering %s' % (response.content, path))

        check_result(Handler(Request.ForTest(path)).Get())

        # Make sure that leaving out the .html will temporarily redirect to the
        # path with the .html.
        if path.startswith(('apps/', 'extensions/')):
          redirect_result = Handler(
              Request.ForTest(posixpath.splitext(path)[0])).Get()
          self.assertEqual((path, False), redirect_result.GetRedirect())

        # Make sure including a channel will permanently redirect to the same
        # path without a channel.
        for channel in BranchUtility.GetAllChannelNames():
          redirect_result = Handler(
              Request.ForTest('%s/%s' % (channel, path))).Get()
          self.assertEqual((path, True), redirect_result.GetRedirect())

        # Samples are internationalized, test some locales.
        if path.endswith('/samples.html'):
          for lang in ['en-US', 'es', 'ar']:
            check_result(Handler(Request.ForTest(
                path,
                headers={'Accept-Language': '%s;q=0.8' % lang})).Get())
    finally:
      print('Took %s seconds' % (time.time() - start_time))
Esempio n. 7
0
 def __init__(self, server_instance, renderer):
   self.link_error_detector = LinkErrorDetector(
     server_instance.host_file_system,
     renderer,
     svn_constants.PUBLIC_TEMPLATE_PATH,
     root_pages=('extensions/index.html', 'apps/about_apps.html'))