UNPKG

4.28 kBJavaScriptView Raw
1var fs = require('fs')
2 , test = require('tape')
3 , path = require('path')
4 , logRotate = require('../');
5
6function fileName() { return __dirname +"/test.log_"+ Math.random(); }
7function getFiles(name, cb) {
8 fs.readdir(__dirname, function(err, files) {
9 if (err) return cb(err);
10 cb(null, files.filter(function(file) {
11 return file.indexOf(path.basename(name)) !== -1;
12 }));
13 });
14}
15function cleanup(name) {
16 getFiles(name, function(err, files) {
17 while (files.length)
18 try { fs.unlinkSync(__dirname +"/"+ files.shift()); } catch (e) {}
19 });
20}
21
22function getSizes(name, cb) {
23 var sizes = []
24 , ct = 0;
25 function done(err) { if (! --ct) cb(err, sizes); }
26
27 getFiles(name, function(err, files) {
28 ct = files.length;
29 files.forEach(function(file) {
30 fs.stat(__dirname +'/'+ file, function(err, st) {
31 sizes.push(st.size);
32 done(err);
33 });
34 });
35 });
36}
37
38function writes(s, ct, cb) {
39 var done = ct || 100
40 , inv;
41
42 if (cb) { s.on('finish', cb); }
43
44 inv = setInterval(function() {
45 var chunk = Date.now() + "\n"; // 14 bytes
46 s.write(chunk);
47 if (! --done) {
48 clearInterval(inv);
49 s.end();
50 }
51 }, 1);
52}
53
54test('rotates based on file size option', function(t) {
55 var files = []
56 , file = fileName();
57
58 var s = logRotate({ file: file, size: 600 });
59
60 s.on('rotated', function(file) {
61 files.push(file);
62 });
63
64 // start writing
65 writes(s, 100, function() {
66 setImmediate(function () {
67 t.equals(files.length, 2, 'should have 2 files');
68 cleanup(file);
69 t.end();
70 });
71 });
72});
73
74test('properly parses size units', function(t) {
75 var values = { '1024': 1024, '1k': 1024, '2k': 2048, '1MB': 1048576, '1g': 1073741824 };
76 Object.keys(values).forEach(function(k) {
77 var file = fileName()
78 , s = logRotate({ file: file, size: k });
79 s.on('ready', function() { cleanup(file); });
80 t.equals(s.size, values[k], 'should parse '+ k +' to '+ values[k]);
81 });
82 t.end();
83});
84
85test('writes the correct number of bytes', function(t) {
86 var bytes = 0
87 , file = fileName();
88
89 var s = logRotate({ file: file, keep: 4, size: 400 });
90
91 // start writing
92 writes(s, 100, function() {
93 getSizes(file, function(err, sizes) {
94 var bytes = 0;
95 while (sizes.length) bytes += sizes.shift();
96 t.equals(bytes, 100*14, 'should have 4 files');
97 cleanup(file);
98 t.end();
99 });
100 });
101});
102
103test('supports object mode writes', function(t) {
104 var file = fileName();
105 var s = logRotate({ file: file, keep: 4, size: 400, objectMode: true });
106
107 function done(err) {
108 if (err) t.fail('failed to support object mode');
109 else t.pass('supports object mode');
110 cleanup(file);
111 t.end();
112 }
113
114 s.on('error', done);
115 s.on('finish', done);
116 s.write({'msg': 'ohai'});
117 s.end();
118});
119
120test('keeps the appropriate number of rotated logs', function(t) {
121 var file = fileName()
122 , s = logRotate({ file: file, size: 600, keep: 5 });
123
124 // start writing
125 writes(s, 200, function() {
126 getFiles(file, function(err, files) {
127 t.equals(files.length, 5, 'should keep 5 files');
128 cleanup(file);
129 t.end();
130 });
131 });
132});
133
134test('chunks large buffers', function(t) {
135 var file = fileName();
136 var s = logRotate({ file: file, keep: 32, size: '1k' });
137
138 s.on('finish', function() {
139 getSizes(file, function(err, sizes) {
140 var bytes = 0, files = 0;
141 while (sizes.length) {
142 files++;
143 bytes += sizes.shift();
144 }
145
146 t.equals(files, 32, 'should write 32 files');
147 t.equals(bytes, total_bytes, 'should write '+ total_bytes +' bytes');
148 cleanup(file);
149 t.end();
150 });
151 });
152
153 var data = '';
154 for (var i = 0, l = 64; i < l; i++) {
155 data += new Array(512).join('1') + '\n';
156 }
157 var total_bytes = data.length;
158 s.write(data);
159 s.end();
160});
161
162test('writes remaining data on finish', function(t) {
163 var file = fileName();
164 var s = logRotate({ file: file, keep: 1, size: '1k' });
165
166 s.writer.on('finish', function() {
167 getSizes(file, function(err, sizes) {
168 t.equals(1, sizes.length, 'should write 1 file');
169 t.equals(14, sizes[0], 'should write 14 bytes');
170 cleanup(file);
171 t.end();
172 });
173 });
174
175 s.write("foo\nbar");
176 s.end("foo\nbar");
177});