Merge "Assign the wrapped function’s attributes"
[functest.git] / functest / utils / decorators.py
1 #!/usr/bin/env python
2
3 # pylint: disable=missing-docstring
4
5 import errno
6 import functools
7 import os
8 import urlparse
9
10 import mock
11 import requests.sessions
12
13
14 def can_dump_request_to_file(method):
15
16     def dump_preparedrequest(request, **kwargs):
17         # pylint: disable=unused-argument
18         parseresult = urlparse.urlparse(request.url)
19         if parseresult.scheme == "file":
20             try:
21                 dirname = os.path.dirname(parseresult.path)
22                 os.makedirs(dirname)
23             except OSError as ex:
24                 if ex.errno != errno.EEXIST:
25                     raise
26             with open(parseresult.path, 'a') as dumpfile:
27                 headers = ""
28                 for key in request.headers:
29                     headers += key + " " + request.headers[key] + "\n"
30                 message = "{} {}\n{}\n{}\n\n\n".format(
31                     request.method, request.url, headers, request.body)
32                 dumpfile.write(message)
33         return mock.Mock()
34
35     def patch_request(method, url, **kwargs):
36         with requests.sessions.Session() as session:
37             parseresult = urlparse.urlparse(url)
38             if parseresult.scheme == "file":
39                 with mock.patch.object(session, 'send',
40                                        side_effect=dump_preparedrequest):
41                     return session.request(method=method, url=url, **kwargs)
42             else:
43                 return session.request(method=method, url=url, **kwargs)
44
45     @functools.wraps(method)
46     def hook(*args, **kwargs):
47         with mock.patch('requests.api.request', side_effect=patch_request):
48             return method(*args, **kwargs)
49
50     return hook