PageRenderTime 51ms CodeModel.GetById 22ms RepoModel.GetById 1ms app.codeStats 0ms

/nodemailer/node_modules/simplesmtp/node_modules/rai/test/rai.js

https://github.com/bharat-daffodilsw/pajhwoklive
JavaScript | 750 lines | 601 code | 148 blank | 1 comment | 19 complexity | 9335c3d49489a359c1a1bf4441629693 MD5 | raw file
Possible License(s): Apache-2.0, MIT, BSD-3-Clause, GPL-2.0
  1. process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0";
  2. var RAIServer = require("../lib/rai").RAIServer,
  3. runClientMockup = require("../lib/rai").runClientMockup,
  4. testCase = require('nodeunit').testCase,
  5. utillib = require("util"),
  6. netlib = require("net"),
  7. crypto = require("crypto"),
  8. tlslib = require("tls");
  9. var PORT_NUMBER = 8397;
  10. // monkey patch net and tls to support nodejs 0.4
  11. if(!netlib.connect && netlib.createConnection){
  12. netlib.connect = netlib.createConnection;
  13. }
  14. if(!tlslib.connect && tlslib.createConnection){
  15. tlslib.connect = tlslib.createConnection;
  16. }
  17. exports["General tests"] = {
  18. "Create and close a server": function(test){
  19. var server = new RAIServer();
  20. server.listen(PORT_NUMBER, function(err){
  21. test.ifError(err);
  22. server.end(function(){
  23. test.ok(1, "Server closed");
  24. test.done();
  25. });
  26. });
  27. },
  28. "Create a secure server": function(test){
  29. var server = new RAIServer({secureConnection: true});
  30. server.listen(PORT_NUMBER, function(err){
  31. test.ifError(err);
  32. server.end(function(){
  33. test.ok(1, "Server closed");
  34. test.done();
  35. });
  36. });
  37. },
  38. "Duplicate server fails": function(test){
  39. var server = new RAIServer();
  40. server.listen(PORT_NUMBER, function(err){
  41. test.ifError(err);
  42. var duplicate = new RAIServer();
  43. duplicate.listen(PORT_NUMBER, function(err){
  44. test.ok(err, "Responds with error");
  45. server.end(function(){
  46. test.ok(1, "Server closed");
  47. test.done();
  48. });
  49. });
  50. });
  51. },
  52. "Connection event": function(test){
  53. var server = new RAIServer();
  54. test.expect(3);
  55. server.listen(PORT_NUMBER, function(err){
  56. server.on("connect", function(socket){
  57. test.ok(socket, "Client connected");
  58. socket.on("end", function(){
  59. test.ok(1, "Connection closed");
  60. server.end(function(){
  61. test.done();
  62. });
  63. });
  64. socket.on("error", function(err){
  65. test.isError(err);
  66. });
  67. });
  68. var client = netlib.connect(PORT_NUMBER, function(){
  69. test.ok(1, "Connected to server");
  70. client.end();
  71. });
  72. });
  73. },
  74. "Close client socket": function(test){
  75. var server = new RAIServer();
  76. test.expect(4);
  77. server.listen(PORT_NUMBER, function(err){
  78. server.on("connect", function(socket){
  79. test.ok(socket, "Client connected");
  80. socket.on("end", function(){
  81. test.ok(1, "Connection closed");
  82. server.end(function(){
  83. test.done();
  84. });
  85. });
  86. socket.on("error", function(err){
  87. test.isError(err);
  88. });
  89. socket.end();
  90. });
  91. var client = netlib.connect(PORT_NUMBER, function(){
  92. test.ok(1, "Connected to server");
  93. });
  94. client.on("end", function(){
  95. test.ok(1, "Connection closed by host");
  96. });
  97. });
  98. },
  99. "Send data to client": function(test){
  100. var server = new RAIServer();
  101. server.listen(PORT_NUMBER, function(err){
  102. server.on("connect", function(socket){
  103. socket.send("HELLO");
  104. socket.on("end", function(){
  105. server.end(function(){
  106. test.done();
  107. });
  108. });
  109. socket.on("error", function(err){
  110. test.isError(err);
  111. });
  112. });
  113. var client = netlib.connect(PORT_NUMBER, function(){
  114. client.on("data", function(chunk){
  115. test.equal(chunk.toString(), "HELLO\r\n");
  116. client.end();
  117. });
  118. });
  119. });
  120. }
  121. };
  122. exports["Secure connection"] = {
  123. "STARTTLS with event": function(test){
  124. var server = new RAIServer();
  125. server.listen(PORT_NUMBER, function(err){
  126. test.expect(2);
  127. server.on("connect", function(socket){
  128. socket.startTLS();
  129. socket.on("tls", function(){
  130. test.ok(1, "Secure connection opened");
  131. socket.send("TEST");
  132. });
  133. socket.on("end", function(){
  134. server.end(function(){
  135. test.done();
  136. });
  137. });
  138. socket.on("error", function(err){
  139. test.isError(err);
  140. });
  141. });
  142. var client = netlib.connect(PORT_NUMBER, function(){
  143. var sslcontext = crypto.createCredentials();
  144. var pair = tlslib.createSecurePair(sslcontext, false);
  145. pair.encrypted.pipe(client);
  146. client.pipe(pair.encrypted);
  147. pair.fd = client.fd;
  148. pair.on("secure", function(){
  149. pair.cleartext.on("data", function(chunk){
  150. test.equal(chunk.toString(), "TEST\r\n");
  151. pair.cleartext.end();
  152. });
  153. });
  154. });
  155. });
  156. },
  157. "STARTTLS Callback": function(test){
  158. var server = new RAIServer();
  159. server.listen(PORT_NUMBER, function(err){
  160. test.expect(2);
  161. server.on("connect", function(socket){
  162. socket.startTLS(function(){
  163. test.ok(1, "Secure connection opened");
  164. socket.send("TEST");
  165. });
  166. socket.on("tls", function(){
  167. test.ok(0, "Should not occur");
  168. });
  169. socket.on("end", function(){
  170. server.end(function(){
  171. test.done();
  172. });
  173. });
  174. socket.on("error", function(err){
  175. test.isError(err);
  176. });
  177. });
  178. var client = netlib.connect(PORT_NUMBER, function(){
  179. var sslcontext = crypto.createCredentials();
  180. var pair = tlslib.createSecurePair(sslcontext, false);
  181. pair.encrypted.pipe(client);
  182. client.pipe(pair.encrypted);
  183. pair.fd = client.fd;
  184. pair.on("secure", function(){
  185. pair.cleartext.on("data", function(chunk){
  186. test.equal(chunk.toString(), "TEST\r\n");
  187. pair.cleartext.end();
  188. });
  189. });
  190. });
  191. });
  192. },
  193. "STARTTLS clears command buffer": function(test){
  194. var server = new RAIServer();
  195. server.listen(PORT_NUMBER, function(err){
  196. test.expect(2);
  197. server.on("connect", function(socket){
  198. socket.on("command", function(command){
  199. if(command == "STARTTLS"){
  200. socket.startTLS();
  201. socket.send("OK");
  202. }else if(command == "KILL"){
  203. test.ok(0, "Should not occur");
  204. }else if(command == "OK"){
  205. test.ok(1, "OK");
  206. }
  207. });
  208. socket.on("tls", function(){
  209. test.ok(1, "Secure connection opened");
  210. socket.send("TEST");
  211. });
  212. socket.on("end", function(){
  213. server.end(function(){
  214. test.done();
  215. });
  216. });
  217. socket.on("error", function(err){
  218. test.isError(err);
  219. });
  220. });
  221. var client = netlib.connect(PORT_NUMBER, function(){
  222. client.write("STARTTLS\r\nKILL\r\n");
  223. client.on("data", function(chunk){
  224. if(chunk.toString("utf-8").trim() == "OK"){
  225. var sslcontext = crypto.createCredentials();
  226. var pair = tlslib.createSecurePair(sslcontext, false);
  227. pair.encrypted.pipe(client);
  228. client.pipe(pair.encrypted);
  229. pair.fd = client.fd;
  230. pair.on("secure", function(){
  231. pair.cleartext.write("OK\r\n");
  232. pair.cleartext.end();
  233. });
  234. }
  235. });
  236. });
  237. });
  238. },
  239. "STARTTLS on secure server fails": function(test){
  240. var server = new RAIServer({secureConnection: true});
  241. server.listen(PORT_NUMBER, function(err){
  242. test.expect(2);
  243. server.on("connect", function(socket){
  244. socket.on("error", function(err){
  245. test.ok(err);
  246. socket.end();
  247. server.end(function(){
  248. test.done();
  249. });
  250. });
  251. socket.on("command", (function(command){
  252. process.nextTick(socket.startTLS.bind(socket, function(){
  253. test.ok(false, "Secure connection opened"); // should not occur
  254. server.end(function(){
  255. test.done();
  256. });
  257. }));
  258. }).bind(this));
  259. socket.on("tls", function(){
  260. test.ok(0, "Should not occur");
  261. });
  262. });
  263. var client = tlslib.connect(PORT_NUMBER, function(){
  264. test.ok(true);
  265. client.write("HELLO!\r\n");
  266. });
  267. });
  268. }
  269. };
  270. exports["Client commands"] = {
  271. "Receive Simple Command": function(test){
  272. var server = new RAIServer();
  273. server.listen(PORT_NUMBER, function(err){
  274. server.on("connect", function(socket){
  275. socket.on("command", function(command, payload){
  276. test.equal(command, "STATUS");
  277. test.equal(payload.toString(), "");
  278. socket.end();
  279. server.end(function(){
  280. test.done();
  281. });
  282. });
  283. socket.on("error", function(err){
  284. test.isError(err);
  285. });
  286. });
  287. var client = netlib.connect(PORT_NUMBER, function(){
  288. client.write("STATUS\r\n");
  289. });
  290. });
  291. },
  292. "Receive Command with payload": function(test){
  293. var server = new RAIServer();
  294. server.listen(PORT_NUMBER, function(err){
  295. server.on("connect", function(socket){
  296. socket.on("command", function(command, payload){
  297. test.equal(command, "MAIL");
  298. test.equal(payload.toString(), "TO:");
  299. socket.end();
  300. server.end(function(){
  301. test.done();
  302. });
  303. });
  304. socket.on("error", function(err){
  305. test.isError(err);
  306. });
  307. });
  308. var client = netlib.connect(PORT_NUMBER, function(){
  309. client.write("MAIL TO:\r\n");
  310. });
  311. });
  312. }
  313. };
  314. exports["Data mode"] = {
  315. "DATA mode": function(test){
  316. var server = new RAIServer(),
  317. datapayload = "tere\r\nvana kere";
  318. server.listen(PORT_NUMBER, function(err){
  319. server.on("connect", function(socket){
  320. socket.startDataMode();
  321. test.expect(2);
  322. socket.on("data", function(chunk){
  323. test.equal(datapayload, chunk.toString());
  324. });
  325. socket.on("ready", function(){
  326. test.ok(1,"Data ready");
  327. server.end(function(){
  328. test.done();
  329. });
  330. });
  331. socket.on("error", function(err){
  332. test.isError(err);
  333. });
  334. });
  335. var client = netlib.connect(PORT_NUMBER, function(){
  336. client.write(datapayload+"\r\n.\r\n");
  337. client.end();
  338. });
  339. });
  340. },
  341. "Small chunks DATA mode": function(test){
  342. var server = new RAIServer(),
  343. datapayload = "tere\r\nvana kere õäöü\r\n.\r",
  344. databytes = [],
  345. fullpayload = datapayload+"\r\n.\r\n";
  346. server.listen(PORT_NUMBER, function(err){
  347. server.on("connect", function(socket){
  348. socket.startDataMode();
  349. test.expect(1);
  350. socket.on("data", function(chunk){
  351. databytes = databytes.concat(Array.prototype.slice.call(chunk));
  352. });
  353. socket.on("ready", function(){
  354. test.equal(new Buffer(databytes).toString("utf-8"), datapayload);
  355. server.end(function(){
  356. test.done();
  357. });
  358. });
  359. socket.on("error", function(err){
  360. test.isError(err);
  361. });
  362. for(var i=0, len = fullpayload.length; i<len; i++){
  363. socket._onReceiveData(new Buffer(fullpayload.charAt(i), "utf-8").toString("binary"));
  364. }
  365. });
  366. var client = netlib.connect(PORT_NUMBER, function(){
  367. client.end();
  368. });
  369. });
  370. }
  371. };
  372. exports["Pipelining support"] = {
  373. "Pipelining": function(test){
  374. var server = new RAIServer();
  375. server.listen(PORT_NUMBER, function(err){
  376. test.expect(8);
  377. server.on("connect", function(socket){
  378. socket.on("command", function(command, payload){
  379. if(command == "STATUS"){
  380. test.ok(1, "Status received");
  381. }else if(command=="DATA"){
  382. test.ok(1, "data command received");
  383. socket.startDataMode();
  384. }else if(command=="END"){
  385. test.ok(1, "all received");
  386. }else{
  387. test.ok(0, "Unexpected command: "+command);
  388. }
  389. });
  390. socket.on("data", function(chunk){
  391. test.equal(chunk.toString(), "TE\r\nST");
  392. });
  393. socket.on("ready", function(){
  394. test.ok(1, "Data mode ended");
  395. });
  396. socket.on("end", function(){
  397. test.ok(1, "All ready");
  398. server.end(function(){
  399. test.done();
  400. });
  401. });
  402. socket.on("error", function(err){
  403. test.isError(err);
  404. });
  405. });
  406. var client = netlib.connect(PORT_NUMBER, function(){
  407. client.write("STATUS\r\nSTATUS\r\nSTATUS\r\nDATA\r\nTE\r\nST\r\n.\r\nEND\r\n");
  408. client.end();
  409. });
  410. });
  411. }
  412. };
  413. exports["Timeout tests"] = {
  414. "Timeout": function(test){
  415. var server = new RAIServer({timeout: 300, disconnectOnTimeout: true});
  416. test.expect(3);
  417. server.listen(PORT_NUMBER, function(err){
  418. server.on("connect", function(socket){
  419. test.ok(socket, "Client connected");
  420. socket.on("timeout", function(){
  421. test.ok(1, "Connection closed");
  422. server.end(function(){
  423. test.done();
  424. });
  425. });
  426. socket.on("error", function(err){
  427. test.isError(err);
  428. });
  429. });
  430. var client = netlib.connect(PORT_NUMBER, function(){
  431. test.ok(1, "Connected to server");
  432. });
  433. });
  434. },
  435. "Timeout with TLS": function(test){
  436. var server = new RAIServer({timeout: 300, disconnectOnTimeout: true});
  437. server.listen(PORT_NUMBER, function(err){
  438. test.expect(3);
  439. server.on("connect", function(socket){
  440. socket.startTLS();
  441. socket.on("tls", function(){
  442. test.ok(1, "Secure connection opened");
  443. socket.send("TEST");
  444. });
  445. socket.on("timeout", function(){
  446. test.ok(1, "Timeout occurred");
  447. server.end(function(){
  448. test.done();
  449. });
  450. });
  451. socket.on("error", function(err){
  452. test.isError(err);
  453. });
  454. });
  455. var client = netlib.connect(PORT_NUMBER, function(){
  456. var sslcontext = crypto.createCredentials();
  457. var pair = tlslib.createSecurePair(sslcontext, false);
  458. pair.encrypted.pipe(client);
  459. client.pipe(pair.encrypted);
  460. pair.fd = client.fd;
  461. pair.on("secure", function(){
  462. test.ok(1, "secure connection");
  463. });
  464. });
  465. });
  466. }
  467. };
  468. exports["Client Mockup"] = {
  469. "All command": function(test){
  470. var server = new RAIServer();
  471. server.listen(PORT_NUMBER, function(err){
  472. server.on("connect", function(socket){
  473. socket.send("220 Welcome");
  474. socket.on("command", function(command, payload){
  475. switch(command) {
  476. case "HELO": socket.send("250 HI"); break;
  477. case "NOOP": socket.send("250 OK"); break;
  478. case "QUIT": socket.send("221 Bye"); socket.end(); break;
  479. default: socket.send("500");
  480. }
  481. });
  482. socket.on("error", function(err){
  483. test.isError(err);
  484. });
  485. });
  486. var cmds = ["HELO", "NOOP", "QUIT"];
  487. runClientMockup(PORT_NUMBER, "localhost", cmds, function(lastResponse, allResponses){
  488. allResponses = allResponses.map(function(value) { return value.toString("utf-8"); });
  489. test.deepEqual(allResponses, [ "220 Welcome\r\n", "250 HI\r\n", "250 OK\r\n", "221 Bye\r\n" ]);
  490. server.end(function(){
  491. test.done();
  492. });
  493. });
  494. });
  495. },
  496. "Last commands": function(test){
  497. var server = new RAIServer();
  498. server.listen(PORT_NUMBER, function(err){
  499. server.on("connect", function(socket){
  500. socket.send("220 HI");
  501. socket.on("command", function(command, payload){
  502. switch(command) {
  503. case "HELO": socket.send("250 HI"); break;
  504. case "NOOP": socket.send("250 OK"); break;
  505. case "QUIT": socket.send("221 Bye"); socket.end(); break;
  506. default: socket.send("500");
  507. }
  508. });
  509. socket.on("error", function(err){
  510. test.isError(err);
  511. });
  512. });
  513. var cmds = ["HELO", "NOOP", "QUIT"];
  514. runClientMockup(PORT_NUMBER, "localhost", cmds, function(lastResponse){
  515. test.equal(lastResponse.toString("utf-8"), "221 Bye\r\n");
  516. server.end(function(){
  517. test.done();
  518. });
  519. });
  520. });
  521. },
  522. "All command(STARTTLS)": function(test){
  523. var server = new RAIServer();
  524. server.listen(PORT_NUMBER, function(err){
  525. test.expect(2);
  526. server.on("connect", function(socket){
  527. socket.tlsStatus = 0;
  528. socket.send("220 Welcome");
  529. socket.on("command", function(command, payload){
  530. switch(command){
  531. case "EHLO":
  532. if(socket.tlsStatus===0){
  533. socket.send("250-HI\r\n250 STARTTLS");
  534. }else{
  535. socket.send("250 HI");
  536. }
  537. break;
  538. case "NOOP": socket.send("250 OK"); break;
  539. case "QUIT": socket.send("221 Bye"); socket.end(); break;
  540. case "STARTTLS": socket.startTLS(); socket.send("220 Go ahead"); break;
  541. default: socket.send("500");
  542. }
  543. });
  544. socket.on("tls", function(){
  545. test.ok(1, "Secure connection opened");
  546. socket.tlsStatus = 1;
  547. });
  548. socket.on("error", function(err){
  549. test.isError(err);
  550. });
  551. });
  552. var cmds = ["EHLO", "STARTTLS", "EHLO", "NOOP", "QUIT"];
  553. runClientMockup(PORT_NUMBER, "localhost", cmds, function(lastResponse, allResponses){
  554. allResponses = allResponses.map(function(value) { return value.toString("utf-8"); });
  555. test.deepEqual(allResponses, ["220 Welcome\r\n", "250-HI\r\n250 STARTTLS\r\n", "220 Go ahead\r\n",
  556. "250 HI\r\n", "250 OK\r\n", "221 Bye\r\n" ]);
  557. server.end(function(){
  558. test.done();
  559. });
  560. });
  561. });
  562. },
  563. "Last commands(STARTTLS)": function(test){
  564. var server = new RAIServer();
  565. server.listen(PORT_NUMBER, function(err){
  566. test.expect(2);
  567. server.on("connect", function(socket){
  568. socket.tlsStatus = 0;
  569. socket.send("220 Welcome");
  570. socket.on("command", function(command, payload){
  571. switch(command){
  572. case "EHLO":
  573. if(socket.tlsStatus===0){
  574. socket.send("250-HI\r\n250 STARTTLS");
  575. }else{
  576. socket.send("250 HI");
  577. }
  578. break;
  579. case "NOOP": socket.send("250 OK"); break;
  580. case "QUIT": socket.send("221 Bye"); socket.end(); break;
  581. case "STARTTLS": socket.startTLS(); socket.send("220 Go ahead"); break;
  582. default: socket.send("500");
  583. }
  584. });
  585. socket.on("tls", function(){
  586. test.ok(1, "Secure connection opened");
  587. socket.tlsStatus = 1;
  588. });
  589. socket.on("error", function(err){
  590. test.isError(err);
  591. });
  592. });
  593. var cmds = ["EHLO", "STARTTLS", "EHLO", "NOOP", "QUIT"];
  594. runClientMockup(PORT_NUMBER, "localhost", cmds, function(lastResponse){
  595. test.equal(lastResponse.toString("utf-8"), "221 Bye\r\n");
  596. server.end(function(){
  597. test.done();
  598. });
  599. });
  600. });
  601. }
  602. };