UNPKG

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