Skip to content

Commit 0f9e542

Browse files
committed
Add oid leak tests
1 parent 2e6b27c commit 0f9e542

File tree

3 files changed

+59
-24
lines changed

3 files changed

+59
-24
lines changed

test/tests/commit.js

+4-24
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ var promisify = require("promisify-node");
44
var fse = promisify(require("fs-extra"));
55

66
var garbageCollect = require("../utils/garbage_collect.js");
7+
var leakTest = require("../utils/leak_test");
78

89
var local = path.join.bind(path, __dirname);
910

@@ -627,30 +628,9 @@ describe("Commit", function() {
627628
it("does not leak", function() {
628629
var test = this;
629630

630-
garbageCollect();
631-
var Commit = NodeGit.Commit;
632-
var startSelfFreeingCount = Commit.getSelfFreeingInstanceCount();
633-
var startNonSelfFreeingCount = Commit.getNonSelfFreeingConstructedCount();
634-
635-
var resolve;
636-
var promise = new Promise(function(_resolve) { resolve = _resolve; });
637-
638-
NodeGit.Commit.lookup(test.repository, oid)
639-
.then(function() {
640-
// get out of this promise chain to help GC get rid of the commit
641-
setTimeout(resolve, 0);
642-
});
643-
644-
return promise
645-
.then(function() {
646-
garbageCollect();
647-
var endSelfFreeingCount = Commit.getSelfFreeingInstanceCount();
648-
var endNonSelfFreeingCount = Commit.getNonSelfFreeingConstructedCount();
649-
// any new self-freeing commits should have been freed
650-
assert.equal(startSelfFreeingCount, endSelfFreeingCount);
651-
// no new non-self-freeing commits should have been constructed
652-
assert.equal(startNonSelfFreeingCount, endNonSelfFreeingCount);
653-
});
631+
return leakTest(NodeGit.Commit, function() {
632+
return NodeGit.Commit.lookup(test.repository, oid);
633+
});
654634
});
655635

656636
it("duplicates signature", function() {

test/tests/oid.js

+22
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ var assert = require("assert");
22
var path = require("path");
33
var local = path.join.bind(path, __dirname);
44

5+
var leakTest = require("../utils/leak_test");
6+
57
describe("Oid", function() {
68
var NodeGit = require("../../");
79
var Oid = NodeGit.Oid;
@@ -70,4 +72,24 @@ describe("Oid", function() {
7072
var oid2 = Oid.fromString("13c633665257696a3800b0a39ff636b4593f918f");
7173
assert(!this.oid.equal(oid2));
7274
});
75+
76+
it("does not leak constructed Oid", function() {
77+
return leakTest(Oid, function() {
78+
return Promise.resolve(
79+
Oid.fromString("13c633665257696a3800b0a39ff636b4593f918f")
80+
);
81+
});
82+
});
83+
84+
it("does not leak owned Oid", function() {
85+
return leakTest(Oid, function() {
86+
return NodeGit.Repository.open(local("../repos/workdir"))
87+
.then(function(repo) {
88+
return NodeGit.Commit.lookup(repo, oid);
89+
})
90+
.then(function(commit) {
91+
return commit.id();
92+
});
93+
});
94+
});
7395
});

test/utils/leak_test.js

+33
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
var assert = require("assert");
2+
3+
var garbageCollect = require("./garbage_collect");
4+
5+
function leakTest(Type, getInstance) {
6+
garbageCollect();
7+
var startSelfFreeingCount = Type.getSelfFreeingInstanceCount();
8+
var startNonSelfFreeingCount = Type.getNonSelfFreeingConstructedCount();
9+
10+
var resolve;
11+
var promise = new Promise(function(_resolve) { resolve = _resolve; });
12+
13+
getInstance()
14+
.then(function() {
15+
var selfFreeingCount = Type.getSelfFreeingInstanceCount();
16+
assert.equal(startSelfFreeingCount + 1, selfFreeingCount);
17+
// get out of this promise chain to help GC get rid of the commit
18+
setTimeout(resolve, 0);
19+
});
20+
21+
return promise
22+
.then(function() {
23+
garbageCollect();
24+
var endSelfFreeingCount = Type.getSelfFreeingInstanceCount();
25+
var endNonSelfFreeingCount = Type.getNonSelfFreeingConstructedCount();
26+
// any new self-freeing commits should have been freed
27+
assert.equal(startSelfFreeingCount, endSelfFreeingCount);
28+
// no new non-self-freeing commits should have been constructed
29+
assert.equal(startNonSelfFreeingCount, endNonSelfFreeingCount);
30+
});
31+
}
32+
33+
module.exports = leakTest;

0 commit comments

Comments
 (0)