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