UNPKG

4.13 kBJavaScriptView Raw
1// Copyright (c) 2015 Uber Technologies, Inc.
2//
3// Permission is hereby granted, free of charge, to any person obtaining a copy
4// of this software and associated documentation files (the "Software"), to deal
5// in the Software without restriction, including without limitation the rights
6// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7// copies of the Software, and to permit persons to whom the Software is
8// furnished to do so, subject to the following conditions:
9//
10// The above copyright notice and this permission notice shall be included in
11// all copies or substantial portions of the Software.
12//
13// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19// THE SOFTWARE.
20
21var assert = require('assert');
22var Writable = require('readable-stream/writable');
23
24var Logger = require('../logger.js');
25
26// var counter = 0;
27var startRSS = process.memoryUsage().rss;
28
29console.log('# Logger supports back pressure');
30
31var backend = {
32 createStream: function () {
33 return LeakStream();
34 }
35};
36
37var logger = Logger({
38 meta: {},
39 backends: {
40 myBackend: backend
41 },
42 levels: {
43 info: {
44 backends: ['myBackend'],
45 level: 30
46 }
47 }
48});
49
50var onceA = checkedWrite(logger);
51// console.log('onceA', onceA);
52eqaulTAP(onceA.after.stream.length, 1000,
53 'onceA stream length is 1000');
54eqaulTAP(onceA.after.stream.buffer, 999,
55 'onceA stream buffer is 999');
56
57var deltaA = memoryGrowth(onceA);
58eqaulTAP(deltaA > 3, true,
59 'expected deltaA to be greater then 5 but found ' + deltaA);
60
61setTimeout(function () {
62 var onceB = checkedWrite(logger);
63 // console.log('onceB', onceB);
64 eqaulTAP(onceB.after.stream.length, 1000,
65 'onceB stream length is 1000');
66 eqaulTAP(onceB.after.stream.buffer, 999,
67 'onceB stream buffer is 999');
68
69 var deltaB = memoryGrowth(onceB);
70
71 eqaulTAP(deltaB < 1, true,
72 'expected deltaB to be less then 1 but found ' + deltaB);
73
74 setTimeout(function () {
75 var onceC = checkedWrite(logger);
76 // console.log('onceC', onceC);
77 eqaulTAP(onceC.after.stream.length, 1000,
78 'onceC stream length is 1000');
79 eqaulTAP(onceC.after.stream.buffer, 999,
80 'onceC stream length is 999');
81
82 var deltaC = memoryGrowth(onceC);
83
84 eqaulTAP(deltaC < 0.5, true,
85 'expected deltaC to be less then 1 but found ' +
86 deltaC);
87
88 logger.destroy();
89 }, 50);
90}, 50);
91
92function memoryGrowth(x) {
93 return (
94 (x.after.mem.rss - startRSS) /
95 (x.before.mem.rss - startRSS)
96 ) - 1;
97}
98
99function checkedWrite(logger) {
100 var LOOP = 2e4; // write 2k items, hwm is 1k
101
102 var before = inspect(logger);
103
104 for (var i = 0; i < LOOP; i++) {
105 logger.info('some message', {
106 random: 'junk'
107 });
108 }
109
110 return {
111 before: before,
112 after: inspect(logger)
113 };
114}
115
116function LeakStream() {
117 var s = new Writable({
118 objectMode: true,
119 highWaterMark: 1000
120 });
121 s._write = function leak(chunk, enc, cb) {
122 // do not call the cb()
123 // ignore the chunk
124 // infinite memory leak.
125 };
126 return s;
127}
128
129function inspect(logger) {
130 var state = logger.streams.myBackend._writableState;
131
132 return {
133 mem: process.memoryUsage(),
134 stream: {
135 length: state.length,
136 buffer: state.buffer.length
137 // ,keys: Object.keys(state)
138 }
139 };
140}
141
142function eqaulTAP(a, b, message) {
143 try {
144 assert.equal(a, b, message);
145 console.log('ok ' + message);
146 } catch (err) {
147 console.log('not ok ' + message);
148 throw err;
149 }
150}