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