Merge changes
This commit is contained in:
commit
43c294f6e6
17 changed files with 1101 additions and 892 deletions
186
socketIO_client/tests/__init__.py
Normal file
186
socketIO_client/tests/__init__.py
Normal file
|
|
@ -0,0 +1,186 @@
|
|||
import logging
|
||||
import time
|
||||
from unittest import TestCase
|
||||
|
||||
from .. import SocketIO, LoggingNamespace, find_callback
|
||||
|
||||
|
||||
HOST = 'localhost'
|
||||
PORT = 8000
|
||||
DATA = 'xxx'
|
||||
PAYLOAD = {'xxx': 'yyy'}
|
||||
logging.basicConfig(level=logging.DEBUG)
|
||||
|
||||
|
||||
class BaseMixin(object):
|
||||
|
||||
def setUp(self):
|
||||
super(BaseMixin, self).setUp()
|
||||
self.called_on_response = False
|
||||
|
||||
def tearDown(self):
|
||||
super(BaseMixin, self).tearDown()
|
||||
del self.socketIO
|
||||
|
||||
def test_disconnect(self):
|
||||
'Disconnect'
|
||||
self.assertTrue(self.socketIO.connected)
|
||||
self.socketIO.disconnect()
|
||||
self.assertFalse(self.socketIO.connected)
|
||||
# Use context manager
|
||||
with SocketIO(HOST, PORT, Namespace) as self.socketIO:
|
||||
namespace = self.socketIO.get_namespace()
|
||||
self.assertFalse(namespace.called_on_disconnect)
|
||||
self.assertTrue(self.socketIO.connected)
|
||||
self.assertTrue(namespace.called_on_disconnect)
|
||||
self.assertFalse(self.socketIO.connected)
|
||||
|
||||
def test_emit(self):
|
||||
'Emit'
|
||||
namespace = self.socketIO.define(Namespace)
|
||||
self.socketIO.emit('emit')
|
||||
self.socketIO.wait(self.wait_time_in_seconds)
|
||||
self.assertEqual(namespace.args_by_event, {
|
||||
'emit_response': (),
|
||||
})
|
||||
|
||||
def test_emit_with_payload(self):
|
||||
'Emit with payload'
|
||||
namespace = self.socketIO.define(Namespace)
|
||||
self.socketIO.emit('emit_with_payload', PAYLOAD)
|
||||
self.socketIO.wait(self.wait_time_in_seconds)
|
||||
self.assertEqual(namespace.args_by_event, {
|
||||
'emit_with_payload_response': (PAYLOAD,),
|
||||
})
|
||||
|
||||
def test_emit_with_multiple_payloads(self):
|
||||
'Emit with multiple payloads'
|
||||
namespace = self.socketIO.define(Namespace)
|
||||
self.socketIO.emit('emit_with_multiple_payloads', PAYLOAD, PAYLOAD)
|
||||
self.socketIO.wait(self.wait_time_in_seconds)
|
||||
self.assertEqual(namespace.args_by_event, {
|
||||
'emit_with_multiple_payloads_response': (PAYLOAD, PAYLOAD),
|
||||
})
|
||||
|
||||
def test_emit_with_callback(self):
|
||||
'Emit with callback'
|
||||
self.socketIO.emit('emit_with_callback', self.on_response)
|
||||
self.socketIO.wait_for_callbacks(seconds=self.wait_time_in_seconds)
|
||||
self.assertTrue(self.called_on_response)
|
||||
|
||||
def test_emit_with_callback_with_payload(self):
|
||||
'Emit with callback with payload'
|
||||
self.socketIO.emit(
|
||||
'emit_with_callback_with_payload', self.on_response)
|
||||
self.socketIO.wait_for_callbacks(seconds=self.wait_time_in_seconds)
|
||||
self.assertTrue(self.called_on_response)
|
||||
|
||||
def test_emit_with_callback_with_multiple_payloads(self):
|
||||
'Emit with callback with multiple payloads'
|
||||
self.socketIO.emit(
|
||||
'emit_with_callback_with_multiple_payloads', self.on_response)
|
||||
self.socketIO.wait_for_callbacks(seconds=self.wait_time_in_seconds)
|
||||
self.assertTrue(self.called_on_response)
|
||||
|
||||
def test_emit_with_event(self):
|
||||
'Emit to trigger an event'
|
||||
self.socketIO.on('emit_with_event_response', self.on_response)
|
||||
self.socketIO.emit('emit_with_event', PAYLOAD)
|
||||
self.socketIO.wait(self.wait_time_in_seconds)
|
||||
self.assertTrue(self.called_on_response)
|
||||
|
||||
def test_send(self):
|
||||
'Send'
|
||||
namespace = self.socketIO.define(Namespace)
|
||||
self.socketIO.send()
|
||||
self.socketIO.wait(self.wait_time_in_seconds)
|
||||
self.assertEqual(namespace.response, 'message_response')
|
||||
|
||||
def test_send_with_data(self):
|
||||
'Send with data'
|
||||
namespace = self.socketIO.define(Namespace)
|
||||
self.socketIO.send(DATA)
|
||||
self.socketIO.wait(self.wait_time_in_seconds)
|
||||
self.assertEqual(namespace.response, DATA)
|
||||
|
||||
def test_ack(self):
|
||||
'Respond to a server callback request'
|
||||
namespace = self.socketIO.define(Namespace)
|
||||
self.socketIO.emit('trigger_server_expects_callback', PAYLOAD)
|
||||
self.socketIO.wait(self.wait_time_in_seconds)
|
||||
self.assertEqual(namespace.args_by_event, {
|
||||
'server_expects_callback': (PAYLOAD,),
|
||||
'server_received_callback': (PAYLOAD,),
|
||||
})
|
||||
|
||||
def test_wait_with_disconnect(self):
|
||||
'Exit loop when the client wants to disconnect'
|
||||
self.socketIO.define(Namespace)
|
||||
self.socketIO.emit('wait_with_disconnect')
|
||||
timeout_in_seconds = 5
|
||||
start_time = time.time()
|
||||
self.socketIO.wait(timeout_in_seconds)
|
||||
self.assertTrue(time.time() - start_time < timeout_in_seconds)
|
||||
|
||||
def test_namespace_emit(self):
|
||||
'Behave differently in different namespaces'
|
||||
main_namespace = self.socketIO.define(Namespace)
|
||||
chat_namespace = self.socketIO.define(Namespace, '/chat')
|
||||
news_namespace = self.socketIO.define(Namespace, '/news')
|
||||
news_namespace.emit('emit_with_payload', PAYLOAD)
|
||||
self.socketIO.wait(self.wait_time_in_seconds)
|
||||
self.assertEqual(main_namespace.args_by_event, {})
|
||||
self.assertEqual(chat_namespace.args_by_event, {})
|
||||
self.assertEqual(news_namespace.args_by_event, {
|
||||
'emit_with_payload_response': (PAYLOAD,),
|
||||
})
|
||||
|
||||
def test_namespace_ack(self):
|
||||
'Respond to a server callback request within a namespace'
|
||||
chat_namespace = self.socketIO.define(Namespace, '/chat')
|
||||
chat_namespace.emit('trigger_server_expects_callback', PAYLOAD)
|
||||
self.socketIO.wait(self.wait_time_in_seconds)
|
||||
self.assertEqual(chat_namespace.args_by_event, {
|
||||
'server_expects_callback': (PAYLOAD,),
|
||||
'server_received_callback': (PAYLOAD,),
|
||||
})
|
||||
|
||||
def on_response(self, *args):
|
||||
for arg in args:
|
||||
if isinstance(arg, dict):
|
||||
self.assertEqual(arg, PAYLOAD)
|
||||
else:
|
||||
self.assertEqual(arg, DATA)
|
||||
self.called_on_response = True
|
||||
|
||||
|
||||
class Test_XHR_PollingTransport(BaseMixin, TestCase):
|
||||
|
||||
def setUp(self):
|
||||
super(Test_XHR_PollingTransport, self).setUp()
|
||||
self.socketIO = SocketIO(HOST, PORT, LoggingNamespace, transports=[
|
||||
'xhr-polling'])
|
||||
self.wait_time_in_seconds = 1
|
||||
|
||||
|
||||
class Namespace(LoggingNamespace):
|
||||
|
||||
def initialize(self):
|
||||
self.called_on_disconnect = False
|
||||
self.args_by_event = {}
|
||||
self.response = None
|
||||
|
||||
def on_disconnect(self):
|
||||
self.called_on_disconnect = True
|
||||
|
||||
def on_wait_with_disconnect_response(self):
|
||||
self.disconnect()
|
||||
|
||||
def on_event(self, event, *args):
|
||||
callback, args = find_callback(args)
|
||||
if callback:
|
||||
callback(*args)
|
||||
self.args_by_event[event] = args
|
||||
|
||||
def on_message(self, data):
|
||||
self.response = data
|
||||
25
socketIO_client/tests/index.html
Normal file
25
socketIO_client/tests/index.html
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
<script src="/socket.io/socket.io.js"></script>
|
||||
<script>
|
||||
var socket = io('http://localhost');
|
||||
var chat = io('/chat');
|
||||
var news = io('/news');
|
||||
|
||||
socket.on('server_expects_callback', function(payload, fn) {fn(payload)});
|
||||
socket.emit('trigger_server_expects_callback', 'whee');
|
||||
socket.emit('emit');
|
||||
socket.emit('emit_with_payload');
|
||||
socket.emit('emit_with_multiple_payloads', 'aaa', 'bbb');
|
||||
socket.emit('emit_with_callback', function() {console.log('whee')});
|
||||
socket.emit('emit_with_callback_with_payload', function(x) {console.log('whee ' + x)});
|
||||
socket.emit('emit_with_callback_with_multiple_payloads', function(x, y) {console.log('whee ' + x + ' ' + y)});
|
||||
socket.emit('emit_with_event');
|
||||
socket.emit('aaa');
|
||||
|
||||
chat.on('server_expects_callback', function(payload, fn) {fn(payload)});
|
||||
chat.emit('trigger_server_expects_callback', 'whee');
|
||||
chat.emit('emit_with_payload');
|
||||
chat.emit('aaa');
|
||||
|
||||
news.emit('emit_with_payload');
|
||||
news.emit('aaa');
|
||||
</script>
|
||||
36
socketIO_client/tests/proxy.js
Normal file
36
socketIO_client/tests/proxy.js
Normal file
|
|
@ -0,0 +1,36 @@
|
|||
var proxy = require('http-proxy').createProxyServer({
|
||||
target: {host: 'localhost', port: 9000}
|
||||
}).on('error', function(err, req, res) {
|
||||
console.log('[ERROR] %s', err);
|
||||
res.end();
|
||||
});
|
||||
var server = require('http').createServer(function(req, res) {
|
||||
console.log('[REQUEST.%s] %s', req.method, req.url);
|
||||
console.log(req['headers']);
|
||||
if (req.method == 'POST') {
|
||||
var body = '';
|
||||
req.on('data', function (data) {
|
||||
body += data;
|
||||
});
|
||||
req.on('end', function () {
|
||||
print_body('[REQUEST.BODY] ', body);
|
||||
});
|
||||
}
|
||||
var write = res.write;
|
||||
res.write = function(data) {
|
||||
print_body('[RESPONSE.BODY] ', data);
|
||||
write.call(res, data);
|
||||
}
|
||||
proxy.web(req, res);
|
||||
});
|
||||
function print_body(header, body) {
|
||||
var text = String(body);
|
||||
console.log(header + text);
|
||||
if (text.charCodeAt(0) != 0) return;
|
||||
for (var i = 0; i < text.length; i++) {
|
||||
var character_code = text.charCodeAt(i);
|
||||
console.log('body[%s] = %s = %s', i, text[i], character_code);
|
||||
if (character_code == 65533) break;
|
||||
}
|
||||
}
|
||||
server.listen(8000);
|
||||
90
socketIO_client/tests/serve.js
Normal file
90
socketIO_client/tests/serve.js
Normal file
|
|
@ -0,0 +1,90 @@
|
|||
// DEBUG=* node serve.js
|
||||
|
||||
var app = require('http').createServer(serve).listen(9000);
|
||||
var io = require('socket.io')(app);
|
||||
var fs = require('fs');
|
||||
var PAYLOAD = {'xxx': 'yyy'};
|
||||
|
||||
io.on('connection', function(socket) {
|
||||
socket.on('message', function(data, fn) {
|
||||
if (fn) {
|
||||
// Client requests callback
|
||||
if (data) {
|
||||
fn(data);
|
||||
} else {
|
||||
fn();
|
||||
}
|
||||
} else if (typeof data === 'object') {
|
||||
// Data has type object or is null
|
||||
socket.json.send(data ? data : 'message_response');
|
||||
} else {
|
||||
// Data has type string or is ''
|
||||
socket.send(data ? data : 'message_response');
|
||||
}
|
||||
});
|
||||
socket.on('emit', function() {
|
||||
socket.emit('emit_response');
|
||||
});
|
||||
socket.on('emit_with_payload', function(payload) {
|
||||
socket.emit('emit_with_payload_response', payload);
|
||||
});
|
||||
socket.on('emit_with_multiple_payloads', function(payload1, payload2) {
|
||||
socket.emit('emit_with_multiple_payloads_response', payload1, payload2);
|
||||
});
|
||||
socket.on('emit_with_callback', function(fn) {
|
||||
fn();
|
||||
});
|
||||
socket.on('emit_with_callback_with_payload', function(fn) {
|
||||
fn(PAYLOAD);
|
||||
});
|
||||
socket.on('emit_with_callback_with_multiple_payloads', function(fn) {
|
||||
fn(PAYLOAD, PAYLOAD);
|
||||
});
|
||||
socket.on('emit_with_event', function(payload) {
|
||||
socket.emit('emit_with_event_response', payload);
|
||||
});
|
||||
socket.on('trigger_server_expects_callback', function(payload) {
|
||||
socket.emit('server_expects_callback', payload, function(payload) {
|
||||
socket.emit('server_received_callback', payload);
|
||||
});
|
||||
});
|
||||
socket.on('aaa', function() {
|
||||
socket.emit('aaa_response', PAYLOAD);
|
||||
});
|
||||
socket.on('bbb', function(payload, fn) {
|
||||
if (fn) fn(payload);
|
||||
});
|
||||
socket.on('wait_with_disconnect', function() {
|
||||
socket.emit('wait_with_disconnect_response');
|
||||
});
|
||||
});
|
||||
|
||||
io.of('/chat').on('connection', function(socket) {
|
||||
socket.on('emit_with_payload', function(payload) {
|
||||
socket.emit('emit_with_payload_response', payload);
|
||||
});
|
||||
socket.on('aaa', function() {
|
||||
socket.emit('aaa_response', 'in chat');
|
||||
});
|
||||
socket.on('trigger_server_expects_callback', function(payload) {
|
||||
socket.emit('server_expects_callback', payload, function(payload) {
|
||||
socket.emit('server_received_callback', payload);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
io.of('/news').on('connection', function(socket) {
|
||||
socket.on('emit_with_payload', function(payload) {
|
||||
socket.emit('emit_with_payload_response', payload);
|
||||
});
|
||||
socket.on('aaa', function() {
|
||||
socket.emit('aaa_response', 'in news');
|
||||
});
|
||||
});
|
||||
|
||||
function serve(req, res) {
|
||||
fs.readFile(__dirname + '/index.html', function(err, data) {
|
||||
res.writeHead(200);
|
||||
res.end(data);
|
||||
});
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue