Index: chrome/common/extensions/docs/server2/url_fetcher_fake.py |
diff --git a/chrome/common/extensions/docs/server2/url_fetcher_fake.py b/chrome/common/extensions/docs/server2/url_fetcher_fake.py |
new file mode 100644 |
index 0000000000000000000000000000000000000000..0365e3febfabdb17267638fac930d8773456ccbb |
--- /dev/null |
+++ b/chrome/common/extensions/docs/server2/url_fetcher_fake.py |
@@ -0,0 +1,62 @@ |
+# Copyright 2015 The Chromium Authors. All rights reserved. |
+# Use of this source code is governed by a BSD-style license that can be |
+# found in the LICENSE file. |
+ |
+import logging |
+import re |
+import time |
+ |
+from environment import IsAppEngine |
+from future import Future |
+from url_fetcher import UrlFetcher |
+ |
+ |
+FAKE_URL_FETCHER_CONFIGURATION = None |
+ |
+ |
+def ConfigureFakeUrlFetch(configuration): |
+ """|configuration| is a dictionary mapping strings to fake urlfetch classes. |
+ A fake urlfetch class just needs to have a fetch method. The keys of the |
+ dictionary are treated as regex, and they are matched with the URL to |
+ determine which fake urlfetch is used. |
+ """ |
+ global FAKE_URL_FETCHER_CONFIGURATION |
+ FAKE_URL_FETCHER_CONFIGURATION = dict( |
+ (re.compile(k), v) for k, v in configuration.iteritems()) |
+ |
+ |
+def _GetConfiguration(key): |
+ if not FAKE_URL_FETCHER_CONFIGURATION: |
+ raise ValueError('No fake fetch paths have been configured. ' |
+ 'See ConfigureFakeUrlFetch in url_fetcher_fake.py.') |
+ for k, v in FAKE_URL_FETCHER_CONFIGURATION.iteritems(): |
+ if k.match(key): |
+ return v |
+ raise ValueError('No configuration found for %s' % key) |
+ |
+ |
+class UrlFetcherFake(UrlFetcher): |
+ """A fake UrlFetcher implementation which may be configured with manual URL |
+ overrides for testing. By default this 404s on everything. |
+ """ |
+ class DownloadError(Exception): |
+ pass |
+ |
+ class _Response(object): |
+ def __init__(self, content): |
+ self.content = content |
+ self.headers = {'Content-Type': 'none'} |
+ self.status_code = 200 |
+ |
+ def FetchImpl(self, url, headers): |
+ if IsAppEngine(): |
+ raise ValueError('Attempted to fetch URL from AppEngine: %s' % url) |
+ |
+ url = url.split('?', 1)[0] |
+ response = self._Response(_GetConfiguration(url).fetch(url)) |
+ if response.content is None: |
+ response.status_code = 404 |
+ return response |
+ |
+ def FetchAsyncImpl(self, url, headers): |
+ return Future(callback=lambda: self.FetchImpl(url, headers)) |