UNPKG

libxmljs

Version:

libxml bindings for v8 javascript engine

105 lines 3.57 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var libxml = require("../index"); var semver = require("semver"); if (!global.gc) { throw new Error("must run with --expose_gc for memory management tests"); } var nodeVersion = process.versions.node; var shouldSkip = semver.satisfies(nodeVersion, "8.x || 9.x || 10.x || 11.x || 12.x"); module.exports.setUp = function (done) { collectGarbage(); done(); }; module.exports.inaccessible_document_freed = function (assert) { var xml_memory_before_document = libxml.memoryUsage(); for (var i = 0; i < 10; i++) { makeDocument(); } collectGarbage(); assert.ok(libxml.memoryUsage() <= xml_memory_before_document); assert.done(); }; module.exports.inaccessible_document_freed_when_node_freed = function (assert) { if (shouldSkip) { assert.done(); console.warn("skipping inaccessible_document_freed_when_node_freed"); return; } var xmlCountBefore = libxml.nodeCount(); var xml_memory_before_document = libxml.memoryUsage(); (function () { var nodes = []; for (var i = 0; i < 10; i++) { nodes.push(makeDocument().get("//center")); } nodes = null; })(); collectGarbage(); assert.equal(libxml.nodeCount(), xmlCountBefore); assert.ok(libxml.memoryUsage() <= xml_memory_before_document); assert.done(); }; module.exports.inaccessible_document_freed_after_middle_nodes_proxied = function (assert) { var xml_memory_before_document = libxml.memoryUsage(); var xmlCountBefore = libxml.nodeCount(); var doc = makeDocument(); var middle = doc.get("//middle"); var inner = doc.get("//inner"); inner.remove(); doc = middle = inner = null; collectGarbage(); assert.equal(libxml.nodeCount(), xmlCountBefore); assert.ok(libxml.memoryUsage() <= xml_memory_before_document); assert.done(); }; module.exports.inaccessible_tree_freed = function (assert) { if (shouldSkip) { assert.done(); console.warn("skipping inaccessible_tree_freed"); return; } var doc = makeDocument(); var xml_memory_after_document = libxml.memoryUsage(); (function () { doc.get("//middle").remove(); })(); collectGarbage(); assert.ok(libxml.memoryUsage() < xml_memory_after_document); assert.done(); }; module.exports.namespace_list_freed = function (assert) { var doc = makeDocument(); var el = doc.get("//center"); el.namespace("bar", null); var xmlMemBefore = libxml.memoryUsage(); var xmlCountBefore = libxml.nodeCount(); for (var i = 0; i < 1000; i++) { el.namespaces(); } collectGarbage(); assert.equal(libxml.nodeCount(), xmlCountBefore); assert.ok(libxml.memoryUsage() <= xmlMemBefore); assert.done(); }; function makeDocument() { var body = "<?xml version='1.0' encoding='UTF-8'?>\n" + "<root><outer><middle><inner><center/></inner></middle></outer></root>"; return libxml.parseXml(body); } function collectGarbage(minCycles, maxCycles) { minCycles = minCycles || 3; maxCycles = maxCycles || 10; var cycles = 0; var freedRss = 0; var usage = process.memoryUsage(); do { global.gc(); var usageAfterGc = process.memoryUsage(); freedRss = usage.rss - usageAfterGc.rss; usage = usageAfterGc; cycles++; } while (cycles < minCycles || (freedRss !== 0 && cycles < maxCycles)); return usage; } //# sourceMappingURL=memory_management.js.map