Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 36 additions & 0 deletions tests/test_trace_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@
import threading
import time
import unittest
import urllib.error
import urllib.request
import uuid
from http.server import BaseHTTPRequestHandler, ThreadingHTTPServer
from unittest import mock
Expand Down Expand Up @@ -128,6 +130,40 @@ def test_report_does_not_raise_when_the_server_rejects_the_key(self):
client.close()
self.assertTrue(any("answered 401" in r.getMessage() for r in self.log), [r.getMessage() for r in self.log])

def test_a_201_is_delivered_without_logging_anything(self):
client = TraceClient(self.base_url, "MyGame", "1.2.3", key="k")
client.report("startup")
self.assertTrue(self.capture.arrived.wait(5))
client.close()
self.assertEqual([], [r.getMessage() for r in self.log], "success is silent")

def test_a_success_status_other_than_201_is_logged_as_not_delivered(self):
for status in (200, 204):
self.log.clear()
self.capture.reply_status = status
client = TraceClient(self.base_url, "MyGame", "1.2.3", key="k")
client.report("startup")
client.close() # joins the sender, so its log line is written by now
self.assertTrue(any("answered %d" % status in r.getMessage() for r in self.log),
"only a 201 is success: %s" % [r.getMessage() for r in self.log])
self.assertTrue(all(r.levelno == logging.DEBUG for r in self.log))

def test_an_error_answer_whose_body_cannot_be_read_still_logs_its_status(self):
class Unreadable(urllib.error.HTTPError):
def read(self, *args):
raise OSError("connection reset while reading the error body")

answer = Unreadable(self.base_url + "/api/metrics", 503, "Service Unavailable", {}, None)
crashes = []
with mock.patch.object(threading, "excepthook", crashes.append), \
mock.patch.object(urllib.request, "urlopen", side_effect=answer):
client = TraceClient(self.base_url, "MyGame", "1.2.3", key="k")
client.report("startup") # must not raise
client.close()
self.assertEqual([], crashes, "the sender thread must not die with a traceback on stderr")
self.assertTrue(any("answered 503" in r.getMessage() for r in self.log), [r.getMessage() for r in self.log])
self.assertTrue(all(r.levelno == logging.DEBUG for r in self.log))

def test_disabled_client_sends_nothing(self):
for client in (TraceClient(self.base_url, "MyGame", "1.2.3", key="k", enabled=False),
TraceClient(self.base_url, "MyGame", "1.2.3"),
Expand Down
Loading