summaryrefslogtreecommitdiff
path: root/yaksh/tests/test_code_server.py
diff options
context:
space:
mode:
authorPrabhu Ramachandran2016-08-12 21:01:08 +0530
committerPrabhu Ramachandran2016-08-12 21:01:08 +0530
commitb39eb538c08d4dd6761d6a970aadf58bde58a7ce (patch)
tree6732cb4c0f89ffc80b7b9aa60d54e2d3ff5c70f0 /yaksh/tests/test_code_server.py
parent3738c8fefa8ac69508bb6daeee045c1f5ea0cb17 (diff)
downloadonline_test-b39eb538c08d4dd6761d6a970aadf58bde58a7ce.tar.gz
online_test-b39eb538c08d4dd6761d6a970aadf58bde58a7ce.tar.bz2
online_test-b39eb538c08d4dd6761d6a970aadf58bde58a7ce.zip
Use a tornado based server for the pool server.
With the previous XMLRPC based server, an XMLRPC server would respond to a request for an available port. This does not work as the server can only take about 2 simultaneous connections. The server pool now uses a HTTP server via tornado which works extremely well. The django code should not change at all as this is an internal change. This change should make the code server far more robust and work for a very large number of simultaneous users. The http server also has a simple status page to indicate the current load. This will not be correct on OSX due to limitations of the multi-processing Queue implementation on OSX.
Diffstat (limited to 'yaksh/tests/test_code_server.py')
-rw-r--r--yaksh/tests/test_code_server.py39
1 files changed, 26 insertions, 13 deletions
diff --git a/yaksh/tests/test_code_server.py b/yaksh/tests/test_code_server.py
index 18510c6..a73f073 100644
--- a/yaksh/tests/test_code_server.py
+++ b/yaksh/tests/test_code_server.py
@@ -1,17 +1,15 @@
import json
-from multiprocessing import Process
try:
from Queue import Queue
except ImportError:
from queue import Queue
from threading import Thread
import unittest
-
+import urllib
from yaksh.code_server import ServerPool, SERVER_POOL_PORT
-
from yaksh import settings
-from yaksh.xmlrpc_clients import code_server
+from yaksh.xmlrpc_clients import CodeServerProxy
class TestCodeServer(unittest.TestCase):
@@ -23,24 +21,26 @@ class TestCodeServer(unittest.TestCase):
ports = range(8001, 8006)
server_pool = ServerPool(ports=ports, pool_port=SERVER_POOL_PORT)
cls.server_pool = server_pool
- cls.server_proc = p = Process(target=server_pool.run)
- p.start()
-
+ cls.server_thread = t = Thread(target=server_pool.run)
+ t.start()
@classmethod
def tearDownClass(cls):
cls.server_pool.stop()
- cls.server_proc.terminate()
+ cls.server_thread.join()
settings.code_evaluators['python']['standardtestcase'] = \
"python_assertion_evaluator.PythonAssertionEvaluator"
+ def setUp(self):
+ self.code_server = CodeServerProxy()
+
def test_inifinite_loop(self):
# Given
testdata = {'user_answer': 'while True: pass',
'test_case_data': [{'test_case':'assert 1==2'}]}
# When
- result = code_server.run_code(
+ result = self.code_server.run_code(
'python', 'standardtestcase', json.dumps(testdata), ''
)
@@ -55,7 +55,7 @@ class TestCodeServer(unittest.TestCase):
'test_case_data': [{'test_case':'assert f() == 1'}]}
# When
- result = code_server.run_code(
+ result = self.code_server.run_code(
'python', 'standardtestcase', json.dumps(testdata), ''
)
@@ -70,7 +70,7 @@ class TestCodeServer(unittest.TestCase):
'test_case_data': [{'test_case':'assert f() == 2'}]}
# When
- result = code_server.run_code(
+ result = self.code_server.run_code(
'python', 'standardtestcase', json.dumps(testdata), ''
)
@@ -87,12 +87,12 @@ class TestCodeServer(unittest.TestCase):
"""Run an infinite loop."""
testdata = {'user_answer': 'while True: pass',
'test_case_data': [{'test_case':'assert 1==2'}]}
- result = code_server.run_code(
+ result = self.code_server.run_code(
'python', 'standardtestcase', json.dumps(testdata), ''
)
results.put(json.loads(result))
- N = 5
+ N = 10
# When
import time
threads = []
@@ -112,6 +112,19 @@ class TestCodeServer(unittest.TestCase):
self.assertFalse(data['success'])
self.assertTrue('infinite loop' in data['error'])
+ def test_server_pool_status(self):
+ # Given
+ url = "http://localhost:%s/status"%SERVER_POOL_PORT
+
+ # When
+ data = urllib.urlopen(url).read()
+
+ # Then
+ expect = 'out of 5 are free'
+ self.assertTrue(expect in data)
+ expect = 'Load:'
+ self.assertTrue(expect in data)
+
if __name__ == '__main__':
unittest.main()