Add can_dump_request_to_file decorator
authorCédric Ollivier <cedric.ollivier@orange.com>
Mon, 13 Feb 2017 12:34:34 +0000 (13:34 +0100)
committerCédric Ollivier <cedric.ollivier@orange.com>
Mon, 13 Feb 2017 12:51:48 +0000 (13:51 +0100)
can_dump_request_to_file can be called to dump any request data to a
local file as defined by test_db_url. If its scheme is file,
Session.send() is patched. Else the behavior is kept unchanged.

Change-Id: Id219dad274b5f02a05259a2ed13e882c04eea7b4
Signed-off-by: Cédric Ollivier <cedric.ollivier@orange.com>
functest/utils/decorators.py [new file with mode: 0644]
functest/utils/functest_utils.py

diff --git a/functest/utils/decorators.py b/functest/utils/decorators.py
new file mode 100644 (file)
index 0000000..99bcef3
--- /dev/null
@@ -0,0 +1,36 @@
+#!/usr/bin/env python
+
+import mock
+import requests.sessions
+import urlparse
+
+
+def can_dump_request_to_file(method):
+
+    def dump_preparedrequest(request, **kwargs):
+        parseresult = urlparse.urlparse(request.url)
+        if parseresult.scheme == "file":
+            with open(parseresult.path.replace('/results', ''), 'a') as f:
+                headers = ""
+                for key in request.headers:
+                    headers += key + " " + request.headers[key] + "\n"
+                message = "{} {}\n{}\n{}\n\n\n".format(
+                    request.method, request.url, headers, request.body)
+                f.write(message)
+        return mock.Mock()
+
+    def patch_request(method, url, **kwargs):
+        with requests.sessions.Session() as session:
+            parseresult = urlparse.urlparse(url)
+            if parseresult.scheme == "file":
+                with mock.patch.object(
+                        session, 'send', side_effect=dump_preparedrequest):
+                    return session.request(method=method, url=url, **kwargs)
+            else:
+                return session.request(method=method, url=url, **kwargs)
+
+    def hook(*args, **kwargs):
+        with mock.patch('requests.api.request', side_effect=patch_request):
+            return method(*args, **kwargs)
+
+    return hook
index 23a51ff..12d8e90 100644 (file)
@@ -23,6 +23,7 @@ import requests
 import yaml
 from git import Repo
 
+from functest.utils import decorators
 import functest.utils.functest_logger as ft_logger
 
 logger = ft_logger.Logger("functest_utils").getLogger()
@@ -182,6 +183,7 @@ def logger_test_results(project, case_name, status, details):
             'd': details})
 
 
+@decorators.can_dump_request_to_file
 def push_results_to_db(project, case_name,
                        start_date, stop_date, criteria, details):
     """