Skip to content

Commit d17b5ec

Browse files
committed
more tests
1 parent e10cccf commit d17b5ec

3 files changed

Lines changed: 69 additions & 74 deletions

File tree

logdna/logdna.py

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,7 @@ def try_request(self):
177177
self.close_flusher()
178178
self.exception_flag = True
179179

180-
def send_request(self, data):
180+
def send_request(self, data): # noqa: max-complexity: 13
181181
"""
182182
Send log data to LogDNA server
183183
Returns:
@@ -206,9 +206,11 @@ def send_request(self, data):
206206
1XX unexpected status
207207
200 expected status, OK
208208
2XX unexpected status
209-
301 302 303 unexpected status, per "allow_redirects=True"
209+
301 302 303 unexpected status,
210+
per "allow_redirects=True"
210211
3XX unexpected status
211-
401, 403 expected client error, invalid ingestion key
212+
401, 403 expected client error,
213+
invalid ingestion key
212214
4XX unexpected client error
213215
500 502 503 507 expected server error, transient
214216
5XX unexpected server error
@@ -221,7 +223,7 @@ def send_request(self, data):
221223
unexpected server error log + discard flush buffer
222224
'''
223225
if status_code == 200:
224-
return True # discard
226+
return True # discard
225227

226228
if isinstance(response.reason, bytes):
227229
# We attempt to decode utf-8 first because some servers
@@ -239,19 +241,19 @@ def send_request(self, data):
239241
self.internalLogger.debug('Unexpected response: %s. ' +
240242
'Discarding flush buffer',
241243
reason)
242-
return True # discard
244+
return True # discard
243245

244246
if status_code in [401, 403]:
245247
self.internalLogger.debug(
246248
'Please provide a valid ingestion key. ' +
247249
'Discarding flush buffer')
248-
return True # discard
250+
return True # discard
249251

250252
if 400 <= status_code <= 499:
251253
self.internalLogger.debug('Client Error: %s. ' +
252254
'Discarding flush buffer',
253255
reason)
254-
return True # discard
256+
return True # discard
255257

256258
if status_code in [500, 502, 503, 507]:
257259
self.internalLogger.debug('Server Error: %s. Retrying...',
@@ -271,7 +273,7 @@ def send_request(self, data):
271273
self.internalLogger.debug(
272274
'Error sending logs %s. Discarding flush buffer', exception)
273275

274-
return True # discard
276+
return True # discard
275277

276278
def emit(self, record):
277279
msg = self.format(record)

tests/test_logger.py

Lines changed: 59 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
from concurrent.futures import ThreadPoolExecutor
99
from logdna.configs import defaults
1010
from unittest import mock
11-
from tests.test_utils import ordered
11+
from unittest.mock import patch
1212

1313
now = int(time.time())
1414
expectedLines = []
@@ -45,7 +45,8 @@
4545
'mac': 'C0:FF:EE:C0:FF:EE',
4646
'tags': 'sample,test',
4747
'index_meta': True,
48-
'now': int(time.time() * 1000)
48+
'now': int(time.time() * 1000),
49+
'retry_interval_secs': 0.5
4950
}
5051

5152

@@ -71,7 +72,6 @@ def shutdown(self, wait=True):
7172

7273
class LogDNAHandlerTest(unittest.TestCase):
7374

74-
@ordered
7575
def test_handler(self):
7676
handler = LogDNAHandler(LOGDNA_API_KEY, sample_options)
7777
self.assertIsInstance(handler, logging.Handler)
@@ -99,7 +99,7 @@ def test_handler(self):
9999
self.assertEqual(handler.max_concurrent_requests,
100100
defaults['MAX_CONCURRENT_REQUESTS'])
101101
self.assertEqual(handler.retry_interval_secs,
102-
defaults['RETRY_INTERVAL_SECS'])
102+
sample_options['retry_interval_secs'])
103103

104104
# Set the Flush-related Variables
105105
self.assertEqual(handler.buf, [])
@@ -119,7 +119,6 @@ def test_handler(self):
119119
self.assertIsInstance(handler.request_thread_pool, ThreadPoolExecutor)
120120
self.assertEqual(handler.level, logging.DEBUG)
121121

122-
@ordered
123122
def test_flusher(self):
124123
handler = LogDNAHandler(LOGDNA_API_KEY, sample_options)
125124
self.assertIsNone(handler.flusher)
@@ -128,59 +127,73 @@ def test_flusher(self):
128127
handler.close_flusher()
129128
self.assertIsNone(handler.flusher)
130129

131-
@ordered
132130
def test_emit(self):
133131
handler = LogDNAHandler(LOGDNA_API_KEY, sample_options)
134132
handler.buffer_log = unittest.mock.Mock()
135133
handler.emit(sample_record)
136134
sample_message['timestamp'] = unittest.mock.ANY
137135
handler.buffer_log.assert_called_once_with(sample_message)
138136

139-
@ordered
140137
@mock.patch('time.time', unittest.mock.MagicMock(return_value=now))
141138
def test_try_request(self):
142-
r = requests.Response()
143-
r.status_code = 200
144-
r.reason = 'OK'
145-
requests.post = unittest.mock.Mock(return_value=r)
146-
handler = LogDNAHandler(LOGDNA_API_KEY, sample_options)
147-
sample_message['timestamp'] = unittest.mock.ANY
148-
handler.buf = [sample_message]
149-
handler.try_request()
150-
self.assertFalse(handler.exception_flag)
151-
requests.post.assert_called_with(
152-
url=handler.url,
153-
json={
154-
'e': 'ls',
155-
'ls': handler.buf
156-
},
157-
auth=('user', handler.key),
158-
params={
159-
'hostname': handler.hostname,
160-
'ip': handler.ip,
161-
'mac': handler.mac,
162-
'tags': handler.tags,
163-
'now': int(now * 1000)
164-
},
165-
stream=True,
166-
allow_redirects=True,
167-
timeout=handler.request_timeout,
168-
headers={'user-agent': handler.user_agent})
169-
170-
@ordered
139+
with patch('requests.post') as post_mock:
140+
r = requests.Response()
141+
r.status_code = 200
142+
r.reason = 'OK'
143+
post_mock.return_value = r
144+
handler = LogDNAHandler(LOGDNA_API_KEY, sample_options)
145+
sample_message['timestamp'] = unittest.mock.ANY
146+
handler.buf = [sample_message]
147+
handler.try_request()
148+
post_mock.assert_called_with(
149+
url=handler.url,
150+
json={
151+
'e': 'ls',
152+
'ls': handler.buf
153+
},
154+
auth=('user', handler.key),
155+
params={
156+
'hostname': handler.hostname,
157+
'ip': handler.ip,
158+
'mac': handler.mac,
159+
'tags': handler.tags,
160+
'now': int(now * 1000)
161+
},
162+
stream=True,
163+
allow_redirects=True,
164+
timeout=handler.request_timeout,
165+
headers={'user-agent': handler.user_agent})
166+
self.assertFalse(handler.exception_flag)
167+
self.assertTrue(post_mock.call_count, 1)
168+
171169
@mock.patch('time.time', unittest.mock.MagicMock(return_value=now))
172170
def test_try_request_500(self):
173-
r = requests.Response()
174-
r.status_code = 500
175-
r.reason = 'OK'
176-
requests.post = unittest.mock.Mock(return_value=r)
177-
handler = LogDNAHandler(LOGDNA_API_KEY, sample_options)
178-
sample_message['timestamp'] = unittest.mock.ANY
179-
handler.buf = [sample_message]
180-
handler.try_request()
181-
self.assertTrue(handler.exception_flag)
171+
with patch('requests.post') as post_mock:
172+
r = requests.Response()
173+
r.status_code = 500
174+
r.reason = 'OK'
175+
post_mock.return_value = r
176+
handler = LogDNAHandler(LOGDNA_API_KEY, sample_options)
177+
sample_message['timestamp'] = unittest.mock.ANY
178+
handler.buf = [sample_message]
179+
handler.try_request()
180+
self.assertTrue(handler.exception_flag)
181+
self.assertTrue(post_mock.call_count, 3)
182+
183+
@mock.patch('time.time', unittest.mock.MagicMock(return_value=now))
184+
def test_try_request_403(self):
185+
with patch('requests.post') as post_mock:
186+
r = requests.Response()
187+
r.status_code = 403
188+
r.reason = 'OK'
189+
post_mock.return_value = r
190+
handler = LogDNAHandler(LOGDNA_API_KEY, sample_options)
191+
sample_message['timestamp'] = unittest.mock.ANY
192+
handler.buf = [sample_message]
193+
handler.try_request()
194+
self.assertFalse(handler.exception_flag)
195+
self.assertTrue(post_mock.call_count, 1)
182196

183-
@ordered
184197
def test_close(self):
185198
handler = LogDNAHandler(LOGDNA_API_KEY, sample_options)
186199
handler.close_flusher = unittest.mock.Mock()
@@ -191,7 +204,6 @@ def test_close(self):
191204
self.assertIsNone(handler.worker_thread_pool)
192205
self.assertIsNone(handler.request_thread_pool)
193206

194-
@ordered
195207
def test_flush(self):
196208
handler = LogDNAHandler(LOGDNA_API_KEY, sample_options)
197209
handler.worker_thread_pool = MockThreadPoolExecutor()
@@ -201,7 +213,6 @@ def test_flush(self):
201213
handler.flush()
202214
handler.try_request.assert_called_once_with()
203215

204-
@ordered
205216
def test_flush_secondary(self):
206217
handler = LogDNAHandler(LOGDNA_API_KEY, sample_options)
207218
clean = handler.clean_after_success
@@ -221,7 +232,6 @@ def test_flush_secondary(self):
221232
self.assertEqual(handler.secondary, [])
222233
self.assertEqual(handler.buf, [])
223234

224-
@ordered
225235
def test_buffer_log(self):
226236
handler = LogDNAHandler(LOGDNA_API_KEY, sample_options)
227237
handler.worker_thread_pool = MockThreadPoolExecutor()

tests/test_utils.py

Lines changed: 0 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -59,20 +59,3 @@ def test_normalize_simple(self):
5959
self.assertEqual(value1, ['a', 'b'])
6060
self.assertEqual(value1, value2)
6161
self.assertEqual(value3, [])
62-
63-
64-
def _make_orderer():
65-
order = {}
66-
67-
def ordered(f):
68-
order[f.__name__] = len(order)
69-
return f
70-
71-
def compare(a, b):
72-
return [1, -1][order[a] > order[b]]
73-
74-
return ordered, compare
75-
76-
77-
ordered, _compare = _make_orderer()
78-
unittest.loader.TestLoader.sortTestMethodsUsing = lambda _, x, y: _compare(y, x)

0 commit comments

Comments
 (0)