|
| 1 | +import gzip |
| 2 | +import json |
1 | 3 | import logging |
2 | 4 | from unittest import TestCase |
3 | 5 | from mock import patch |
| 6 | +from requests.models import Response |
| 7 | + |
| 8 | +try: |
| 9 | + from cStringIO import StringIO |
| 10 | +except Exception: |
| 11 | + try: |
| 12 | + from StringIO import StringIO |
| 13 | + except Exception: |
| 14 | + pass # python 3, we use a new function in gzip |
4 | 15 |
|
5 | 16 | from stackify.transport import application |
6 | 17 | from stackify.transport.default import DefaultTransport |
7 | 18 | from stackify.transport.default.log import LogMsg |
8 | 19 | from stackify.transport.default.log import LogMsgGroup |
9 | 20 |
|
10 | 21 |
|
| 22 | +def parse_gzip_data(data): |
| 23 | + if hasattr(gzip, 'decompress'): |
| 24 | + return gzip.decompress(data).decode("utf-8") |
| 25 | + else: |
| 26 | + sio = StringIO() |
| 27 | + sio.write(data) |
| 28 | + sio.seek(0) |
| 29 | + g = gzip.GzipFile(fileobj=sio, mode='rb') |
| 30 | + transaction = g.read() |
| 31 | + g.close() |
| 32 | + return transaction.decode("utf-8") |
| 33 | + |
| 34 | + |
11 | 35 | class AgentSocketTransportTest(TestCase): |
12 | 36 | def setUp(self): |
13 | 37 | self.config = application.ApiConfiguration( |
@@ -37,11 +61,57 @@ def test_create_group_message(self): |
37 | 61 |
|
38 | 62 | @patch('requests.post') |
39 | 63 | def test_send(self, mock_post): |
| 64 | + res = Response() |
| 65 | + res._content = json.dumps({ |
| 66 | + 'DeviceID': None, |
| 67 | + 'DeviceAppID': None, |
| 68 | + 'AppNameID': 'test', |
| 69 | + 'EnvID': 0, |
| 70 | + 'Env': 'test_environment', |
| 71 | + 'AppName': 'test_appname', |
| 72 | + 'AppEnvID': 'test', |
| 73 | + 'DeviceAlias': 'test' |
| 74 | + }).encode('UTF-8') |
| 75 | + mock_post.side_effect = [res, Response()] |
40 | 76 | message = self.default_transport.create_message(logging.makeLogRecord({'mgs': 'message', 'funcName': 'foo'})) |
41 | 77 | group_message = self.default_transport.create_group_message([message]) |
42 | 78 |
|
43 | 79 | self.default_transport.send(group_message) |
44 | 80 |
|
45 | 81 | assert mock_post.called |
| 82 | + assert mock_post.call_count == 2 |
46 | 83 | assert mock_post.call_args_list[0][0][0] == 'test_apiurl/Metrics/IdentifyApp' |
47 | 84 | assert mock_post.call_args_list[0][1]['headers']['Content-Type'] == 'application/json' |
| 85 | + assert mock_post.call_args_list[1][0][0] == 'test_apiurl/Log/Save' |
| 86 | + assert mock_post.call_args_list[1][1]['headers']['Content-Type'] == 'application/json' |
| 87 | + |
| 88 | + @patch('requests.post') |
| 89 | + def test_json_data(self, mock_post): |
| 90 | + res = Response() |
| 91 | + res._content = json.dumps({ |
| 92 | + 'DeviceID': None, |
| 93 | + 'DeviceAppID': None, |
| 94 | + 'AppNameID': 'test', |
| 95 | + 'EnvID': 0, |
| 96 | + 'Env': 'test_environment', |
| 97 | + 'AppName': 'test_appname', |
| 98 | + 'AppEnvID': 'test', |
| 99 | + 'DeviceAlias': 'test' |
| 100 | + }).encode('UTF-8') |
| 101 | + mock_post.side_effect = [res, Response()] |
| 102 | + message = self.default_transport.create_message(logging.makeLogRecord({'mgs': 'message', 'funcName': 'foo'})) |
| 103 | + group_message = self.default_transport.create_group_message([message]) |
| 104 | + |
| 105 | + self.default_transport.send(group_message) |
| 106 | + |
| 107 | + assert mock_post.called |
| 108 | + assert mock_post.call_count == 2 |
| 109 | + assert mock_post.call_args_list[1][0][0] == 'test_apiurl/Log/Save' |
| 110 | + |
| 111 | + payload = json.loads(parse_gzip_data(mock_post.call_args_list[1][1]['data'])) |
| 112 | + assert payload.get('AppName') == 'test_appname' |
| 113 | + assert payload.get('Env') == 'test_environment' |
| 114 | + assert payload.get('ServerName') |
| 115 | + assert payload.get('AppNameID') == 'test' |
| 116 | + assert payload.get('Logger') |
| 117 | + assert payload.get('Msgs') |
0 commit comments