test.js 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740
  1. 'use strict';
  2. var assert = require('assert');
  3. var tcpPortUsed = require('./index');
  4. var net = require('net');
  5. //var debug = require('debug')('tcp-port-used-test');
  6. var server;
  7. function freePort(cb) {
  8. if (!server) {
  9. return cb(new Error('Port not in use'));
  10. }
  11. server.close();
  12. server.unref();
  13. server = undefined;
  14. cb();
  15. }
  16. function bindPort(port, cb) {
  17. if (server) {
  18. return cb(new Error('Free the server port, first.'));
  19. }
  20. server = net.createServer();
  21. server.listen(port);
  22. function errEventCb(err) {
  23. server.close();
  24. if (cb) {
  25. rmListeners();
  26. cb(err);
  27. }
  28. server = undefined;
  29. }
  30. function listenEventCb() {
  31. if (cb) {
  32. rmListeners();
  33. cb();
  34. }
  35. }
  36. function rmListeners() {
  37. server.removeListener('error', errEventCb);
  38. server.removeListener('listening', listenEventCb);
  39. }
  40. server.on('error', errEventCb);
  41. server.on('listening', listenEventCb);
  42. }
  43. describe('check arguments', function() {
  44. it('should not accept negative port numbers in an obj', function(done) {
  45. tcpPortUsed.check({ port: -20, host: '127.0.0.1' })
  46. .then(function() {
  47. done(new Error('check unexpectedly succeeded'));
  48. }, function(err) {
  49. assert.ok(err && err.message === 'invalid port: -20');
  50. done();
  51. });
  52. });
  53. it('should not accept negative port numbers', function(done) {
  54. tcpPortUsed.check(-20, '127.0.0.1')
  55. .then(function() {
  56. done(new Error('check unexpectedly succeeded'));
  57. }, function(err) {
  58. assert.ok(err && err.message === 'invalid port: -20');
  59. done();
  60. });
  61. });
  62. it('should not accept invalid types for port numbers in an obj', function(done) {
  63. tcpPortUsed.check({port:'hello', host:'127.0.0.1'})
  64. .then(function() {
  65. done(new Error('check unexpectedly succeeded'));
  66. }, function(err) {
  67. assert.ok(err && err.message === 'invalid port: \'hello\'');
  68. done();
  69. });
  70. });
  71. it('should not accept invalid types for port numbers', function(done) {
  72. tcpPortUsed.check('hello', '127.0.0.1')
  73. .then(function() {
  74. done(new Error('check unexpectedly succeeded'));
  75. }, function(err) {
  76. assert.ok(err && err.message === 'invalid port: \'hello\'');
  77. done();
  78. });
  79. });
  80. it('should require an argument for a port number in an obj', function(done) {
  81. tcpPortUsed.check({})
  82. .then(function() {
  83. done(new Error('check unexpectedly succeeded'));
  84. }, function(err) {
  85. assert.ok(err && err.message === 'invalid port: undefined');
  86. done();
  87. });
  88. });
  89. it('should require an argument for a port number', function(done) {
  90. tcpPortUsed.check()
  91. .then(function() {
  92. done(new Error('check unexpectedly succeeded'));
  93. }, function(err) {
  94. assert.ok(err && err.message === 'invalid port: undefined');
  95. done();
  96. });
  97. });
  98. it('should not accept port number > 65535 in an obj', function(done) {
  99. tcpPortUsed.check({port: 65536})
  100. .then(function() {
  101. done(new Error('check unexpectedly succeeded'));
  102. }, function(err) {
  103. assert.ok(err && err.message === 'invalid port: 65536');
  104. done();
  105. });
  106. });
  107. it('should not accept port number > 65535', function(done) {
  108. tcpPortUsed.check(65536)
  109. .then(function() {
  110. done(new Error('check unexpectedly succeeded'));
  111. }, function(err) {
  112. assert.ok(err && err.message === 'invalid port: 65536');
  113. done();
  114. });
  115. });
  116. it('should not accept port number < 0 in an obj', function(done) {
  117. tcpPortUsed.check({port: -1})
  118. .then(function() {
  119. done(new Error('check unexpectedly succeeded'));
  120. }, function(err) {
  121. assert.ok(err && err.message === 'invalid port: -1');
  122. done();
  123. });
  124. });
  125. it('should not accept port number < 0', function(done) {
  126. tcpPortUsed.check(-1)
  127. .then(function() {
  128. done(new Error('check unexpectedly succeeded'));
  129. }, function(err) {
  130. assert.ok(err && err.message === 'invalid port: -1');
  131. done();
  132. });
  133. });
  134. });
  135. describe('check functionality for unused port', function() {
  136. before(function(done) {
  137. bindPort(44202, function(err) {
  138. done(err);
  139. });
  140. });
  141. it('should return true for a used port with default host value in an obj', function(done) {
  142. tcpPortUsed.check({port: 44202})
  143. .then(function(inUse) {
  144. assert.ok(inUse === true);
  145. done();
  146. }, function(err) {
  147. done(err);
  148. });
  149. });
  150. it('should return true for a used port with default host value', function(done) {
  151. tcpPortUsed.check(44202)
  152. .then(function(inUse) {
  153. assert.ok(inUse === true);
  154. done();
  155. }, function(err) {
  156. done(err);
  157. });
  158. });
  159. it('should return true for a used port with default host value using arg obj', function(done) {
  160. tcpPortUsed.check({ port: 44202 })
  161. .then(function(inUse) {
  162. assert.ok(inUse === true);
  163. done();
  164. }, function(err) {
  165. done(err);
  166. });
  167. });
  168. it('should return true for a used port with given host value using arg obj', function(done) {
  169. tcpPortUsed.check({port: 44202, host: '127.0.0.1'})
  170. .then(function(inUse) {
  171. assert.ok(inUse === true);
  172. done();
  173. }, function(err) {
  174. assert.ok(false);
  175. done(err);
  176. });
  177. });
  178. it('should return true for a used port with given host value', function(done) {
  179. tcpPortUsed.check(44202, '127.0.0.1')
  180. .then(function(inUse) {
  181. assert.ok(inUse === true);
  182. done();
  183. }, function(err) {
  184. assert.ok(false);
  185. done(err);
  186. });
  187. });
  188. it('should return false for an unused port and default host using arg object', function(done) {
  189. tcpPortUsed.check({port: 44201})
  190. .then(function(inUse) {
  191. assert.ok(inUse === false);
  192. done();
  193. }, function(err) {
  194. done(err);
  195. });
  196. });
  197. it('should return false for an unused port and default host', function(done) {
  198. tcpPortUsed.check(44201)
  199. .then(function(inUse) {
  200. assert.ok(inUse === false);
  201. done();
  202. }, function(err) {
  203. done(err);
  204. });
  205. });
  206. it('should return false for an unused port and given default host using arg object', function(done) {
  207. tcpPortUsed.check({port: 44201, host: '127.0.0.1'})
  208. .then(function(inUse) {
  209. assert.ok(inUse === false);
  210. done();
  211. }, function(err) {
  212. done(err);
  213. });
  214. });
  215. it('should return false for an unused port and given default host', function(done) {
  216. tcpPortUsed.check(44201, '127.0.0.1')
  217. .then(function(inUse) {
  218. assert.ok(inUse === false);
  219. done();
  220. }, function(err) {
  221. done(err);
  222. });
  223. });
  224. after(function(cb) {
  225. freePort(function(err) {
  226. cb(err);
  227. });
  228. });
  229. });
  230. describe('waitUntilFreeOnHost', function() {
  231. this.slow(3000);
  232. this.timeout(3000);
  233. before(function(cb) {
  234. bindPort(44203, function(err) {
  235. cb(err);
  236. });
  237. });
  238. it('should reject promise for used port number after timeout using an arg obj', function(done) {
  239. tcpPortUsed.waitUntilFreeOnHost({port:44203, host:'127.0.0.1', retryTimeMs:500, timeOutMs:1000})
  240. .then(function() {
  241. done(new Error('waitUntilFreeOnHost unexpectedly succeeded'));
  242. }, function(err) {
  243. if (err.message === 'timeout') {
  244. done();
  245. } else {
  246. done(err);
  247. }
  248. });
  249. });
  250. it('should reject promise for used port number after timeout', function(done) {
  251. tcpPortUsed.waitUntilFreeOnHost(44203, '127.0.0.1', 500, 1000)
  252. .then(function() {
  253. done(new Error('waitUntilFreeOnHost unexpectedly succeeded'));
  254. }, function(err) {
  255. if (err.message === 'timeout') {
  256. done();
  257. } else {
  258. done(err);
  259. }
  260. });
  261. });
  262. it('should fufill promise for free port number using an arg object', function(done) {
  263. tcpPortUsed.waitUntilFreeOnHost({port:44205, host:'127.0.0.1', retryTimeMs:500, timeOutM:4000})
  264. .then(function() {
  265. done();
  266. }, function(err) {
  267. done(err);
  268. });
  269. });
  270. it('should fufill promise for free port number', function(done) {
  271. tcpPortUsed.waitUntilFreeOnHost(44205, '127.0.0.1', 500, 4000)
  272. .then(function() {
  273. done();
  274. }, function(err) {
  275. done(err);
  276. });
  277. });
  278. it('should fufill promise for free port number and default retry and timeout using an arg obj', function(done) {
  279. tcpPortUsed.waitUntilFreeOnHost({port:44205})
  280. .then(function() {
  281. done();
  282. }, function(err) {
  283. done(err);
  284. });
  285. });
  286. it('should fufill promise for free port number and default retry and timeout', function(done) {
  287. tcpPortUsed.waitUntilFreeOnHost(44205)
  288. .then(function() {
  289. done();
  290. }, function(err) {
  291. done(err);
  292. });
  293. });
  294. it('should reject promise for invalid port number using an arg obj', function(done) {
  295. tcpPortUsed.waitUntilFreeOnHost({})
  296. .then(function() {
  297. done(new Error('waitUntilFreeOnHost unexpectedly succeeded'));
  298. }, function(err) {
  299. if (err.message === 'invalid port: undefined') {
  300. done();
  301. } else {
  302. done(err);
  303. }
  304. });
  305. });
  306. it('should reject promise for invalid port number', function(done) {
  307. tcpPortUsed.waitUntilFreeOnHost()
  308. .then(function() {
  309. done(new Error('waitUntilFreeOnHost unexpectedly succeeded'));
  310. }, function(err) {
  311. if (err.message === 'invalid port: undefined') {
  312. done();
  313. } else {
  314. done(err);
  315. }
  316. });
  317. });
  318. after(function(cb) {
  319. freePort(function(err) {
  320. cb(err);
  321. });
  322. });
  323. });
  324. describe('waitUntilUsedOnHost', function() {
  325. this.timeout(5000);
  326. this.slow(5000);
  327. before(function() {
  328. setTimeout(function() {
  329. bindPort(44204);
  330. }, 2000);
  331. });
  332. it('should wait until the port is listening using an arg object', function(done) {
  333. tcpPortUsed.waitUntilUsedOnHost({port:44204, host:'127.0.0.1', retryTimeMs:500, timeOutMs:4000})
  334. .then(function() {
  335. done();
  336. }, function(err) {
  337. done(err);
  338. });
  339. });
  340. it('should wait until the port is listening', function(done) {
  341. tcpPortUsed.waitUntilUsedOnHost(44204, '127.0.0.1', 500, 4000)
  342. .then(function() {
  343. done();
  344. }, function(err) {
  345. done(err);
  346. });
  347. });
  348. it('should reject promise when given an invalid port using an arg object', function(done) {
  349. tcpPortUsed.waitUntilUsedOnHost({port:'hello', host:'127.0.0.1', retryTimeMs:500, timeOutMs:2000})
  350. .then(function() {
  351. done(new Error('waitUntil used unexpectedly successful.'));
  352. }, function(err) {
  353. if (err.message === 'invalid port: \'hello\'') {
  354. done();
  355. } else {
  356. done(err);
  357. }
  358. });
  359. });
  360. it('should reject promise when given an invalid port', function(done) {
  361. tcpPortUsed.waitUntilUsedOnHost('hello', '127.0.0.1', 500, 2000)
  362. .then(function() {
  363. done(new Error('waitUntil used unexpectedly successful.'));
  364. }, function(err) {
  365. if (err.message === 'invalid port: \'hello\'') {
  366. done();
  367. } else {
  368. done(err);
  369. }
  370. });
  371. });
  372. it('should timeout when no port is listening using an arg obj', function(done) {
  373. tcpPortUsed.waitUntilUsedOnHost({port:44205, host:'127.0.0.1', retryTimeMs:500, tmieOutMs:2000})
  374. .then(function() {
  375. done(new Error('waitUntil used unexpectedly successful.'));
  376. }, function(err) {
  377. if (err.message === 'timeout') {
  378. done();
  379. } else {
  380. done(err);
  381. }
  382. });
  383. });
  384. it('should timeout when no port is listening', function(done) {
  385. tcpPortUsed.waitUntilUsedOnHost(44205, '127.0.0.1', 500, 2000)
  386. .then(function() {
  387. done(new Error('waitUntil used unexpectedly successful.'));
  388. }, function(err) {
  389. if (err.message === 'timeout') {
  390. done();
  391. } else {
  392. done(err);
  393. }
  394. });
  395. });
  396. after(function(cb) {
  397. freePort(function(err) {
  398. cb(err);
  399. });
  400. });
  401. });
  402. describe('waitUntilFree', function() {
  403. this.timeout(8000);
  404. this.slow(8000);
  405. before(function(cb) {
  406. bindPort(44203, function(err) {
  407. cb(err);
  408. });
  409. });
  410. it('should reject promise for used port number after timeout using arg obj', function(done) {
  411. this.slow(18000);
  412. tcpPortUsed.waitUntilFree({port:44203, retryTimeMs:500, timeOutMs:4000})
  413. .then(function() {
  414. done(new Error('waitUntilFree unexpectedly succeeded'));
  415. }, function(err) {
  416. if (err.message === 'timeout') {
  417. done();
  418. } else {
  419. done(err);
  420. }
  421. });
  422. });
  423. it('should reject promise for used port number after timeout', function(done) {
  424. this.slow(18000);
  425. tcpPortUsed.waitUntilFree(44203, 500, 4000)
  426. .then(function() {
  427. done(new Error('waitUntilFree unexpectedly succeeded'));
  428. }, function(err) {
  429. if (err.message === 'timeout') {
  430. done();
  431. } else {
  432. done(err);
  433. }
  434. });
  435. });
  436. it('should fufill promise for free port number using arg object', function(done) {
  437. tcpPortUsed.waitUntilFree({port:44205, retryTimeMs:500, timeOutMs:4000})
  438. .then(function() {
  439. done();
  440. }, function(err) {
  441. done(err);
  442. });
  443. });
  444. it('should fufill promise for free port number', function(done) {
  445. tcpPortUsed.waitUntilFree(44205, 500, 4000)
  446. .then(function() {
  447. done();
  448. }, function(err) {
  449. done(err);
  450. });
  451. });
  452. it('should fufill promise for free port number and default retry and timeout using arg object', function(done) {
  453. tcpPortUsed.waitUntilFree({port: 44205})
  454. .then(function() {
  455. done();
  456. }, function(err) {
  457. done(err);
  458. });
  459. });
  460. it('should fufill promise for free port number and default retry and timeout', function(done) {
  461. tcpPortUsed.waitUntilFree(44205)
  462. .then(function() {
  463. done();
  464. }, function(err) {
  465. done(err);
  466. });
  467. });
  468. it('should reject promise for invalid port number using arg object', function(done) {
  469. tcpPortUsed.waitUntilFree({})
  470. .then(function() {
  471. done(new Error('waitUntilFreeOnHost: unexpectedly succeeded'));
  472. }, function(err) {
  473. if (err.message === 'invalid port: undefined') {
  474. done();
  475. } else {
  476. done(err);
  477. }
  478. });
  479. });
  480. it('should reject promise for invalid port number', function(done) {
  481. tcpPortUsed.waitUntilFree()
  482. .then(function() {
  483. done(new Error('waitUntilFreeOnHost: unexpectedly succeeded'));
  484. }, function(err) {
  485. if (err.message === 'invalid port: undefined') {
  486. done();
  487. } else {
  488. done(err);
  489. }
  490. });
  491. });
  492. after(function(cb) {
  493. freePort(function(err) {
  494. cb(err);
  495. });
  496. });
  497. });
  498. describe('waitUntilUsed', function() {
  499. this.timeout(5000);
  500. this.slow(5000);
  501. before(function() {
  502. setTimeout(function() {
  503. bindPort(44204);
  504. }, 2000);
  505. });
  506. it('should wait until the port is listening using arg obj', function(done) {
  507. tcpPortUsed.waitUntilUsed({port:44204, retryTimeMs:500, timeOutMs:4000})
  508. .then(function() {
  509. done();
  510. }, function(err) {
  511. done(err);
  512. });
  513. });
  514. it('should wait until the port is listening', function(done) {
  515. tcpPortUsed.waitUntilUsed(44204, 500, 4000)
  516. .then(function() {
  517. done();
  518. }, function(err) {
  519. done(err);
  520. });
  521. });
  522. it('should reject promise when given an invalid port using arg object', function(done) {
  523. tcpPortUsed.waitUntilUsed({port:'hello', retryTimeMs:500, timeOutMs:2000})
  524. .then(function() {
  525. done(new Error('waitUntil used unexpectedly successful.'));
  526. }, function(err) {
  527. if (err.message === 'invalid port: \'hello\'') {
  528. done();
  529. } else {
  530. done(err);
  531. }
  532. });
  533. });
  534. it('should reject promise when given an invalid port', function(done) {
  535. tcpPortUsed.waitUntilUsed('hello', 500, 2000)
  536. .then(function() {
  537. done(new Error('waitUntil used unexpectedly successful.'));
  538. }, function(err) {
  539. if (err.message === 'invalid port: \'hello\'') {
  540. done();
  541. } else {
  542. done(err);
  543. }
  544. });
  545. });
  546. it('should timeout when no port is listening using arg obj', function(done) {
  547. tcpPortUsed.waitUntilUsed({port:44205, retryTimeMs:500, timeOutMs:2000})
  548. .then(function() {
  549. done(new Error('waitUntil used unexpectedly successful.'));
  550. }, function(err) {
  551. if (err.message === 'timeout') {
  552. done();
  553. } else {
  554. done(err);
  555. }
  556. });
  557. });
  558. it('should timeout when no port is listening', function(done) {
  559. tcpPortUsed.waitUntilUsed(44205, 500, 2000)
  560. .then(function() {
  561. done(new Error('waitUntil used unexpectedly successful.'));
  562. }, function(err) {
  563. if (err.message === 'timeout') {
  564. done();
  565. } else {
  566. done(err);
  567. }
  568. });
  569. });
  570. after(function(cb) {
  571. freePort(function(err) {
  572. cb(err);
  573. });
  574. });
  575. });
  576. describe('waitForStatus', function() {
  577. this.timeout(5000);
  578. this.slow(5000);
  579. before(function() {
  580. setTimeout(function() {
  581. bindPort(44204);
  582. }, 2000);
  583. });
  584. it('should wait until the port is listening using arg obj', function(done) {
  585. tcpPortUsed.waitForStatus({port:44204, host:'127.0.0.1', inUse:true, retryTimeMs:500, timeOutMs:4000})
  586. .then(function() {
  587. done();
  588. }, function(err) {
  589. done(err);
  590. });
  591. });
  592. it('should wait until the port is listening', function(done) {
  593. tcpPortUsed.waitForStatus(44204, '127.0.0.1', true, 500, 4000)
  594. .then(function() {
  595. done();
  596. }, function(err) {
  597. done(err);
  598. });
  599. });
  600. it('should reject promise when given an invalid port using arg object', function(done) {
  601. tcpPortUsed.waitForStatus({port:'hello', host:'127.0.0.1', inUse:false, retryTimeMs:500, timeOutMs:2000})
  602. .then(function() {
  603. done(new Error('waitUntil used unexpectedly successful.'));
  604. }, function(err) {
  605. if (err.message === 'invalid port: \'hello\'') {
  606. done();
  607. } else {
  608. done(err);
  609. }
  610. });
  611. });
  612. it('should reject promise when given an invalid port', function(done) {
  613. tcpPortUsed.waitForStatus('hello', '127.0.0.1', false, 500, 2000)
  614. .then(function() {
  615. done(new Error('waitUntil used unexpectedly successful.'));
  616. }, function(err) {
  617. if (err.message === 'invalid port: \'hello\'') {
  618. done();
  619. } else {
  620. done(err);
  621. }
  622. });
  623. });
  624. it('should timeout when no port is listening using arg obj', function(done) {
  625. tcpPortUsed.waitUntilUsed({port:44205, host:'127.0.0.1', inUse:true, retryTimeMs:500, timeOutMs:2000})
  626. .then(function() {
  627. done(new Error('waitUntil used unexpectedly successful.'));
  628. }, function(err) {
  629. if (err.message === 'timeout') {
  630. done();
  631. } else {
  632. done(err);
  633. }
  634. });
  635. });
  636. it('should timeout when no port is listening', function(done) {
  637. tcpPortUsed.waitUntilUsed(44205, '127.0.0.1', true, 500, 2000)
  638. .then(function() {
  639. done(new Error('waitUntil used unexpectedly successful.'));
  640. }, function(err) {
  641. if (err.message === 'timeout') {
  642. done();
  643. } else {
  644. done(err);
  645. }
  646. });
  647. });
  648. after(function(cb) {
  649. freePort(function(err) {
  650. cb(err);
  651. });
  652. });
  653. });