/js/lib/Socket.IO-node/tests/transports.htmlfile.js

http://github.com/onedayitwillmake/RealtimeMultiplayerNodeJs · JavaScript · 217 lines · 190 code · 24 blank · 3 comment · 24 complexity · af0c159e3b7443330e12005ef09e00b5 MD5 · raw file

  1. var io = require('socket.io')
  2. , net = require('net')
  3. , assert = require('assert')
  4. , http = require('http')
  5. , querystring = require('querystring')
  6. , port = 7600
  7. , encode = require('socket.io/utils').encode
  8. , decode = require('socket.io/utils').decode
  9. , EventEmitter = require('events').EventEmitter
  10. , HTMLFile = require('socket.io/transports/htmlfile');
  11. function server(callback){
  12. return http.createServer(function(){});
  13. };
  14. function listen(s, callback){
  15. s._port = port;
  16. s.listen(port, callback);
  17. port++;
  18. return s;
  19. };
  20. function client(s){
  21. return http.createClient(s._port, 'localhost');
  22. };
  23. function socket(server, options){
  24. if (!options) options = {};
  25. options.log = false;
  26. if (!options.transportOptions) options.transportOptions = {
  27. 'htmlfile': {
  28. // disable heartbeats for tests, re-enabled in heartbeat test below
  29. timeout: null
  30. }
  31. };
  32. return io.listen(server, options);
  33. };
  34. function get(server, url, assert, callback){
  35. var client = http.createClient(server._port)
  36. , request = client.request('GET', url, {host: 'localhost'})
  37. , emitter = new EventEmitter
  38. , messages = 0;
  39. request.end();
  40. request.on('response', function(resp){
  41. callback(emitter);
  42. resp.on('data', function(data){
  43. var msg = data.toString();
  44. if (++messages == 1){
  45. // make sure to send 256 bytes of data IE needs
  46. assert.ok(data.length >= 256);
  47. assert.ok(msg.indexOf('<html>') != -1);
  48. assert.ok(msg.indexOf('<body>') != -1);
  49. } else {
  50. // make sure element is wrapped in a script tag and a javascript call
  51. assert.ok(/^<script>parent.s\._\("/.test(msg));
  52. assert.ok(/", document\);<\/script>$/.test(msg));
  53. emitter.emit('data', msg.substr(20, msg.length - 42));
  54. }
  55. });
  56. });
  57. client.end = function(){
  58. if (request.abort)
  59. request.abort();
  60. else
  61. request.connection.destroy();
  62. };
  63. return client;
  64. };
  65. function post(client, url, data, callback){
  66. var query = querystring.stringify(data)
  67. , request = client.request('POST', url, {'Content-Length': Buffer.byteLength(query)});
  68. request.write(query);
  69. request.end();
  70. };
  71. module.exports = {
  72. 'test connection and handshake': function(){
  73. var _server = server()
  74. , _socket = socket(_server)
  75. , trips = 2;
  76. listen(_server, function(){
  77. var _client = get(_server, '/socket.io/htmlfile', assert, function(response){
  78. var i = 0;
  79. response.on('data', function(data){
  80. var msg = decode(data);
  81. switch (i++){
  82. case 0:
  83. assert.ok(Object.keys(_socket.clients).length == 1);
  84. assert.ok(msg == Object.keys(_socket.clients)[0]);
  85. assert.ok(_socket.clients[msg] instanceof HTMLFile);
  86. _socket.clients[msg].send('from server');
  87. post(client(_server), '/socket.io/htmlfile/' + msg + '/send', {data: encode('from client')});
  88. break;
  89. case 1:
  90. assert.ok(msg == 'from server');
  91. --trips || close();
  92. }
  93. });
  94. });
  95. _socket.on('connection', function(client){
  96. assert.ok(client instanceof HTMLFile);
  97. client.on('message', function(msg){
  98. --trips || close();
  99. });
  100. });
  101. function close(){
  102. _client.end();
  103. _server.close();
  104. };
  105. });
  106. },
  107. 'test clients tracking': function(){
  108. var _server = server()
  109. , _socket = socket(_server);
  110. listen(_server, function(){
  111. var _client = get(_server, '/socket.io/htmlfile', assert, function(response){
  112. var once = false
  113. response.on('data', function(){
  114. if (!once){
  115. assert.ok(Object.keys(_socket.clients).length == 1);
  116. once = true;
  117. var _client2 = get(_server, '/socket.io/htmlfile', assert, function(response){
  118. response.on('data', function(){
  119. assert.ok(Object.keys(_socket.clients).length == 2);
  120. _client.end();
  121. _client2.end();
  122. _server.close();
  123. });
  124. });
  125. }
  126. });
  127. });
  128. });
  129. },
  130. 'test buffered messages': function(){
  131. var _server = server()
  132. , _socket = socket(_server, { transportOptions: {
  133. 'htmlfile': {
  134. closeTimeout: 100
  135. }
  136. } });
  137. listen(_server, function(){
  138. var _client = get(_server, '/socket.io/htmlfile', assert, function(response){
  139. var once = false;
  140. response.on('data', function(data){
  141. if (!once){
  142. var sessid = decode(data);
  143. assert.ok(_socket.clients[sessid]._open === true);
  144. assert.ok(_socket.clients[sessid].connected);
  145. _socket.clients[sessid].connection.addListener('end', function(){
  146. assert.ok(_socket.clients[sessid]._open === false);
  147. assert.ok(_socket.clients[sessid].connected);
  148. _socket.clients[sessid].send('from server');
  149. _client = get(_server, '/socket.io/htmlfile/' + sessid, assert, function(response){
  150. response.on('data', function(data){
  151. assert.ok(decode(data) == 'from server');
  152. _client.end();
  153. _server.close();
  154. });
  155. });
  156. });
  157. _client.end();
  158. once = true;
  159. }
  160. });
  161. });
  162. });
  163. },
  164. 'test hearbeat timeout': function(){
  165. var _server = server()
  166. , _socket = socket(_server, {
  167. transportOptions: {
  168. 'htmlfile': {
  169. timeout: 100,
  170. heartbeatInterval: 1
  171. }
  172. }
  173. });
  174. listen(_server, function(){
  175. var client = get(_server, '/socket.io/htmlfile', assert, function(response){
  176. var messages = 0;
  177. response.on('data', function(data){
  178. ++messages;
  179. var msg = decode(data);
  180. if (msg[0].substr(0, 3) == '~h~'){
  181. assert.ok(messages == 2);
  182. assert.ok(Object.keys(_socket.clients).length == 1);
  183. setTimeout(function(){
  184. assert.ok(Object.keys(_socket.clients).length == 0);
  185. client.end();
  186. _server.close();
  187. }, 150);
  188. }
  189. });
  190. });
  191. });
  192. }
  193. };