/node/node_modules/mongoose/node_modules/mongodb/test/replicaset/connect_test.js

https://bitbucket.org/factoryEquipment/roshambo · JavaScript · 362 lines · 283 code · 49 blank · 30 comment · 38 complexity · f112b8aab00a8726947dbc474aa5c35d MD5 · raw file

  1. var noReplicasetStart = process.env['NO_REPLICASET_START'] != null ? true : false;
  2. var testCase = require('../../deps/nodeunit').testCase,
  3. debug = require('util').debug,
  4. inspect = require('util').inspect,
  5. gleak = require('../../tools/gleak'),
  6. ReplicaSetManager = require('../tools/replica_set_manager').ReplicaSetManager,
  7. Db = require('../../lib/mongodb').Db,
  8. ReplSetServers = require('../../lib/mongodb').ReplSetServers,
  9. Server = require('../../lib/mongodb').Server;
  10. // Keep instance of ReplicaSetManager
  11. var serversUp = false;
  12. var retries = 120;
  13. var RS = RS == null ? null : RS;
  14. var ensureConnection = function(test, numberOfTries, callback) {
  15. // Replica configuration
  16. var replSet = new ReplSetServers( [
  17. new Server( RS.host, RS.ports[1], { auto_reconnect: true } ),
  18. new Server( RS.host, RS.ports[0], { auto_reconnect: true } ),
  19. new Server( RS.host, RS.ports[2], { auto_reconnect: true } )
  20. ],
  21. {rs_name:RS.name}
  22. );
  23. if(numberOfTries <= 0) return callback(new Error("could not connect correctly"), null);
  24. var db = new Db('integration_test_', replSet);
  25. // Print any errors
  26. db.on("error", function(err) {
  27. console.log("============================= ensureConnection caught error")
  28. console.dir(err)
  29. if(err != null && err.stack != null) console.log(err.stack)
  30. db.close();
  31. })
  32. // Open the db
  33. db.open(function(err, p_db) {
  34. db.close();
  35. if(err != null) {
  36. // Wait for a sec and retry
  37. setTimeout(function() {
  38. numberOfTries = numberOfTries - 1;
  39. ensureConnection(test, numberOfTries, callback);
  40. }, 3000);
  41. } else {
  42. return callback(null);
  43. }
  44. })
  45. }
  46. module.exports = testCase({
  47. setUp: function(callback) {
  48. // Create instance of replicaset manager but only for the first call
  49. if(!serversUp && !noReplicasetStart) {
  50. serversUp = true;
  51. RS = new ReplicaSetManager({retries:120, passive_count:0});
  52. RS.startSet(true, function(err, result) {
  53. callback();
  54. });
  55. } else {
  56. RS.restartKilledNodes(function(err, result) {
  57. callback();
  58. })
  59. }
  60. },
  61. tearDown: function(callback) {
  62. // RS.restartKilledNodes(function(err, result) {
  63. callback();
  64. // });
  65. },
  66. shouldCorrectlyConnectWithDefaultReplicaset : function(test) {
  67. // Replica configuration
  68. var replSet = new ReplSetServers([
  69. new Server( RS.host, RS.ports[1], { auto_reconnect: true } ),
  70. new Server( RS.host, RS.ports[0], { auto_reconnect: true } ),
  71. new Server( RS.host, RS.ports[2], { auto_reconnect: true } )
  72. ],
  73. {}
  74. );
  75. var db = new Db('integration_test_', replSet);
  76. db.open(function(err, p_db) {
  77. test.equal(null, err);
  78. test.done();
  79. p_db.close();
  80. })
  81. },
  82. shouldCorrectlyConnectWithDefaultReplicasetAndSocketOptionsSet : function(test) {
  83. // Replica configuration
  84. var replSet = new ReplSetServers([
  85. new Server( RS.host, RS.ports[1], { auto_reconnect: true } ),
  86. new Server( RS.host, RS.ports[0], { auto_reconnect: true } ),
  87. new Server( RS.host, RS.ports[2], { auto_reconnect: true } )
  88. ],
  89. {socketOptions:{keepAlive:100}}
  90. );
  91. var db = new Db('integration_test_', replSet);
  92. db.open(function(err, p_db) {
  93. test.equal(null, err);
  94. test.equal(100, db.serverConfig.checkoutWriter().socketOptions.keepAlive)
  95. test.done();
  96. p_db.close();
  97. })
  98. },
  99. shouldEmitCloseNoCallback : function(test) {
  100. // Replica configuration
  101. var replSet = new ReplSetServers([
  102. new Server( RS.host, RS.ports[1], { auto_reconnect: true } ),
  103. new Server( RS.host, RS.ports[0], { auto_reconnect: true } ),
  104. new Server( RS.host, RS.ports[2], { auto_reconnect: true } )
  105. ], {}
  106. );
  107. new Db('integration_test_', replSet).open(function(err, db) {
  108. test.equal(null, err);
  109. var dbCloseCount = 0, serverCloseCount = 0;
  110. db.on('close', function() { ++dbCloseCount; });
  111. db.close();
  112. setTimeout(function() {
  113. test.equal(dbCloseCount, 1);
  114. test.done();
  115. }, 2000);
  116. })
  117. },
  118. shouldEmitCloseWithCallback : function(test) {
  119. // Replica configuration
  120. var replSet = new ReplSetServers([
  121. new Server( RS.host, RS.ports[1], { auto_reconnect: true } ),
  122. new Server( RS.host, RS.ports[0], { auto_reconnect: true } ),
  123. new Server( RS.host, RS.ports[2], { auto_reconnect: true } )
  124. ], {}
  125. );
  126. new Db('integration_test_', replSet).open(function(err, db) {
  127. test.equal(null, err);
  128. var dbCloseCount = 0;
  129. db.on('close', function() { ++dbCloseCount; });
  130. db.close(function() {
  131. // Let all events fire.
  132. process.nextTick(function() {
  133. test.equal(dbCloseCount, 0);
  134. test.done();
  135. });
  136. });
  137. })
  138. },
  139. shouldCorrectlyPassErrorWhenWrongReplicaSet : function(test) {
  140. // Replica configuration
  141. var replSet = new ReplSetServers([
  142. new Server( RS.host, RS.ports[1], { auto_reconnect: true } ),
  143. new Server( RS.host, RS.ports[0], { auto_reconnect: true } ),
  144. new Server( RS.host, RS.ports[2], { auto_reconnect: true } )
  145. ],
  146. {rs_name:RS.name + "-wrong"}
  147. );
  148. var db = new Db('integration_test_', replSet);
  149. db.open(function(err, p_db) {
  150. test.notEqual(null, err);
  151. test.done();
  152. })
  153. },
  154. shouldConnectWithPrimarySteppedDown : function(test) {
  155. var replSet = new ReplSetServers( [
  156. new Server( RS.host, RS.ports[1], { auto_reconnect: true } ),
  157. new Server( RS.host, RS.ports[0], { auto_reconnect: true } ),
  158. new Server( RS.host, RS.ports[2], { auto_reconnect: true } )
  159. ],
  160. {rs_name:RS.name}
  161. );
  162. // Step down primary server
  163. RS.stepDownPrimary(function(err, result) {
  164. // Wait for new primary to pop up
  165. ensureConnection(test, retries, function(err, p_db) {
  166. new Db('integration_test_', replSet).open(function(err, p_db) {
  167. test.ok(err == null);
  168. test.equal(true, p_db.serverConfig.isConnected());
  169. p_db.close();
  170. test.done();
  171. })
  172. });
  173. });
  174. },
  175. shouldConnectWithThirdNodeKilled : function(test) {
  176. RS.getNodeFromPort(RS.ports[2], function(err, node) {
  177. if(err != null) debug("shouldConnectWithThirdNodeKilled :: " + inspect(err));
  178. RS.kill(node, function(err, result) {
  179. if(err != null) debug("shouldConnectWithThirdNodeKilled :: " + inspect(err));
  180. // Replica configuration
  181. var replSet = new ReplSetServers( [
  182. new Server( RS.host, RS.ports[1], { auto_reconnect: true } ),
  183. new Server( RS.host, RS.ports[0], { auto_reconnect: true } ),
  184. new Server( RS.host, RS.ports[2], { auto_reconnect: true } )
  185. ],
  186. {rs_name:RS.name}
  187. );
  188. // Wait for new primary to pop up
  189. ensureConnection(test, retries, function(err, p_db) {
  190. new Db('integration_test_', replSet).open(function(err, p_db) {
  191. test.ok(err == null);
  192. test.equal(true, p_db.serverConfig.isConnected());
  193. p_db.close();
  194. test.done();
  195. })
  196. });
  197. });
  198. });
  199. },
  200. shouldConnectWithSecondaryNodeKilled : function(test) {
  201. RS.killSecondary(function(node) {
  202. // Replica configuration
  203. var replSet = new ReplSetServers( [
  204. new Server( RS.host, RS.ports[1], { auto_reconnect: true } ),
  205. new Server( RS.host, RS.ports[0], { auto_reconnect: true } ),
  206. new Server( RS.host, RS.ports[2], { auto_reconnect: true } )
  207. ],
  208. {rs_name:RS.name}
  209. );
  210. var db = new Db('integration_test_', replSet);
  211. // Print any errors
  212. db.on("error", function(err) {
  213. console.log("============================= caught error")
  214. console.dir(err)
  215. if(err.stack != null) console.log(err.stack)
  216. test.done();
  217. })
  218. db.open(function(err, p_db) {
  219. test.ok(err == null);
  220. test.equal(true, p_db.serverConfig.isConnected());
  221. // Close and cleanup
  222. p_db.close();
  223. test.done();
  224. })
  225. });
  226. },
  227. shouldConnectWithPrimaryNodeKilled : function(test) {
  228. RS.killPrimary(function(node) {
  229. // Replica configuration
  230. var replSet = new ReplSetServers( [
  231. new Server( RS.host, RS.ports[1], { auto_reconnect: true } ),
  232. new Server( RS.host, RS.ports[0], { auto_reconnect: true } ),
  233. new Server( RS.host, RS.ports[2], { auto_reconnect: true } )
  234. ],
  235. {rs_name:RS.name}
  236. );
  237. var db = new Db('integration_test_', replSet);
  238. ensureConnection(test, retries, function(err, p_db) {
  239. if(err != null && err.stack != null) console.log(err.stack)
  240. test.done();
  241. });
  242. });
  243. },
  244. shouldCorrectlyBeAbleToUsePortAccessors : function(test) {
  245. // Replica configuration
  246. var replSet = new ReplSetServers( [
  247. new Server( RS.host, RS.ports[1], { auto_reconnect: true } ),
  248. new Server( RS.host, RS.ports[0], { auto_reconnect: true } ),
  249. new Server( RS.host, RS.ports[2], { auto_reconnect: true } )
  250. ],
  251. {rs_name:RS.name}
  252. );
  253. var db = new Db('integration_test_', replSet);
  254. db.open(function(err, p_db) {
  255. if(err != null) debug("shouldCorrectlyBeAbleToUsePortAccessors :: " + inspect(err));
  256. test.equal(replSet.host, p_db.serverConfig.primary.host);
  257. test.equal(replSet.port, p_db.serverConfig.primary.port);
  258. p_db.close();
  259. test.done();
  260. })
  261. },
  262. shouldCorrectlyConnect: function(test) {
  263. // Replica configuration
  264. var replSet = new ReplSetServers( [
  265. new Server( RS.host, RS.ports[1], { auto_reconnect: true } ),
  266. new Server( RS.host, RS.ports[0], { auto_reconnect: true } ),
  267. new Server( RS.host, RS.ports[2], { auto_reconnect: true } )
  268. ],
  269. {rs_name:RS.name}
  270. );
  271. var db = new Db('integration_test_', replSet );
  272. db.open(function(err, p_db) {
  273. if(err != null) debug("shouldCorrectlyConnect :: " + inspect(err));
  274. test.equal(true, p_db.serverConfig.isConnected());
  275. // Test primary
  276. RS.primary(function(err, primary) {
  277. if(err != null) debug("shouldCorrectlyConnect :: " + inspect(err));
  278. test.notEqual(null, primary);
  279. test.equal(primary, p_db.serverConfig.primary.host + ":" + p_db.serverConfig.primary.port);
  280. // Perform tests
  281. RS.secondaries(function(err, items) {
  282. if(err != null) debug("shouldCorrectlyConnect :: " + inspect(err));
  283. // Test if we have the right secondaries
  284. test.deepEqual(items.sort(), p_db.serverConfig.allSecondaries.map(function(item) {
  285. return item.host + ":" + item.port;
  286. }).sort());
  287. // Test if we have the right arbiters
  288. RS.arbiters(function(err, items) {
  289. if(err != null) debug("shouldCorrectlyConnect :: " + inspect(err));
  290. test.deepEqual(items.sort(), p_db.serverConfig.arbiters.map(function(item) {
  291. return item.host + ":" + item.port;
  292. }).sort());
  293. // Force new instance
  294. var db2 = new Db('integration_test_', replSet );
  295. db2.open(function(err, p_db2) {
  296. if(err != null) debug("shouldCorrectlyConnect :: " + inspect(err));
  297. test.equal(true, p_db2.serverConfig.isConnected());
  298. // Close top instance
  299. db.close();
  300. db2.close();
  301. test.done();
  302. });
  303. });
  304. });
  305. })
  306. });
  307. },
  308. noGlobalsLeaked : function(test) {
  309. var leaks = gleak.detectNew();
  310. test.equal(0, leaks.length, "global var leak detected: " + leaks.join(', '));
  311. test.done();
  312. }
  313. })