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