1# Copyright 2013 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
5from extensions_paths import PUBLIC_TEMPLATES
6from instance_servlet import (
7    InstanceServlet, InstanceServletRenderServletDelegate)
8from link_error_detector import LinkErrorDetector, StringifyBrokenLinks
9from servlet import Request, Response, Servlet
10
11
12class BrokenLinkTester(object):
13  '''Run link error detector tests.
14  '''
15  def __init__(self, server_instance, renderer):
16    self.link_error_detector = LinkErrorDetector(
17        server_instance.host_file_system_provider.GetMaster(),
18        renderer,
19        PUBLIC_TEMPLATES,
20        root_pages=('extensions/index.html', 'apps/about_apps.html'))
21
22  def TestBrokenLinks(self):
23    broken_links = self.link_error_detector.GetBrokenLinks()
24    return (
25        len(broken_links),
26        'Warning: Found %d broken links:\n%s' % (
27            len(broken_links), StringifyBrokenLinks(broken_links)))
28
29  def TestOrphanedPages(self):
30    orphaned_pages = self.link_error_detector.GetOrphanedPages()
31    return (
32        len(orphaned_pages),
33        'Warning: Found %d orphaned pages:\n%s' % (
34            len(orphaned_pages), '\n'.join(orphaned_pages)))
35
36
37class TestServlet(Servlet):
38  '''Runs tests against the live server. Supports running all broken link
39  detection tests, in parts or all at once.
40  '''
41  def __init__(self, request, delegate_for_test=None):
42    Servlet.__init__(self, request)
43    self._delegate = delegate_for_test or InstanceServlet.Delegate()
44
45  def Get(self):
46    link_error_tests = ('broken_links', 'orphaned_pages', 'link_errors')
47
48    if not self._request.path in link_error_tests:
49      return Response.NotFound('Test %s not found. Available tests are: %s' % (
50          self._request.path, ','.join(link_error_tests)))
51
52    constructor = InstanceServlet.GetConstructor(self._delegate)
53    def renderer(path):
54      return constructor(Request(path, '', self._request.headers)).Get()
55
56    link_tester = BrokenLinkTester(
57        InstanceServletRenderServletDelegate(
58            self._delegate).CreateServerInstance(),
59        renderer)
60    if self._request.path == 'broken_links':
61      errors, content = link_tester.TestBrokenLinks()
62    elif self._request.path == 'orphaned_pages':
63      errors, content = link_tester.TestOrphanedPages()
64    else:
65      link_errors, link_content = link_tester.TestBrokenLinks()
66      orphaned_errors, orphaned_content = link_tester.TestOrphanedPages()
67      errors = link_errors + orphaned_errors
68      content = "%s\n%s" % (link_content, orphaned_content)
69
70    if errors:
71      return Response.InternalError(content=content)
72
73    return Response.Ok(content="%s test passed." % self._request.path)
74