| Index: recipe_modules/url/test_api.py | 
| diff --git a/recipe_modules/url/test_api.py b/recipe_modules/url/test_api.py | 
| new file mode 100644 | 
| index 0000000000000000000000000000000000000000..8aa734e4e306d7b6f21ea0631ac29f487437d467 | 
| --- /dev/null | 
| +++ b/recipe_modules/url/test_api.py | 
| @@ -0,0 +1,48 @@ | 
| +# Copyright 2017 The LUCI Authors. All rights reserved. | 
| +# Use of this source code is governed under the Apache License, Version 2.0 | 
| +# that can be found in the LICENSE file. | 
| + | 
| +import httplib | 
| + | 
| +from recipe_engine import recipe_test_api | 
| + | 
| + | 
| +class UrlTestApi(recipe_test_api.RecipeTestApi): # pragma: no cover | 
| + | 
| +  def _response(self, step_name, data, size, status_code, error_body): | 
| +    step_data = [ | 
| +        self.m.json.output({ | 
| +          'status_code': status_code, | 
| +          'success': status_code in (httplib.OK, httplib.NO_CONTENT), | 
| +          'size': size, | 
| +          'error_body': error_body, | 
| +        }, name='status_json'), | 
| +    ] | 
| +    if data: | 
| +      step_data.append(data) | 
| +    return self.step_data(step_name, *step_data) | 
| + | 
| +  def error(self, step_name, status_code, body=None): | 
| +    body = body or 'HTTP Error (%d)' % (status_code,) | 
| +    return self._response( | 
| +        step_name, | 
| +        None, | 
| +        len(body), | 
| +        status_code, | 
| +        body) | 
| + | 
| +  def text(self, step_name, v): | 
| +    return self._response( | 
| +        step_name, | 
| +        self.m.raw_io.output_text(v, name='output'), | 
| +        len(v), | 
| +        200, | 
| +        None) | 
| + | 
| +  def json(self, step_name, obj): | 
| +    return self._response( | 
| +        step_name, | 
| +        self.m.json.output(obj, name='output'), | 
| +        len(self.m.json.dumps(obj)), | 
| +        200, | 
| +        None) | 
|  |