UNPKG

4.24 kBJavaScriptView Raw
1return // dont run this test for now since tape is weird and broken on 0.10
2
3var fs = require('fs')
4var JSONStream = require('../')
5var file = process.argv[2] || '/tmp/JSONStream-test-large.json'
6var size = Number(process.argv[3] || 100000)
7var tape = require('tape')
8// if (process.title !== 'browser') {
9 tape('out of mem', function (t) {
10 t.plan(1)
11 //////////////////////////////////////////////////////
12 // Produces a random number between arg1 and arg2
13 //////////////////////////////////////////////////////
14 var randomNumber = function (min, max) {
15 var number = Math.floor(Math.random() * (max - min + 1) + min);
16 return number;
17 };
18
19 //////////////////////////////////////////////////////
20 // Produces a random string of a length between arg1 and arg2
21 //////////////////////////////////////////////////////
22 var randomString = function (min, max) {
23
24 // add several spaces to increase chanses of creating 'words'
25 var chars = ' 0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
26 var result = '';
27
28 var randomLength = randomNumber(min, max);
29
30 for (var i = randomLength; i > 0; --i) {
31 result += chars[Math.round(Math.random() * (chars.length - 1))];
32 }
33 return result;
34 };
35
36 //////////////////////////////////////////////////////
37 // Produces a random JSON document, as a string
38 //////////////////////////////////////////////////////
39 var randomJsonDoc = function () {
40
41 var doc = {
42 "CrashOccurenceID": randomNumber(10000, 50000),
43 "CrashID": randomNumber(1000, 10000),
44 "SiteName": randomString(10, 25),
45 "MachineName": randomString(10, 25),
46 "Date": randomString(26, 26),
47 "ProcessDuration": randomString(18, 18),
48 "ThreadIdentityName": null,
49 "WindowsIdentityName": randomString(15, 40),
50 "OperatingSystemName": randomString(35, 65),
51 "DetailedExceptionInformation": randomString(100, 800)
52 };
53
54 doc = JSON.stringify(doc);
55 doc = doc.replace(/\,/g, ',\n'); // add new lines after each attribute
56 return doc;
57 };
58
59 //////////////////////////////////////////////////////
60 // generates test data
61 //////////////////////////////////////////////////////
62 var generateTestData = function (cb) {
63
64 console.log('generating large data file...');
65
66 var stream = fs.createWriteStream(file, {
67 encoding: 'utf8'
68 });
69
70 var i = 0;
71 var max = size;
72 var writing = false
73 var split = ',\n';
74 var doc = randomJsonDoc();
75 stream.write('[');
76
77 function write () {
78 if(writing) return
79 writing = true
80 while(++i < max) {
81 if(Math.random() < 0.001)
82 console.log('generate..', i + ' / ' + size)
83 if(!stream.write(doc + split)) {
84 writing = false
85 return stream.once('drain', write)
86 }
87 }
88 stream.write(doc + ']')
89 stream.end();
90 console.log('END')
91 }
92 write()
93 stream.on('close', cb)
94 };
95
96 //////////////////////////////////////////////////////
97 // Shows that parsing 100000 instances using JSONStream fails
98 //
99 // After several seconds, you will get this crash
100 // FATAL ERROR: JS Allocation failed - process out of memory
101 //////////////////////////////////////////////////////
102 var testJSONStreamParse_causesOutOfMem = function (done) {
103 var items = 0
104 console.log('parsing data files using JSONStream...');
105
106 var parser = JSONStream.parse([true]);
107 var stream = fs.createReadStream(file);
108 stream.pipe(parser);
109
110 parser.on('data', function (data) {
111 items++
112 if(Math.random() < 0.01) console.log(items, '...')
113 });
114
115 parser.on('end', function () {
116 t.equal(items, size)
117 });
118
119 };
120
121 //////////////////////////////////////////////////////
122 // main
123 //////////////////////////////////////////////////////
124
125 fs.stat(file, function (err, stat) {
126 console.log(stat)
127 if(err)
128 generateTestData(testJSONStreamParse_causesOutOfMem);
129 else
130 testJSONStreamParse_causesOutOfMem()
131 })
132
133 })
134
135// }