/js/lib/Socket.IO-node/tests/listener.js

http://github.com/onedayitwillmake/RealtimeMultiplayerNodeJs · JavaScript · 157 lines · 139 code · 17 blank · 1 comment · 15 complexity · d0ca72a6894ed2d6ad2ebbd6bf1ac4c3 MD5 · raw file

  1. var http = require('http')
  2. , net = require('net')
  3. , io = require('socket.io')
  4. , assert = require('assert')
  5. , decode = require('socket.io/utils').decode
  6. , port = 7100
  7. , Listener = io.Listener
  8. , WebSocket = require('./../support/node-websocket-client/lib/websocket').WebSocket;
  9. function server(callback){
  10. return http.createServer(callback || function(){});
  11. };
  12. function socket(server, options){
  13. if (!options) options = {};
  14. if (options.log === undefined) options.log = false;
  15. return io.listen(server, options);
  16. };
  17. function listen(s, callback){
  18. s._port = port;
  19. s.listen(port, callback);
  20. port++;
  21. return s;
  22. };
  23. function client(server, sessid){
  24. sessid = sessid ? '/' + sessid : '';
  25. return new WebSocket('ws://localhost:' + server._port + '/socket.io/websocket' + sessid, 'borf');
  26. };
  27. module.exports = {
  28. 'test serving static javascript client': function(){
  29. var _server = server()
  30. , _socket = socket(_server);
  31. assert.response(_server
  32. , { url: '/socket.io/socket.io.js' }
  33. , { body: /setPath/, headers: { 'Content-Type': 'text/javascript' }});
  34. assert.response(_server
  35. , { url: '/socket.io/lib/vendor/web-socket-js/WebSocketMain.swf' }
  36. , { headers: { 'Content-Type': 'application/x-shockwave-flash' }}
  37. , function(resp){
  38. assert.type(resp.headers.etag, 'string');
  39. assert.response(_server
  40. , { url: '/socket.io/lib/vendor/web-socket-js/WebSocketMain.swf', headers: { 'If-None-Match': resp.headers.etag } }
  41. , { status: 304 });
  42. });
  43. assert.response(_server
  44. , { url: '/socket.io/WebSocketMain.swf' }
  45. , { headers: { 'Content-Type': 'application/x-shockwave-flash' }});
  46. },
  47. 'test serving non-socket.io requests': function(){
  48. var _server = server()
  49. , _socket = socket(_server);
  50. _server.on('request', function(req, res){
  51. if (req.url == '/test'){
  52. res.writeHead(200);
  53. res.end('Hello world');
  54. }
  55. });
  56. assert.response(_server
  57. , { url: '/test' }
  58. , { body: 'Hello world' });
  59. },
  60. 'test destroying an upgrade connection that is not WebSocket': function(){
  61. var _server = server()
  62. , _socket = socket(_server);
  63. listen(_server, function(){
  64. var client = http.createClient(_server._port)
  65. , request = client.request('/', {
  66. 'Connection': 'Upgrade',
  67. 'Upgrade': 'IRC'
  68. })
  69. , upgraded = false;
  70. client.addListener('upgrade', function(){
  71. upgraded = true;
  72. });
  73. client.addListener('end', function(){
  74. assert.ok(! upgraded);
  75. _server.close();
  76. });
  77. client.on('error', function (e) {
  78. // ignore errors
  79. });
  80. request.end();
  81. });
  82. },
  83. 'test broadcasting to clients': function(){
  84. var _server = server()
  85. , _socket = socket(_server);
  86. listen(_server, function(){
  87. var _client1 = client(_server)
  88. , _client2 = client(_server)
  89. , trips = 2
  90. , expected = 2;
  91. _socket.on('connection', function(conn){
  92. --expected || _socket.broadcast('broadcasted msg');
  93. });
  94. function close(){
  95. _client1.close();
  96. _client2.close();
  97. _server.close();
  98. };
  99. _client1.onmessage = function(ev){
  100. if (!_client1._first){
  101. _client1._first = true;
  102. } else {
  103. assert.ok(decode(ev.data)[0] == 'broadcasted msg');
  104. --trips || close();
  105. }
  106. };
  107. _client2.onmessage = function(ev){
  108. if (!_client2._first){
  109. _client2._first = true;
  110. } else {
  111. assert.ok(decode(ev.data)[0] == 'broadcasted msg');
  112. --trips || close();
  113. }
  114. };
  115. })
  116. },
  117. 'test connecting with an invalid sessionid': function(){
  118. var _server = server()
  119. , _socket = socket(_server);
  120. listen(_server, function(){
  121. var _client = client(_server, 'fake-session-id')
  122. , gotMessage = false;
  123. _client.onmessage = function(){
  124. gotMessage = true;
  125. };
  126. setTimeout(function(){
  127. assert.ok(!gotMessage);
  128. _server.close();
  129. }, 200);
  130. });
  131. },
  132. 'test connecting to an invalid transport': function(){
  133. var _server = server(function(req, res){
  134. res.writeHead(200);
  135. res.end(req.url == '/socket.io/inexistent' ? 'All cool' : '');
  136. })
  137. , _socket = socket(_server);
  138. assert.response(_server, { url: '/socket.io/inexistent' }, { body: 'All cool' });
  139. }
  140. };