[tor-commits] [oonib/master] Improved http error handling, the test coverage and some cleanups

art at torproject.org art at torproject.org
Thu Aug 28 17:28:02 UTC 2014


commit df768a6c02bef81a7d4f58e14057e74cfcc2eca5
Author: kudrom <kudrom at riseup.net>
Date:   Sat Jul 5 15:52:58 2014 +0200

    Improved http error handling, the test coverage and some cleanups
---
 .gitignore                        |    2 ++
 oonib/api.py                      |    2 ++
 oonib/handlers.py                 |    4 +++-
 oonib/main/api.py                 |    8 ++++++++
 oonib/main/handlers.py            |   19 +++++++++++++++++++
 oonib/test/handler_helpers.py     |    8 ++++++++
 oonib/test/test_global_handler.py |   19 +++++++++++++++++++
 oonib/test/test_report.py         |    5 +++++
 8 files changed, 66 insertions(+), 1 deletion(-)

diff --git a/.gitignore b/.gitignore
index 628ccf5..7fc5cbd 100644
--- a/.gitignore
+++ b/.gitignore
@@ -61,3 +61,5 @@ installed-files.txt
 
 # client config:
 oonib.conf
+
+oonib.pid
diff --git a/oonib/api.py b/oonib/api.py
index 2427837..baa151b 100644
--- a/oonib/api.py
+++ b/oonib/api.py
@@ -1,5 +1,6 @@
 from cyclone import web
 
+from oonib.main.api import mainAPI
 from oonib.deck.api import deckAPI
 from oonib.report.api import reportAPI
 from oonib.input.api import inputAPI
@@ -24,4 +25,5 @@ if config.main.policy_file:
 if config.main.bouncer_file:
     ooniBouncer = web.Application(bouncerAPI, debug=True, name='bouncer')
 
+ooniBackendAPI += mainAPI
 ooniBackend = web.Application(ooniBackendAPI, debug=True, name='collector')
diff --git a/oonib/handlers.py b/oonib/handlers.py
index f92d684..bbf8ade 100644
--- a/oonib/handlers.py
+++ b/oonib/handlers.py
@@ -9,8 +9,10 @@ from oonib import log
 class OONIBHandler(web.RequestHandler):
     def write_error(self, status_code, exception=None, **kw):
         self.set_status(status_code)
-        if hasattr(exception, 'log_message'):
+        if hasattr(exception, 'log_message') and exception.log_message is not None:
             self.write({'error': exception.log_message})
+        elif 400 <= status_code < 600:
+            self.write({'error': status_code})
         else:
             log.error(exception)
             self.write({'error': 'error'})
diff --git a/oonib/main/__init__.py b/oonib/main/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/oonib/main/api.py b/oonib/main/api.py
new file mode 100644
index 0000000..5bc9761
--- /dev/null
+++ b/oonib/main/api.py
@@ -0,0 +1,8 @@
+from cyclone import web
+
+from oonib.main import handlers
+from oonib.config import config
+
+mainAPI = [
+    (r"/.*", handlers.OONIBGlobalHandler)
+]
diff --git a/oonib/main/handlers.py b/oonib/main/handlers.py
new file mode 100644
index 0000000..37810e7
--- /dev/null
+++ b/oonib/main/handlers.py
@@ -0,0 +1,19 @@
+from oonib.handlers import OONIBHandler
+
+
+class OONIBGlobalHandler(OONIBHandler):
+    """
+        Global handler to catch all orphaned requests.
+    """
+    def default(self):
+        # XXX: Waiting to a stable release of cyclone which implements the default handler
+        return self.write_error(404)
+
+    def get(self):
+        return self.default()
+
+    def post(self):
+        return self.default()
+
+    def options(self):
+        return self.default()
diff --git a/oonib/test/handler_helpers.py b/oonib/test/handler_helpers.py
index 2d704a2..843d5c5 100644
--- a/oonib/test/handler_helpers.py
+++ b/oonib/test/handler_helpers.py
@@ -1,5 +1,7 @@
+import os
 import socket
 import json
+import shutil
 
 from twisted.internet import reactor, defer
 from twisted.trial import unittest
@@ -38,11 +40,17 @@ class HandlerTestCase(unittest.TestCase):
         return self._port
 
     def setUp(self, *args, **kw):
+        self.filenames = set()
+        self.directories = set()
         if self.app:
             self._listener = reactor.listenTCP(self.port, self.app)
         return unittest.TestCase.setUp(self, *args, **kw)
 
     def tearDown(self):
+        for filename in self.filenames:
+            os.remove(filename)
+        for dir in self.directories:
+            shutil.rmtree(dir)
         if self._listener:
             for report in reports.values():
                 try:
diff --git a/oonib/test/test_global_handler.py b/oonib/test/test_global_handler.py
new file mode 100644
index 0000000..675cf6c
--- /dev/null
+++ b/oonib/test/test_global_handler.py
@@ -0,0 +1,19 @@
+import json
+
+from twisted.internet import defer
+
+from cyclone import web
+
+from oonib.test.handler_helpers import HandlerTestCase
+from oonib.main.api import mainAPI
+
+
+class GlobalHandler(HandlerTestCase):
+    app = web.Application(mainAPI, name='mainAPI')
+
+    @defer.inlineCallbacks
+    def test_global_handler(self):
+        response = yield self.request("/foo")
+        res = json.loads(response.body)
+        self.assertIn("error", res.keys())
+        self.assertIn(404, res.values())
diff --git a/oonib/test/test_report.py b/oonib/test/test_report.py
index 9ed02de..698b667 100644
--- a/oonib/test/test_report.py
+++ b/oonib/test/test_report.py
@@ -87,6 +87,7 @@ class TestReport(HandlerTestCase):
         response_body = json.loads(response.body)
         self.assertIn('backend_version', response_body)
         self.assertIn('report_id', response_body)
+        self.filenames.add(response_body['report_id'])
 
     @defer.inlineCallbacks
     def test_create_invalid_report(self):
@@ -121,6 +122,7 @@ class TestReport(HandlerTestCase):
         response_body = json.loads(response.body)
 
         with open(report_id) as f:
+            self.filenames.add(report_id)
             written_report = yaml.safe_load_all(f)
 
             written_report_header = written_report.next()
@@ -165,9 +167,12 @@ class TestReport(HandlerTestCase):
         written_report_path = os.path.join(written_report_header['probe_cc'],
                                            report_file_name(written_report_header))
         with open(written_report_path) as f:
+            self.filenames.add(written_report_path)
             written_report = yaml.safe_load_all(f)
             written_report.next()
 
             for i in range(report_entry_count):
                 self.assertEqual(yaml.safe_load(sample_report_entry),
                                  written_report.next())
+
+        self.directories.add('ZZ')





More information about the tor-commits mailing list