unit.test.js 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231
  1. var fspfs = require('../')
  2. , fs = require('fs')
  3. , http = require('http')
  4. , https = require('https')
  5. , net = require('net')
  6. , should = require('should')
  7. , assert = require('assert');
  8. module.exports = {
  9. // Library version should be Semver compatible
  10. 'Library version': function(){
  11. fspfs.version.should.match(/^\d+\.\d+\.\d+$/);
  12. }
  13. // Creating a server instace should not cause any problems
  14. // either using the new Server or createServer method.
  15. , 'Create Server instance': function(){
  16. var server = fspfs.createServer()
  17. , server2 = new fspfs.Server({log:false}, ['blog.3rd-Eden.com:1337']);
  18. // server 2 options test
  19. server2.log.should.be.false;
  20. server2.origins.length.should.equal(1);
  21. server2.origins[0].should.equal('blog.3rd-Eden.com:1337');
  22. // server defaults
  23. (typeof server.log).should.be.equal('function');
  24. server.origins.length.should.equal(1);
  25. server.origins[0].should.equal('*:*');
  26. // instance checking, sanity check
  27. assert.ok(server instanceof fspfs.Server);
  28. assert.ok(!!server.buffer);
  29. // more options testing
  30. server = fspfs.createServer(['blog.3rd-Eden.com:80']);
  31. server.origins.length.should.equal(1);
  32. server.origins[0].should.equal('blog.3rd-Eden.com:80');
  33. server = fspfs.createServer({log:false},['blog.3rd-Eden.com:80']);
  34. server.log.should.be.false;
  35. server.origins.length.should.equal(1);
  36. server.origins[0].should.equal('blog.3rd-Eden.com:80');
  37. }
  38. , 'Add origin': function(){
  39. var server = fspfs.createServer();
  40. server.add('google.com:80', 'blog.3rd-Eden.com:1337');
  41. server.origins.length.should.equal(3);
  42. server.origins.indexOf('google.com:80').should.be.above(0);
  43. // don't allow duplicates
  44. server.add('google.com:80', 'google.com:80');
  45. var i = server.origins.length
  46. , count = 0;
  47. while(i--){
  48. if (server.origins[i] === 'google.com:80'){
  49. count++;
  50. }
  51. }
  52. count.should.equal(1);
  53. }
  54. , 'Remove origin': function(){
  55. var server = fspfs.createServer();
  56. server.add('google.com:80', 'blog.3rd-Eden.com:1337');
  57. server.origins.length.should.equal(3);
  58. server.remove('google.com:80');
  59. server.origins.length.should.equal(2);
  60. server.origins.indexOf('google.com:80').should.equal(-1);
  61. }
  62. , 'Buffer': function(){
  63. var server = fspfs.createServer();
  64. Buffer.isBuffer(server.buffer).should.be.true;
  65. server.buffer.toString().indexOf('to-ports="*"').should.be.above(0);
  66. server.buffer.toString().indexOf('domain="*"').should.be.above(0);
  67. server.buffer.toString().indexOf('domain="google.com"').should.equal(-1);
  68. // The buffers should be rebuild when new origins are added
  69. server.add('google.com:80');
  70. server.buffer.toString().indexOf('to-ports="80"').should.be.above(0);
  71. server.buffer.toString().indexOf('domain="google.com"').should.be.above(0);
  72. server.remove('google.com:80');
  73. server.buffer.toString().indexOf('to-ports="80"').should.equal(-1);
  74. server.buffer.toString().indexOf('domain="google.com"').should.equal(-1);
  75. }
  76. , 'Responder': function(){
  77. var server = fspfs.createServer()
  78. , calls = 0
  79. // dummy socket to emulate a `real` socket
  80. , dummySocket = {
  81. readyState: 'open'
  82. , end: function(buffer){
  83. calls++;
  84. Buffer.isBuffer(buffer).should.be.true;
  85. buffer.toString().should.equal(server.buffer.toString());
  86. }
  87. };
  88. server.responder(dummySocket);
  89. calls.should.equal(1);
  90. }
  91. , 'Event proxy': function(){
  92. var server = fspfs.createServer()
  93. , calls = 0;
  94. Object.keys(process.EventEmitter.prototype).forEach(function proxy(key){
  95. assert.ok(!!server[key] && typeof server[key] === 'function');
  96. });
  97. // test if it works by calling a none default event
  98. server.on('pew', function(){
  99. calls++;
  100. });
  101. server.emit('pew');
  102. calls.should.equal(1);
  103. }
  104. , 'inline response http': function(){
  105. var port = 1335
  106. , httpserver = http.createServer(function(q,r){r.writeHead(200);r.end(':3')})
  107. , server = fspfs.createServer();
  108. httpserver.listen(port, function(){
  109. server.listen(port + 1, httpserver, function(){
  110. var client = net.createConnection(port);
  111. client.write('<policy-file-request/>\0');
  112. client.on('error', function(err){
  113. assert.ok(!err, err)
  114. });
  115. client.on('data', function(data){
  116. var response = data.toString();
  117. console.log(response);
  118. response.indexOf('to-ports="*"').should.be.above(0);
  119. response.indexOf('domain="*"').should.be.above(0);
  120. response.indexOf('domain="google.com"').should.equal(-1);
  121. // clean up
  122. client.destroy();
  123. server.close();
  124. httpserver.close();
  125. });
  126. });
  127. });
  128. }
  129. , 'server response': function(){
  130. var port = 1340
  131. , server = fspfs.createServer();
  132. server.listen(port, function(){
  133. var client = net.createConnection(port);
  134. client.write('<policy-file-request/>\0');
  135. client.on('error', function(err){
  136. assert.ok(!err, err)
  137. });
  138. client.on('data', function(data){
  139. var response = data.toString();
  140. response.indexOf('to-ports="*"').should.be.above(0);
  141. response.indexOf('domain="*"').should.be.above(0);
  142. response.indexOf('domain="google.com"').should.equal(-1);
  143. // clean up
  144. client.destroy();
  145. server.close();
  146. });
  147. });
  148. }
  149. , 'inline response https': function(){
  150. var port = 1345
  151. , ssl = {
  152. key: fs.readFileSync(__dirname + '/ssl/ssl.private.key').toString()
  153. , cert: fs.readFileSync(__dirname + '/ssl/ssl.crt').toString()
  154. }
  155. , httpserver = https.createServer(ssl, function(q,r){r.writeHead(200);r.end(':3')})
  156. , server = fspfs.createServer();
  157. httpserver.listen(port, function(){
  158. server.listen(port + 1, httpserver, function(){
  159. var client = net.createConnection(port);
  160. client.write('<policy-file-request/>\0');
  161. client.on('error', function(err){
  162. assert.ok(!err, err)
  163. });
  164. client.on('data', function(data){
  165. var response = data.toString();
  166. response.indexOf('to-ports="*"').should.be.above(0);
  167. response.indexOf('domain="*"').should.be.above(0);
  168. response.indexOf('domain="google.com"').should.equal(-1);
  169. // clean up
  170. client.destroy();
  171. server.close();
  172. httpserver.close();
  173. });
  174. });
  175. });
  176. }
  177. , 'connect_failed': function(){
  178. var server = fspfs.createServer();
  179. server.on('connect_failed', function(){
  180. assert.ok(true);
  181. });
  182. server.listen(function(){
  183. assert.ok(false, 'Run this test without root access');
  184. server.close();
  185. });
  186. }
  187. };