DateRollingFileStream-test.js 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653
  1. /**
  2. * This file will be removed.
  3. */
  4. 'use strict';
  5. require('should');
  6. const fs = require('fs')
  7. , zlib = require('zlib')
  8. , proxyquire = require('proxyquire').noPreserveCache()
  9. , util = require('util')
  10. , async = require('async')
  11. , streams = require('stream');
  12. let fakeNow = new Date(2012, 8, 12, 10, 37, 11);
  13. const mockNow = () => fakeNow;
  14. const RollingFileWriteStream = proxyquire('../lib/RollingFileWriteStream', {
  15. './now': mockNow
  16. });
  17. const DateRollingFileStream = proxyquire('../lib/DateRollingFileStream', {
  18. './RollingFileWriteStream': RollingFileWriteStream
  19. });
  20. function remove(filename, cb) {
  21. fs.unlink(filename, function () {
  22. cb();
  23. });
  24. }
  25. describe('DateRollingFileStream', function () {
  26. describe('arguments', function () {
  27. var stream;
  28. before(function (done) {
  29. stream = new DateRollingFileStream(
  30. __dirname + '/test-date-rolling-file-stream-1',
  31. 'yyyy-MM-dd.hh'
  32. );
  33. done();
  34. });
  35. after(function (done) {
  36. remove(__dirname + '/test-date-rolling-file-stream-1', done);
  37. });
  38. it('should take a filename and a pattern and return a WritableStream', function (done) {
  39. stream.filename.should.eql(__dirname + '/test-date-rolling-file-stream-1');
  40. stream.options.pattern.should.eql('yyyy-MM-dd.hh');
  41. stream.should.be.instanceOf(streams.Writable);
  42. done();
  43. });
  44. it('with default settings for the underlying stream', function (done) {
  45. stream.currentFileStream.mode.should.eql(420);
  46. stream.currentFileStream.flags.should.eql('a');
  47. done();
  48. });
  49. });
  50. describe('default arguments', function () {
  51. var stream;
  52. before(function (done) {
  53. stream = new DateRollingFileStream(__dirname + '/test-date-rolling-file-stream-2');
  54. done();
  55. });
  56. after(function (done) {
  57. remove(__dirname + '/test-date-rolling-file-stream-2', done);
  58. });
  59. it('should have pattern of .yyyy-MM-dd', function (done) {
  60. stream.options.pattern.should.eql('yyyy-MM-dd');
  61. done();
  62. });
  63. });
  64. describe('with stream arguments', function () {
  65. var stream;
  66. before(function (done) {
  67. stream = new DateRollingFileStream(
  68. __dirname + '/test-date-rolling-file-stream-3',
  69. 'yyyy-MM-dd',
  70. {mode: parseInt('0666', 8)}
  71. );
  72. done();
  73. });
  74. after(function (done) {
  75. remove(__dirname + '/test-date-rolling-file-stream-3', done);
  76. });
  77. it('should pass them to the underlying stream', function (done) {
  78. stream.theStream.mode.should.eql(parseInt('0666', 8));
  79. done();
  80. });
  81. });
  82. describe('with stream arguments but no pattern', function () {
  83. var stream;
  84. before(function (done) {
  85. stream = new DateRollingFileStream(
  86. __dirname + '/test-date-rolling-file-stream-4',
  87. {mode: parseInt('0666', 8)}
  88. );
  89. done();
  90. });
  91. after(function (done) {
  92. remove(__dirname + '/test-date-rolling-file-stream-4', done);
  93. });
  94. it('should pass them to the underlying stream', function (done) {
  95. stream.theStream.mode.should.eql(parseInt('0666', 8));
  96. done();
  97. });
  98. it('should use default pattern', function (done) {
  99. stream.options.pattern.should.eql('yyyy-MM-dd');
  100. done();
  101. });
  102. });
  103. describe('with a pattern of .yyyy-MM-dd', function () {
  104. var stream;
  105. before(function (done) {
  106. stream = new DateRollingFileStream(
  107. __dirname + '/test-date-rolling-file-stream-5', '.yyyy-MM-dd',
  108. null
  109. );
  110. stream.write('First message\n', 'utf8', done);
  111. });
  112. after(function (done) {
  113. remove(__dirname + '/test-date-rolling-file-stream-5', done);
  114. });
  115. it('should create a file with the base name', function (done) {
  116. fs.readFile(__dirname + '/test-date-rolling-file-stream-5', 'utf8', function (err, contents) {
  117. contents.should.eql('First message\n');
  118. done(err);
  119. });
  120. });
  121. describe('when the day changes', function () {
  122. before(function (done) {
  123. fakeNow = new Date(2012, 8, 13, 0, 10, 12);
  124. stream.write('Second message\n', 'utf8', done);
  125. });
  126. after(function (done) {
  127. remove(__dirname + '/test-date-rolling-file-stream-5.2012-09-12', done);
  128. });
  129. describe('the number of files', function () {
  130. var files = [];
  131. before(function (done) {
  132. fs.readdir(__dirname, function (err, list) {
  133. files = list;
  134. done(err);
  135. });
  136. });
  137. it('should be two', function (done) {
  138. files.filter(
  139. function (file) {
  140. return file.indexOf('test-date-rolling-file-stream-5') > -1;
  141. }
  142. ).should.have.length(2);
  143. done();
  144. });
  145. });
  146. describe('the file without a date', function () {
  147. it('should contain the second message', function (done) {
  148. fs.readFile(
  149. __dirname + '/test-date-rolling-file-stream-5', 'utf8',
  150. function (err, contents) {
  151. contents.should.eql('Second message\n');
  152. done(err);
  153. }
  154. );
  155. });
  156. });
  157. describe('the file with the date', function () {
  158. it('should contain the first message', function (done) {
  159. fs.readFile(
  160. __dirname + '/test-date-rolling-file-stream-5.2012-09-12', 'utf8',
  161. function (err, contents) {
  162. contents.should.eql('First message\n');
  163. done(err);
  164. }
  165. );
  166. });
  167. });
  168. });
  169. });
  170. describe('with alwaysIncludePattern', function () {
  171. var stream;
  172. before(function (done) {
  173. fakeNow = new Date(2012, 8, 12, 11, 10, 12);
  174. remove(
  175. __dirname + '/test-date-rolling-file-stream-pattern.2012-09-12-11.log',
  176. function () {
  177. stream = new DateRollingFileStream(
  178. __dirname + '/test-date-rolling-file-stream-pattern',
  179. '.yyyy-MM-dd-hh.log',
  180. {alwaysIncludePattern: true}
  181. );
  182. setTimeout(function () {
  183. stream.write('First message\n', 'utf8', done);
  184. }, 50);
  185. }
  186. );
  187. });
  188. after(function (done) {
  189. remove(__dirname + '/test-date-rolling-file-stream-pattern.2012-09-12-11.log', done);
  190. });
  191. it('should create a file with the pattern set', function (done) {
  192. fs.readFile(
  193. __dirname + '/test-date-rolling-file-stream-pattern.2012-09-12-11.log', 'utf8',
  194. function (err, contents) {
  195. contents.should.eql('First message\n');
  196. done(err);
  197. }
  198. );
  199. });
  200. describe('when the day changes', function () {
  201. before(function (done) {
  202. fakeNow = new Date(2012, 8, 12, 12, 10, 12);
  203. stream.write('Second message\n', 'utf8', done);
  204. });
  205. after(function (done) {
  206. remove(__dirname + '/test-date-rolling-file-stream-pattern.2012-09-12-12.log', done);
  207. });
  208. describe('the number of files', function () {
  209. it('should be two', function (done) {
  210. fs.readdir(__dirname, function (err, files) {
  211. files.filter(
  212. function (file) {
  213. return file.indexOf('test-date-rolling-file-stream-pattern') > -1;
  214. }
  215. ).should.have.length(2);
  216. done(err);
  217. });
  218. });
  219. });
  220. describe('the file with the later date', function () {
  221. it('should contain the second message', function (done) {
  222. fs.readFile(
  223. __dirname + '/test-date-rolling-file-stream-pattern.2012-09-12-12.log', 'utf8',
  224. function (err, contents) {
  225. contents.should.eql('Second message\n');
  226. done(err);
  227. }
  228. );
  229. });
  230. });
  231. describe('the file with the date', function () {
  232. it('should contain the first message', function (done) {
  233. fs.readFile(
  234. __dirname + '/test-date-rolling-file-stream-pattern.2012-09-12-11.log', 'utf8',
  235. function (err, contents) {
  236. contents.should.eql('First message\n');
  237. done(err);
  238. }
  239. );
  240. });
  241. });
  242. });
  243. });
  244. describe('with a pattern that evaluates to digits', function() {
  245. let stream;
  246. before(done => {
  247. fakeNow = new Date(2012, 8, 12, 0, 10, 12);
  248. stream = new DateRollingFileStream(
  249. __dirname + '/digits.log',
  250. '.yyyyMMdd'
  251. );
  252. stream.write('First message\n', 'utf8', done);
  253. });
  254. describe('when the day changes', function () {
  255. before(function (done) {
  256. fakeNow = new Date(2012, 8, 13, 0, 10, 12);
  257. stream.write('Second message\n', 'utf8', done);
  258. });
  259. it('should be two files (it should not get confused by indexes)', function (done) {
  260. fs.readdir(__dirname, function (err, files) {
  261. var logFiles = files.filter(
  262. function (file) {
  263. return file.indexOf('digits.log') > -1;
  264. }
  265. );
  266. logFiles.should.have.length(2);
  267. fs.readFile(__dirname + '/digits.log.20120912', 'utf8',
  268. (err, contents) => {
  269. contents.should.eql('First message\n');
  270. fs.readFile(__dirname + '/digits.log', 'utf8', (e, c) => {
  271. c.should.eql('Second message\n');
  272. done(err || e);
  273. });
  274. }
  275. );
  276. });
  277. });
  278. });
  279. after(function (done) {
  280. remove(
  281. __dirname + '/digits.log',
  282. function () {
  283. remove(__dirname + '/digits.log.20120912', done);
  284. }
  285. );
  286. });
  287. });
  288. describe('with compress option', function () {
  289. var stream;
  290. before(function (done) {
  291. fakeNow = new Date(2012, 8, 12, 0, 10, 12);
  292. stream = new DateRollingFileStream(
  293. __dirname + '/compressed.log',
  294. '.yyyy-MM-dd',
  295. {compress: true}
  296. );
  297. stream.write('First message\n', 'utf8', done);
  298. });
  299. describe('when the day changes', function () {
  300. before(function (done) {
  301. fakeNow = new Date(2012, 8, 13, 0, 10, 12);
  302. stream.write('Second message\n', 'utf8', done);
  303. });
  304. it('should be two files, one compressed', function (done) {
  305. fs.readdir(__dirname, function (err, files) {
  306. var logFiles = files.filter(
  307. function (file) {
  308. return file.indexOf('compressed.log') > -1;
  309. }
  310. );
  311. logFiles.should.have.length(2);
  312. zlib.gunzip(
  313. fs.readFileSync(__dirname + '/compressed.log.2012-09-12.gz'),
  314. function (err, contents) {
  315. contents.toString('utf8').should.eql('First message\n');
  316. fs.readFileSync(__dirname + '/compressed.log', 'utf8').should.eql('Second message\n');
  317. done(err);
  318. }
  319. );
  320. });
  321. });
  322. });
  323. after(function (done) {
  324. remove(
  325. __dirname + '/compressed.log',
  326. function () {
  327. remove(__dirname + '/compressed.log.2012-09-12.gz', done);
  328. }
  329. );
  330. });
  331. });
  332. describe('with keepFileExt option', function () {
  333. var stream;
  334. before(function (done) {
  335. fakeNow = new Date(2012, 8, 12, 0, 10, 12);
  336. stream = new DateRollingFileStream(
  337. __dirname + '/keepFileExt.log',
  338. '.yyyy-MM-dd',
  339. {keepFileExt: true}
  340. );
  341. stream.write('First message\n', 'utf8', done);
  342. });
  343. describe('when the day changes', function () {
  344. before(function (done) {
  345. fakeNow = new Date(2012, 8, 13, 0, 10, 12);
  346. stream.write('Second message\n', 'utf8', done);
  347. });
  348. it('should be two files', function (done) {
  349. fs.readdir(__dirname, function (err, files) {
  350. var logFiles = files.filter(
  351. function (file) {
  352. return file.indexOf('keepFileExt') > -1;
  353. }
  354. );
  355. logFiles.should.have.length(2);
  356. fs.readFileSync(__dirname + '/keepFileExt.2012-09-12.log', 'utf8')
  357. .should.eql('First message\n');
  358. fs.readFileSync(__dirname + '/keepFileExt.log', 'utf8')
  359. .should.eql('Second message\n');
  360. done(err);
  361. });
  362. });
  363. });
  364. after(function (done) {
  365. remove(
  366. __dirname + '/keepFileExt.log',
  367. function () {
  368. remove(__dirname + '/keepFileExt.2012-09-12.log', done);
  369. }
  370. );
  371. });
  372. });
  373. describe('with compress option and keepFileExt option', function () {
  374. var stream;
  375. before(function (done) {
  376. fakeNow = new Date(2012, 8, 12, 0, 10, 12);
  377. stream = new DateRollingFileStream(
  378. __dirname + '/compressedAndKeepExt.log',
  379. '.yyyy-MM-dd',
  380. {compress: true, keepFileExt: true}
  381. );
  382. stream.write('First message\n', 'utf8', done);
  383. });
  384. describe('when the day changes', function () {
  385. before(function (done) {
  386. fakeNow = new Date(2012, 8, 13, 0, 10, 12);
  387. stream.write('Second message\n', 'utf8', done);
  388. });
  389. it('should be two files, one compressed', function (done) {
  390. fs.readdir(__dirname, function (err, files) {
  391. var logFiles = files.filter(
  392. function (file) {
  393. return file.indexOf('compressedAndKeepExt') > -1;
  394. }
  395. );
  396. logFiles.should.have.length(2);
  397. zlib.gunzip(
  398. fs.readFileSync(__dirname + '/compressedAndKeepExt.2012-09-12.log.gz'),
  399. function (err, contents) {
  400. contents.toString('utf8').should.eql('First message\n');
  401. fs.readFileSync(__dirname + '/compressedAndKeepExt.log', 'utf8')
  402. .should.eql('Second message\n');
  403. done(err);
  404. }
  405. );
  406. });
  407. });
  408. });
  409. after(function (done) {
  410. remove(
  411. __dirname + '/compressedAndKeepExt.log',
  412. function () {
  413. remove(__dirname + '/compressedAndKeepExt.2012-09-12.log.gz', done);
  414. }
  415. );
  416. });
  417. });
  418. describe('with daysToKeep option', function () {
  419. var stream;
  420. var daysToKeep = 4;
  421. var numOriginalLogs = 10;
  422. before(function (done) {
  423. var day = 0;
  424. var streams = [];
  425. async.whilst(
  426. function () {
  427. return day < numOriginalLogs;
  428. },
  429. function (nextCallback) {
  430. fakeNow = new Date(2012, 8, 20 - day, 0, 10, 12);
  431. var currentStream = new DateRollingFileStream(
  432. __dirname + '/daysToKeep.log',
  433. '.yyyy-MM-dd',
  434. {
  435. alwaysIncludePattern: true,
  436. daysToKeep: daysToKeep
  437. }
  438. );
  439. async.waterfall([
  440. function (callback) {
  441. currentStream.write(util.format('Message on day %d\n', day), 'utf8', callback);
  442. },
  443. function (callback) {
  444. fs.utimes(currentStream.filename, fakeNow, fakeNow, callback);
  445. }
  446. ],
  447. function (err) {
  448. day++;
  449. streams.push(currentStream);
  450. nextCallback(err);
  451. });
  452. },
  453. function (err) {
  454. stream = streams[0];
  455. done(err);
  456. });
  457. });
  458. describe('when the day changes', function () {
  459. before(function (done) {
  460. fakeNow = new Date(2012, 8, 21, 0, 10, 12);
  461. stream.write('Second message\n', 'utf8', done);
  462. });
  463. it('should be daysToKeep + 1 files left from numOriginalLogs', function (done) {
  464. fs.readdir(__dirname, function (err, files) {
  465. var logFiles = files.filter(
  466. function (file) {
  467. return file.indexOf('daysToKeep.log') > -1;
  468. }
  469. );
  470. logFiles.should.have.length(daysToKeep + 1);
  471. done(err);
  472. });
  473. });
  474. });
  475. after(function (done) {
  476. fs.readdir(__dirname, function (err, files) {
  477. var logFiles = files.filter(
  478. function (file) {
  479. return file.indexOf('daysToKeep.log') > -1;
  480. }
  481. );
  482. async.each(logFiles, (logFile, nextCallback) => {
  483. remove(__dirname + '/' + logFile, nextCallback);
  484. }, done);
  485. });
  486. });
  487. });
  488. describe('with daysToKeep and compress options', function () {
  489. var stream;
  490. var daysToKeep = 4;
  491. var numOriginalLogs = 10;
  492. before(function (done) {
  493. var day = 0;
  494. var streams = [];
  495. async.whilst(
  496. function () {
  497. return day < numOriginalLogs;
  498. },
  499. function (nextCallback) {
  500. fakeNow = new Date(2012, 8, 20 - day, 0, 10, 12);
  501. var currentStream = new DateRollingFileStream(
  502. __dirname + '/compressedDaysToKeep.log',
  503. '.yyyy-MM-dd',
  504. {
  505. alwaysIncludePattern: true,
  506. compress: true,
  507. daysToKeep: daysToKeep
  508. }
  509. );
  510. async.waterfall([
  511. function (callback) {
  512. currentStream.write(util.format('Message on day %d\n', day), 'utf8', callback);
  513. },
  514. function (callback) {
  515. var filename = currentStream.filename;
  516. var gzip = zlib.createGzip();
  517. var inp = fs.createReadStream(filename);
  518. var out = fs.createWriteStream(filename+'.gz');
  519. inp.pipe(gzip).pipe(out);
  520. out.on('finish', function () {
  521. fs.unlink(filename, callback);
  522. });
  523. },
  524. function (callback) {
  525. fs.utimes(currentStream.filename + '.gz', fakeNow, fakeNow, callback);
  526. }
  527. ],
  528. function (err) {
  529. day++;
  530. streams.push(currentStream);
  531. nextCallback(err);
  532. });
  533. },
  534. () => {
  535. stream = streams[0];
  536. done();
  537. }
  538. );
  539. });
  540. describe('when the day changes', function () {
  541. before(function (done) {
  542. fakeNow = new Date(2012, 8, 21, 0, 10, 12);
  543. stream.write('New file message\n', 'utf8', done);
  544. });
  545. it('should be 4 files left from original 3', function (done) {
  546. fs.readdir(__dirname, function (err, files) {
  547. var logFiles = files.filter(
  548. function (file) {
  549. return file.indexOf('compressedDaysToKeep.log') > -1;
  550. }
  551. );
  552. logFiles.should.have.length(daysToKeep + 1);
  553. done(err);
  554. });
  555. });
  556. });
  557. after(function (done) {
  558. fs.readdir(__dirname, function (err, files) {
  559. var logFiles = files.filter(
  560. function (file) {
  561. return file.indexOf('compressedDaysToKeep.log') > -1;
  562. }
  563. );
  564. async.each(logFiles, function (logFile, nextCallback) {
  565. remove(__dirname + '/' + logFile, nextCallback);
  566. },
  567. function (err) {
  568. done(err);
  569. });
  570. });
  571. });
  572. });
  573. });