Skip to content

Commit 416d47f

Browse files
committed
Add remote / refspec tests
1 parent 920619e commit 416d47f

File tree

3 files changed

+69
-19
lines changed

3 files changed

+69
-19
lines changed

test/tests/commit.js

Lines changed: 3 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -2,32 +2,16 @@ var assert = require("assert");
22
var path = require("path");
33
var promisify = require("promisify-node");
44
var fse = promisify(require("fs-extra"));
5+
6+
var garbageCollect = require("../utils/garbage_collect.js");
7+
58
var local = path.join.bind(path, __dirname);
69

710
// Have to wrap exec, since it has a weird callback signature.
811
var exec = promisify(function(command, opts, callback) {
912
return require("child_process").exec(command, opts, callback);
1013
});
1114

12-
// aggressively collects garbage until we fail to improve terminatingIterations
13-
// times.
14-
function garbageCollect() {
15-
var terminatingIterations = 3;
16-
var usedBeforeGC = Number.MAX_VALUE;
17-
var nondecreasingIterations = 0;
18-
for ( ; ; ) {
19-
global.gc();
20-
var usedAfterGC = process.memoryUsage().heapUsed;
21-
if (usedAfterGC >= usedBeforeGC) {
22-
nondecreasingIterations++;
23-
if (nondecreasingIterations >= terminatingIterations) {
24-
break;
25-
}
26-
}
27-
usedBeforeGC = usedAfterGC;
28-
}
29-
}
30-
3115
describe("Commit", function() {
3216
var NodeGit = require("../../");
3317
var Repository = NodeGit.Repository;

test/tests/remote.js

Lines changed: 46 additions & 0 deletions
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 garbageCollect = require("../utils/garbage_collect.js");
6+
57
describe("Remote", function() {
68
var NodeGit = require("../../");
79
var Repository = NodeGit.Repository;
@@ -379,4 +381,48 @@ describe("Remote", function() {
379381
}
380382
});
381383
});
384+
385+
it("is kept alive by refspec", function() {
386+
var repo = this.repository;
387+
var Remote = NodeGit.Remote;
388+
389+
garbageCollect();
390+
var startSelfFreeingCount = Remote.getSelfFreeingInstanceCount();
391+
var startNonSelfFreeingCount = Remote.getNonSelfFreeingConstructedCount();
392+
393+
var resolve;
394+
var promise = new Promise(function(_resolve) { resolve = _resolve; });
395+
396+
var remote;
397+
398+
repo.getRemote("origin")
399+
.then(function(_remote) {
400+
remote = _remote;
401+
setTimeout(resolve, 0);
402+
});
403+
404+
return promise
405+
.then(function() {
406+
// make sure we have created one self-freeing remote
407+
assert.equal(startSelfFreeingCount + 1,
408+
Remote.getSelfFreeingInstanceCount());
409+
assert.equal(startNonSelfFreeingCount,
410+
Remote.getNonSelfFreeingConstructedCount());
411+
var refspec = remote.getRefspec(0);
412+
assert.equal("refs/heads/*", refspec.src());
413+
remote = null;
414+
garbageCollect();
415+
// the refspec should be holding on to the remote
416+
assert.equal(startSelfFreeingCount + 1,
417+
Remote.getSelfFreeingInstanceCount());
418+
419+
assert.equal("refs/heads/*", refspec.src());
420+
421+
refspec = null;
422+
garbageCollect();
423+
// the remote should be freed now
424+
assert.equal(startSelfFreeingCount,
425+
Remote.getSelfFreeingInstanceCount());
426+
});
427+
});
382428
});

test/utils/garbage_collect.js

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
// aggressively collects garbage until we fail to improve terminatingIterations
2+
// times.
3+
function garbageCollect() {
4+
var terminatingIterations = 3;
5+
var usedBeforeGC = Number.MAX_VALUE;
6+
var nondecreasingIterations = 0;
7+
for ( ; ; ) {
8+
global.gc();
9+
var usedAfterGC = process.memoryUsage().heapUsed;
10+
if (usedAfterGC >= usedBeforeGC) {
11+
nondecreasingIterations++;
12+
if (nondecreasingIterations >= terminatingIterations) {
13+
break;
14+
}
15+
}
16+
usedBeforeGC = usedAfterGC;
17+
}
18+
}
19+
20+
module.exports = garbageCollect;

0 commit comments

Comments
 (0)