1bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch# Copyright 2013 The Chromium Authors. All rights reserved.
2bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch# Use of this source code is governed by a BSD-style license that can be
3bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch# found in the LICENSE file.
4bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch
5f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)from extensions_paths import PUBLIC_TEMPLATES
6f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)from instance_servlet import (
7f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    InstanceServlet, InstanceServletRenderServletDelegate)
8bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdochfrom link_error_detector import LinkErrorDetector, StringifyBrokenLinks
9bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdochfrom servlet import Request, Response, Servlet
10f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
11bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch
12bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdochclass BrokenLinkTester(object):
13bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  '''Run link error detector tests.
14bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  '''
15bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  def __init__(self, server_instance, renderer):
16bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch    self.link_error_detector = LinkErrorDetector(
171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        server_instance.host_file_system_provider.GetMaster(),
184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        renderer,
19f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        PUBLIC_TEMPLATES,
204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        root_pages=('extensions/index.html', 'apps/about_apps.html'))
21bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch
22bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  def TestBrokenLinks(self):
23bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch    broken_links = self.link_error_detector.GetBrokenLinks()
24bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch    return (
25bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch        len(broken_links),
26bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch        'Warning: Found %d broken links:\n%s' % (
27bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch            len(broken_links), StringifyBrokenLinks(broken_links)))
28bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch
29bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  def TestOrphanedPages(self):
30bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch    orphaned_pages = self.link_error_detector.GetOrphanedPages()
31bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch    return (
32bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch        len(orphaned_pages),
33bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch        'Warning: Found %d orphaned pages:\n%s' % (
34bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch            len(orphaned_pages), '\n'.join(orphaned_pages)))
35bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch
36f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
37bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdochclass TestServlet(Servlet):
38bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  '''Runs tests against the live server. Supports running all broken link
39bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  detection tests, in parts or all at once.
40bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  '''
41bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  def __init__(self, request, delegate_for_test=None):
42bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch    Servlet.__init__(self, request)
43bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch    self._delegate = delegate_for_test or InstanceServlet.Delegate()
44bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch
45bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  def Get(self):
46bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch    link_error_tests = ('broken_links', 'orphaned_pages', 'link_errors')
47bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch
48bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch    if not self._request.path in link_error_tests:
49bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch      return Response.NotFound('Test %s not found. Available tests are: %s' % (
50bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch          self._request.path, ','.join(link_error_tests)))
51bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch
52bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch    constructor = InstanceServlet.GetConstructor(self._delegate)
53bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch    def renderer(path):
54bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch      return constructor(Request(path, '', self._request.headers)).Get()
55bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch
56bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch    link_tester = BrokenLinkTester(
57f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        InstanceServletRenderServletDelegate(
58f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)            self._delegate).CreateServerInstance(),
59bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch        renderer)
60bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch    if self._request.path == 'broken_links':
61bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch      errors, content = link_tester.TestBrokenLinks()
62bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch    elif self._request.path == 'orphaned_pages':
63bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch      errors, content = link_tester.TestOrphanedPages()
64bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch    else:
65bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch      link_errors, link_content = link_tester.TestBrokenLinks()
66bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch      orphaned_errors, orphaned_content = link_tester.TestOrphanedPages()
67bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch      errors = link_errors + orphaned_errors
68bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch      content = "%s\n%s" % (link_content, orphaned_content)
69bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch
70bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch    if errors:
71bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch      return Response.InternalError(content=content)
72bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch
73bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch    return Response.Ok(content="%s test passed." % self._request.path)
74