1 |
|
2 | e = require 'expect.js'
|
3 | fs = require 'fs'
|
4 | path = require 'path'
|
5 | stream = require 'stream'
|
6 | ep = require 'event-pipe'
|
7 |
|
8 | class mockStream
|
9 | constructor : () -> @chunks = []
|
10 | write : (chunk) ->
|
11 | @chunks.push chunk
|
12 | clean : -> chunks = []
|
13 | toString : (nocolor = true) ->
|
14 | data = ''
|
15 | for chunk in @chunks
|
16 | data += chunk.toString()
|
17 | data
|
18 | toStringNoColor : (nocolor = true) ->
|
19 | data = ''
|
20 | for chunk in @chunks
|
21 | data += chunk.toString()
|
22 | data.replace /\x1b\[\d+m/g, ''
|
23 |
|
24 |
|
25 |
|
26 |
|
27 | mock =
|
28 | send : ''
|
29 | headers : {}
|
30 | req :
|
31 | url : '/'
|
32 | headers :
|
33 | 'user-agent' : 'mock server'
|
34 | 'referer' : 'mock refer'
|
35 | socket :
|
36 | remoteAddress : '127.0.0.1'
|
37 | httpVersionMajor : 1
|
38 | httpVersionMinor : 1
|
39 | method : 'GET'
|
40 | resp :
|
41 | write : (data)-> mock.send += data.toString() if data?
|
42 | end : (data)-> mock.send += data.toString() if data?
|
43 | statusCode : 0
|
44 | setHeader : (name, value) -> mock.headers[name.toLowerCase()] = value
|
45 | getHeader : (name) -> mock.headers[name.toLowerCase()]
|
46 | clean : ->
|
47 | mock.send = ''
|
48 | mock.headers = {}
|
49 | mock.resp.statusCode = 0
|
50 | mock.url = '/'
|
51 | mock.resp.headers = mock.headers
|
52 |
|
53 | describe 'buffer JustLog', ->
|
54 | jl = require '../lib/justlog'
|
55 | {pre: predefined} = require '../lib/pattern'
|
56 | options = stdout = stderr = l = null
|
57 | dir = "#{__dirname}/log_file"
|
58 |
|
59 | beforeEach ->
|
60 | mock.clean()
|
61 | jl.config flushTime : 10
|
62 | stdout = new mockStream
|
63 | stderr = new mockStream
|
64 | options =
|
65 | file:
|
66 | path : "[#{dir}/test.txt]"
|
67 | stdio :
|
68 | stdout : stdout
|
69 | stderr : stderr
|
70 | bufferLength : 5
|
71 |
|
72 |
|
73 | afterEach (done)->
|
74 | jl.end()
|
75 | return done() if not l?
|
76 | l.close ()->
|
77 | setTimeout ->
|
78 | try
|
79 | for file in fs.readdirSync dir
|
80 | fs.unlinkSync "#{dir}/#{file}"
|
81 | fs.rmdirSync dir
|
82 | done()
|
83 | , 100
|
84 | l = null
|
85 |
|
86 | describe 'options init', ->
|
87 | it 'check options', (done)->
|
88 | l = new jl bufferLength : 5
|
89 | e(l.options.bufferLength).to.be 5
|
90 | setTimeout done, 100
|
91 | describe 'stdio', ->
|
92 | it 'stdout with default output pattern', (done)->
|
93 | options.file = false
|
94 | l = new jl options
|
95 | l.info 'simple info'
|
96 | l.debug 'simple debug'
|
97 | l.warn 'simple warn'
|
98 | l.error 'simple error'
|
99 | e(stdout.toStringNoColor()).to.match ///
|
100 | ^
|
101 | \d{2}:\d{2}:\d{2}\s
|
102 | INFO\s+(out/test/)?tests/test-bufferlog\.(js|coffee):\d+\ssimple\sinfo\n
|
103 | \d{2}:\d{2}:\d{2}\s
|
104 | DEBUG\s+(out/test/)?tests/test-bufferlog\.(js|coffee):\d+\ssimple\sdebug\n
|
105 | $
|
106 | ///
|
107 | e(stderr.toStringNoColor()).to.match ///
|
108 | ^
|
109 | \d{2}:\d{2}:\d{2}\s
|
110 | WARN\s+(out/test/)?tests/test-bufferlog\.(js|coffee):\d+\ssimple\swarn\n
|
111 | \d{2}:\d{2}:\d{2}\s
|
112 | ERROR\s+(out/test/)?tests/test-bufferlog\.(js|coffee):\d+\ssimple\serror\n
|
113 | $
|
114 | ///
|
115 | done()
|
116 | it 'stdout with default output pattern', (done)->
|
117 | options.file.level = 0
|
118 | options.stdio.level = jl.INFO | jl.DEBUG
|
119 | l = new jl options
|
120 | l.info 'simple info', 'data2', 123
|
121 | l.debug 'simple debug %s %d %s %j', 'data3', 456, [1, 2, 3], a:1
|
122 | l.warn 'simple warn %s'
|
123 | l.error 'simple error'
|
124 | e(stdout.toStringNoColor()).to.match ///
|
125 | ^
|
126 | \d{2}:\d{2}:\d{2}\s
|
127 | INFO\s+(out/test/)?tests/test-bufferlog\.(js|coffee):\d+\ssimple\sinfo\sdata2\s123\n
|
128 | \d{2}:\d{2}:\d{2}\s
|
129 | DEBUG\s+(out/test/)?tests/test-bufferlog\.(js|coffee):\d+\ssimple\sdebug\sdata3\s456\s1,2,3\s\{"a":1\}\n
|
130 | $
|
131 | ///
|
132 | e(stderr.toStringNoColor()).to.be ''
|
133 | done()
|
134 | describe 'file', ->
|
135 | it 'write log over buffer length', (done)->
|
136 | options.stdio = false
|
137 | l = new jl options
|
138 | l.warn 'simple warn'
|
139 | l.error 'simple error'
|
140 | l.error 'simple error'
|
141 | l.error 'simple error'
|
142 | l.error 'simple error'
|
143 | e(fs.readFileSync(l.file.path).toString()).to.eql ''
|
144 | e(l.file.stream._buffer.length).to.be 5
|
145 | l.error 'simple error'
|
146 | e(l.file.stream._buffer.length).to.be 0
|
147 | l.close ->
|
148 | e(fs.readFileSync(l.file.path).toString()).to.match ///
|
149 | ^
|
150 | \d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2}\s
|
151 | \[WARN\]\s+\((out/test/)?tests/test-bufferlog\.(js|coffee):\d+\)\ssimple\swarn\n
|
152 | \d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2}\s
|
153 | \[ERROR\]\s+\((out/test/)?tests/test-bufferlog\.(js|coffee):\d+\)\ssimple\serror\n
|
154 | \d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2}\s
|
155 | \[ERROR\]\s+\((out/test/)?tests/test-bufferlog\.(js|coffee):\d+\)\ssimple\serror\n
|
156 | \d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2}\s
|
157 | \[ERROR\]\s+\((out/test/)?tests/test-bufferlog\.(js|coffee):\d+\)\ssimple\serror\n
|
158 | \d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2}\s
|
159 | \[ERROR\]\s+\((out/test/)?tests/test-bufferlog\.(js|coffee):\d+\)\ssimple\serror\n
|
160 | \d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2}\s
|
161 | \[ERROR\]\s+\((out/test/)?tests/test-bufferlog\.(js|coffee):\d+\)\ssimple\serror\n
|
162 | $
|
163 | ///
|
164 | done()
|
165 |
|
166 | it 'write log when time out', (done)->
|
167 | options.stdio = false
|
168 | options.duration = 100
|
169 | l = new jl options
|
170 | l.warn 'simple warn'
|
171 | l.error 'simple error'
|
172 | e(fs.readFileSync(l.file.path).toString()).to.eql ''
|
173 | e(l.file.stream._buffer.length).to.be 2
|
174 | setTimeout ->
|
175 | e(fs.readFileSync(l.file.path).toString()).to.match ///
|
176 | ^
|
177 | \d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2}\s
|
178 | \[WARN\]\s+\((out/test/)?tests/test-bufferlog\.(js|coffee):\d+\)\ssimple\swarn\n
|
179 | \d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2}\s
|
180 | \[ERROR\]\s+\((out/test/)?tests/test-bufferlog\.(js|coffee):\d+\)\ssimple\serror\n
|
181 | $
|
182 | ///
|
183 | l.close done
|
184 | , 200
|
185 |
|
186 | it 'write multiple log when time out', (done)->
|
187 | options.stdio = false
|
188 | options.duration = 100
|
189 | l = jl.create options
|
190 | l.warn 'simple warn'
|
191 | l.error 'simple error'
|
192 | options2 =
|
193 | file:
|
194 | path : "[#{dir}/test1.txt]"
|
195 | stdio : false
|
196 | bufferLength : 5
|
197 | duration : 300
|
198 | l2 = jl.create options2
|
199 | l2.warn 'log warn'
|
200 | l2.error 'log error'
|
201 | setTimeout ->
|
202 | e(fs.readFileSync(l.file.path).toString()).to.eql ''
|
203 | e(l.file.stream._buffer.length).to.be 2
|
204 | e(fs.readFileSync(l2.file.path).toString()).to.eql ''
|
205 | e(l2.file.stream._buffer.length).to.be 2
|
206 | , 90
|
207 | setTimeout ->
|
208 | e(fs.readFileSync(l.file.path).toString()).to.match ///
|
209 | ^
|
210 | \d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2}\s
|
211 | \[WARN\]\s+\((out/test/)?tests/test-bufferlog\.(js|coffee):\d+\)\ssimple\swarn\n
|
212 | \d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2}\s
|
213 | \[ERROR\]\s+\((out/test/)?tests/test-bufferlog\.(js|coffee):\d+\)\ssimple\serror\n
|
214 | $
|
215 | ///
|
216 | e(fs.readFileSync(l2.file.path).toString()).to.eql ''
|
217 | , 200
|
218 | setTimeout ->
|
219 | e(fs.readFileSync(l2.file.path).toString()).to.match ///
|
220 | ^
|
221 | \d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2}\s
|
222 | \[WARN\]\s+\((out/test/)?tests/test-bufferlog\.(js|coffee):\d+\)\slog\swarn\n
|
223 | \d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2}\s
|
224 | \[ERROR\]\s+\((out/test/)?tests/test-bufferlog\.(js|coffee):\d+\)\slog\serror\n
|
225 | $
|
226 | ///
|
227 | ep([
|
228 | ->
|
229 | l.close @
|
230 | , ->
|
231 | l2.close @
|
232 | ], ->
|
233 | done()
|
234 | ).run()
|
235 | , 400
|
236 |
|
237 | describe 'end', ->
|
238 | it 'close all log inst', (done)->
|
239 | options.stdio = false
|
240 | options.duration = 100
|
241 | l = jl.create options
|
242 | l.warn 'simple warn'
|
243 | l.error 'simple error'
|
244 | options2 =
|
245 | file:
|
246 | path : "[#{dir}/test1.txt]"
|
247 | stdio : false
|
248 | bufferLength : 5
|
249 | duration : 300
|
250 | l2 = jl.create options2
|
251 | l2.warn 'log warn'
|
252 | l2.error 'log error'
|
253 | setTimeout ->
|
254 | e(fs.readFileSync(l.file.path).toString()).to.match ///
|
255 | ^
|
256 | \d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2}\s
|
257 | \[WARN\]\s+\((out/test/)?tests/test-bufferlog\.(js|coffee):\d+\)\ssimple\swarn\n
|
258 | \d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2}\s
|
259 | \[ERROR\]\s+\((out/test/)?tests/test-bufferlog\.(js|coffee):\d+\)\ssimple\serror\n
|
260 | $
|
261 | ///
|
262 | e(fs.readFileSync(l2.file.path).toString()).to.eql ''
|
263 | jl.end ->
|
264 | e(fs.readFileSync(l2.file.path).toString()).to.match ///
|
265 | ^
|
266 | \d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2}\s
|
267 | \[WARN\]\s+\((out/test/)?tests/test-bufferlog\.(js|coffee):\d+\)\slog\swarn\n
|
268 | \d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2}\s
|
269 | \[ERROR\]\s+\((out/test/)?tests/test-bufferlog\.(js|coffee):\d+\)\slog\serror\n
|
270 | $
|
271 | ///
|
272 | done()
|
273 | , 200
|
274 |
|