diff options
Diffstat (limited to 'platform/node')
-rw-r--r-- | platform/node/test/js/memory.test.js | 106 |
1 files changed, 106 insertions, 0 deletions
diff --git a/platform/node/test/js/memory.test.js b/platform/node/test/js/memory.test.js new file mode 100644 index 0000000000..536342a649 --- /dev/null +++ b/platform/node/test/js/memory.test.js @@ -0,0 +1,106 @@ +'use strict'; + +var fs = require('fs'); +var mbgl = require('../../../../lib/mapbox-gl-native'); +var path = require('path'); +var test = require('tape'); + +var testParams = { + mapPoolSize: 10, + numRenderings: 30, + heapGrowthThreshould: 256 * 1024, // 256 KB + + ratio: 2, +}; + +function readFixture(file) { + return fs.readFileSync(path.join('test/fixtures/resources', file)); +} + +var style_raster = readFixture('style_raster.json').toString('utf8'); +var style_vector = readFixture('style_vector.json').toString('utf8'); +var sprite_json = readFixture('sprite.json'); +var sprite_png = readFixture('sprite.png'); +var glyph = readFixture('glyphs.pbf'); +var source_raster = readFixture('source_raster.json'); +var source_vector = readFixture('source_vector.json'); +var tile_raster = readFixture('raster.tile'); +var tile_vector = readFixture('vector.tile'); + +test('Memory', function(t) { + var options = { + request: function(req, callback) { + if (req.url == null) { + t.fail('invalid file request'); + } else if (req.url.indexOf('sprite') > -1 && req.url.endsWith('json')) { + callback(null, { data: sprite_json }); + } else if (req.url.indexOf('sprite') > -1 && req.url.endsWith('png')) { + callback(null, { data: sprite_png }); + } else if (req.url.indexOf('fonts') > -1 && req.url.endsWith('pbf')) { + callback(null, { data: glyph }); + } else if (req.url.endsWith('mapbox.satellite')) { + callback(null, { data: source_raster }); + } else if (req.url.indexOf('satellite') > -1 && req.url.endsWith('png')) { + callback(null, { data: tile_raster }); + } else if (req.url.endsWith('mapbox.mapbox-streets-v7')) { + callback(null, { data: source_vector }); + } else if (req.url.indexOf('streets') > -1 && req.url.endsWith('pbf')) { + callback(null, { data: tile_vector }); + } else { + t.fail('unhandled file request: ' + req.url); + } + }, + ratio: testParams.ratio, + }; + + var mapPool = [] + + for (var i = 0; i < testParams.mapPoolSize; ++i) { + var map = new mbgl.Map(options); + mapPool.push(map); + } + + var renderCount = 0; + var heapGrowth = 0; + var lastHeapSize = 0; + + var interval = setInterval(function () { + if (mapPool.length == 0) { + return; + } + + var map = mapPool.shift(); + + if (Math.floor(Math.random() * 2)) { + map.load(style_raster); + } else { + map.load(style_vector); + } + + map.render({ zoom: 16 }, function(err, pixels) { + mapPool.push(map); + + if (renderCount % (testParams.numRenderings / 10) == 0) { + var currentHeapSize = process.memoryUsage()['heapUsed']; + + // Print some progress, so slow build bots don't timeout. + t.comment("Rendering (" + renderCount.toString() + + "/" + testParams.numRenderings.toString() + ")"); + + if (lastHeapSize == 0) { + lastHeapSize = currentHeapSize; + } + + heapGrowth = heapGrowth + currentHeapSize - lastHeapSize; + lastHeapSize = currentHeapSize; + } + + if (++renderCount == testParams.numRenderings) { + t.ok(heapGrowth < testParams.heapGrowthThreshould, heapGrowth); + t.end(); + + clearInterval(interval); + } + }); + }, 1); +}); |