summaryrefslogtreecommitdiff
path: root/platform/node/test/memory.test.js
blob: ad5409883210249172a470f1e714de12476733f8 (plain)
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
'use strict';

var fs = require('fs');
var mbgl = require('../index');
var path = require('path');
var test = require('tape');

var testParams = {
    mapPoolSize: 10,
    numRenderings: 100,
    heapGrowthThreshold: 0,
    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) {
    // Trigger garbage collection before starting test, then initialize 
    // heap size
    if (typeof gc === 'function') gc();
    var lastHeapSize = process.memoryUsage()['heapUsed'];

    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') || req.url.endsWith('webp'))) {
                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 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) {
                // Manually trigger garbage collection
                if (typeof gc === 'function') gc();
                
                var currentHeapSize = process.memoryUsage()['heapUsed'];

                // Print some progress, so slow build bots don't timeout.
                t.comment("Rendering (" + renderCount.toString() +
                    "/" + testParams.numRenderings.toString() + ")");

                heapGrowth = heapGrowth + currentHeapSize - lastHeapSize;
                lastHeapSize = currentHeapSize;
            }

            if (++renderCount == testParams.numRenderings) {
                t.ok(heapGrowth < testParams.heapGrowthThreshold, heapGrowth);
                t.end();

                clearInterval(interval);
            }
        });
    }, 1);
});