From 40cbfaf5807a7adaa05214552a2a78faf2aa4b0a Mon Sep 17 00:00:00 2001 From: "Thiago Marcos P. Santos" Date: Wed, 1 Mar 2017 10:02:27 -0800 Subject: [PATCH] [node] Fix memory test hanging after GlyphAtlas refactoring Replies are assumed to be asynchronous after e3500c1f791be82. --- platform/node/src/node_request.cpp | 10 ++++++ platform/node/src/node_request.hpp | 6 ++++ platform/node/test/memory.test.js | 41 +++-------------------- platform/node/test/mockfs.js | 53 ++++++++++++++++++++++++++++++ 4 files changed, 73 insertions(+), 37 deletions(-) create mode 100644 platform/node/test/mockfs.js diff --git a/platform/node/src/node_request.cpp b/platform/node/src/node_request.cpp index de16710f788..09373b17797 100644 --- a/platform/node/src/node_request.cpp +++ b/platform/node/src/node_request.cpp @@ -122,9 +122,19 @@ void NodeRequest::HandleCallback(const Nan::FunctionCallbackInfo& inf } void NodeRequest::Execute() { + asyncExecute = std::make_unique([this] { doExecute(); Unref(); }); + asyncExecute->send(); + + Ref(); +} + +void NodeRequest::doExecute() { + Nan::HandleScope scope; + v8::Local argv[] = { handle() }; Nan::MakeCallback(Nan::To(target->handle()->GetInternalField(1)).ToLocalChecked(), "request", 1, argv); + asyncExecute.reset(); } NodeRequest::NodeAsyncRequest::NodeAsyncRequest(NodeRequest* request_) : request(request_) { diff --git a/platform/node/src/node_request.hpp b/platform/node/src/node_request.hpp index 7d7679a3c7f..356566132b7 100644 --- a/platform/node/src/node_request.hpp +++ b/platform/node/src/node_request.hpp @@ -8,6 +8,9 @@ #include #include +#include + +#include namespace node_mbgl { @@ -35,9 +38,12 @@ class NodeRequest : public Nan::ObjectWrap, void Execute(); private: + void doExecute(); + NodeMap* target; mbgl::FileSource::Callback callback; NodeAsyncRequest* asyncRequest = nullptr; + std::unique_ptr asyncExecute; }; } diff --git a/platform/node/test/memory.test.js b/platform/node/test/memory.test.js index e23cb60f89c..997ccdbbe19 100644 --- a/platform/node/test/memory.test.js +++ b/platform/node/test/memory.test.js @@ -1,8 +1,7 @@ 'use strict'; -var fs = require('fs'); +var mockfs = require('./mockfs'); var mbgl = require('../index'); -var path = require('path'); var test = require('tape'); var testParams = { @@ -12,20 +11,6 @@ var testParams = { 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 @@ -34,25 +19,7 @@ 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') || 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); - } + callback(null, { data: mockfs.dataForRequest(req) }); }, ratio: testParams.ratio, }; @@ -75,9 +42,9 @@ test('Memory', function(t) { var map = mapPool.shift(); if (Math.floor(Math.random() * 2)) { - map.load(style_raster); + map.load(mockfs.style_raster); } else { - map.load(style_vector); + map.load(mockfs.style_vector); } map.render({ zoom: 16 }, function(err, pixels) { diff --git a/platform/node/test/mockfs.js b/platform/node/test/mockfs.js new file mode 100644 index 00000000000..dfa5a425e35 --- /dev/null +++ b/platform/node/test/mockfs.js @@ -0,0 +1,53 @@ +"use strict"; + +var fs = require('fs'); +var path = require('path'); + +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'); + +function dataForRequest(req) { + if (req.url == null) { + return null; + } else if (req.url.indexOf('sprite') > -1 && req.url.endsWith('json')) { + return sprite_json; + } else if (req.url.indexOf('sprite') > -1 && req.url.endsWith('png')) { + return sprite_png; + } else if (req.url.indexOf('fonts') > -1 && req.url.endsWith('pbf')) { + return glyph; + } else if (req.url.endsWith('mapbox.satellite')) { + return source_raster; + } else if (req.url.indexOf('satellite') > -1 && (req.url.endsWith('png') || req.url.endsWith('webp'))) { + return tile_raster; + } else if (req.url.endsWith('mapbox.mapbox-streets-v7')) { + return source_vector; + } else if (req.url.indexOf('streets') > -1 && req.url.endsWith('pbf')) { + return tile_vector; + } else { + return null; + } +}; + +module.exports = { + dataForRequest: dataForRequest, + style_raster: style_raster, + style_vector: style_vector, + sprite_json: sprite_json, + sprite_png: sprite_png, + glyph: glyph, + source_raster: source_raster, + source_vector: source_vector, + tile_raster: tile_raster, + tile_vector: tile_vector +};