blob: 858335b0980111bcf282da7e9f15dc78820fc1af [file] [log] [blame]
'use strict';
let assert = require('assert');
let MockData = require('./resources/mock-data.js');
let TestServer = require('./resources/test-server.js');
describe('/api/build-requests', function () {
this.timeout(1000);
TestServer.inject();
beforeEach(function () {
MockData.resetV3Models();
});
it('should return "TriggerableNotFound" when the database is empty', function (done) {
TestServer.remoteAPI().getJSON('/api/build-requests/build-webkit').then(function (content) {
assert.equal(content['status'], 'TriggerableNotFound');
done();
}).catch(done);
});
it('should return an empty list when there are no build requests', function (done) {
TestServer.database().connect().then(function () {
return TestServer.database().insert('build_triggerables', {name: 'build-webkit'});
}).then(function () {
return TestServer.remoteAPI().getJSON('/api/build-requests/build-webkit');
}).then(function (content) {
assert.equal(content['status'], 'OK');
assert.deepEqual(content['buildRequests'], []);
assert.deepEqual(content['rootSets'], []);
assert.deepEqual(content['roots'], []);
assert.deepEqual(Object.keys(content).sort(), ['buildRequests', 'rootSets', 'roots', 'status']);
done();
}).catch(done);
});
it('should return build requets associated with a given triggerable with appropriate roots and rootSets', function (done) {
let db = TestServer.database();
db.connect().then(function () {
return MockData.addMockData(db);
}).then(function () {
return TestServer.remoteAPI().getJSONWithStatus('/api/build-requests/build-webkit');
}).then(function (content) {
assert.deepEqual(Object.keys(content).sort(), ['buildRequests', 'rootSets', 'roots', 'status']);
assert.equal(content['rootSets'].length, 2);
assert.equal(content['rootSets'][0].id, 401);
assert.deepEqual(content['rootSets'][0].roots, ['87832', '93116']);
assert.equal(content['rootSets'][1].id, 402);
assert.deepEqual(content['rootSets'][1].roots, ['87832', '96336']);
assert.equal(content['roots'].length, 3);
assert.equal(content['roots'][0].id, 87832);
assert.equal(content['roots'][0].repository, '9');
assert.equal(content['roots'][0].revision, '10.11 15A284');
assert.equal(content['roots'][1].id, 93116);
assert.equal(content['roots'][1].repository, '11');
assert.equal(content['roots'][1].revision, '191622');
assert.equal(content['roots'][2].id, 96336);
assert.equal(content['roots'][2].repository, '11');
assert.equal(content['roots'][2].revision, '192736');
assert.equal(content['buildRequests'].length, 4);
assert.deepEqual(content['buildRequests'][0].id, 700);
assert.deepEqual(content['buildRequests'][0].order, 0);
assert.deepEqual(content['buildRequests'][0].platform, '65');
assert.deepEqual(content['buildRequests'][0].rootSet, 401);
assert.deepEqual(content['buildRequests'][0].status, 'pending');
assert.deepEqual(content['buildRequests'][0].test, '200');
assert.deepEqual(content['buildRequests'][1].id, 701);
assert.deepEqual(content['buildRequests'][1].order, 1);
assert.deepEqual(content['buildRequests'][1].platform, '65');
assert.deepEqual(content['buildRequests'][1].rootSet, 402);
assert.deepEqual(content['buildRequests'][1].status, 'pending');
assert.deepEqual(content['buildRequests'][1].test, '200');
assert.deepEqual(content['buildRequests'][2].id, 702);
assert.deepEqual(content['buildRequests'][2].order, 2);
assert.deepEqual(content['buildRequests'][2].platform, '65');
assert.deepEqual(content['buildRequests'][2].rootSet, 401);
assert.deepEqual(content['buildRequests'][2].status, 'pending');
assert.deepEqual(content['buildRequests'][2].test, '200');
assert.deepEqual(content['buildRequests'][3].id, 703);
assert.deepEqual(content['buildRequests'][3].order, 3);
assert.deepEqual(content['buildRequests'][3].platform, '65');
assert.deepEqual(content['buildRequests'][3].rootSet, 402);
assert.deepEqual(content['buildRequests'][3].status, 'pending');
assert.deepEqual(content['buildRequests'][3].test, '200');
done();
}).catch(done);
});
it('should support useLegacyIdResolution option', function (done) {
let db = TestServer.database();
db.connect().then(function () {
return MockData.addMockData(db);
}).then(function () {
return TestServer.remoteAPI().getJSONWithStatus('/api/build-requests/build-webkit?useLegacyIdResolution=true');
}).then(function (content) {
assert.deepEqual(Object.keys(content).sort(), ['buildRequests', 'rootSets', 'roots', 'status']);
assert.equal(content['rootSets'].length, 2);
assert.equal(content['rootSets'][0].id, 401);
assert.deepEqual(content['rootSets'][0].roots, ['87832', '93116']);
assert.equal(content['rootSets'][1].id, 402);
assert.deepEqual(content['rootSets'][1].roots, ['87832', '96336']);
assert.equal(content['roots'].length, 3);
assert.equal(content['roots'][0].id, 87832);
assert.equal(content['roots'][0].repository, 'OS X');
assert.equal(content['roots'][0].revision, '10.11 15A284');
assert.equal(content['roots'][1].id, 93116);
assert.equal(content['roots'][1].repository, 'WebKit');
assert.equal(content['roots'][1].revision, '191622');
assert.equal(content['roots'][2].id, 96336);
assert.equal(content['roots'][2].repository, 'WebKit');
assert.equal(content['roots'][2].revision, '192736');
assert.equal(content['buildRequests'].length, 4);
assert.deepEqual(content['buildRequests'][0].id, 700);
assert.deepEqual(content['buildRequests'][0].order, 0);
assert.deepEqual(content['buildRequests'][0].platform, 'some platform');
assert.deepEqual(content['buildRequests'][0].rootSet, 401);
assert.deepEqual(content['buildRequests'][0].status, 'pending');
assert.deepEqual(content['buildRequests'][0].test, ['some test']);
assert.deepEqual(content['buildRequests'][1].id, 701);
assert.deepEqual(content['buildRequests'][1].order, 1);
assert.deepEqual(content['buildRequests'][1].platform, 'some platform');
assert.deepEqual(content['buildRequests'][1].rootSet, 402);
assert.deepEqual(content['buildRequests'][1].status, 'pending');
assert.deepEqual(content['buildRequests'][1].test, ['some test']);
assert.deepEqual(content['buildRequests'][2].id, 702);
assert.deepEqual(content['buildRequests'][2].order, 2);
assert.deepEqual(content['buildRequests'][2].platform, 'some platform');
assert.deepEqual(content['buildRequests'][2].rootSet, 401);
assert.deepEqual(content['buildRequests'][2].status, 'pending');
assert.deepEqual(content['buildRequests'][2].test, ['some test']);
assert.deepEqual(content['buildRequests'][3].id, 703);
assert.deepEqual(content['buildRequests'][3].order, 3);
assert.deepEqual(content['buildRequests'][3].platform, 'some platform');
assert.deepEqual(content['buildRequests'][3].rootSet, 402);
assert.deepEqual(content['buildRequests'][3].status, 'pending');
assert.deepEqual(content['buildRequests'][3].test, ['some test']);
done();
}).catch(done);
});
it('should be fetchable by BuildRequest.fetchForTriggerable', function (done) {
let db = TestServer.database();
db.connect().then(function () {
return MockData.addMockData(db);
}).then(function () {
return Manifest.fetch();
}).then(function () {
return BuildRequest.fetchForTriggerable('build-webkit');
}).then(function (buildRequests) {
assert.equal(buildRequests.length, 4);
let test = Test.findById(200);
assert(test);
let platform = Platform.findById(65);
assert(platform);
assert.equal(buildRequests[0].id(), 700);
assert.equal(buildRequests[0].testGroupId(), 600);
assert.equal(buildRequests[0].test(), test);
assert.equal(buildRequests[0].platform(), platform);
assert.equal(buildRequests[0].order(), 0);
assert.ok(buildRequests[0].rootSet() instanceof RootSet);
assert.ok(!buildRequests[0].hasFinished());
assert.ok(!buildRequests[0].hasStarted());
assert.ok(buildRequests[0].isPending());
assert.equal(buildRequests[0].statusLabel(), 'Waiting');
assert.equal(buildRequests[1].id(), 701);
assert.equal(buildRequests[1].testGroupId(), 600);
assert.equal(buildRequests[1].test(), test);
assert.equal(buildRequests[1].platform(), platform);
assert.equal(buildRequests[1].order(), 1);
assert.ok(buildRequests[1].rootSet() instanceof RootSet);
assert.ok(!buildRequests[1].hasFinished());
assert.ok(!buildRequests[1].hasStarted());
assert.ok(buildRequests[1].isPending());
assert.equal(buildRequests[1].statusLabel(), 'Waiting');
assert.equal(buildRequests[2].id(), 702);
assert.equal(buildRequests[2].testGroupId(), 600);
assert.equal(buildRequests[2].test(), test);
assert.equal(buildRequests[2].platform(), platform);
assert.equal(buildRequests[2].order(), 2);
assert.ok(buildRequests[2].rootSet() instanceof RootSet);
assert.ok(!buildRequests[2].hasFinished());
assert.ok(!buildRequests[2].hasStarted());
assert.ok(buildRequests[2].isPending());
assert.equal(buildRequests[2].statusLabel(), 'Waiting');
assert.equal(buildRequests[3].id(), 703);
assert.equal(buildRequests[3].testGroupId(), 600);
assert.equal(buildRequests[3].test(), test);
assert.equal(buildRequests[3].platform(), platform);
assert.equal(buildRequests[3].order(), 3);
assert.ok(buildRequests[3].rootSet() instanceof RootSet);
assert.ok(!buildRequests[3].hasFinished());
assert.ok(!buildRequests[3].hasStarted());
assert.ok(buildRequests[3].isPending());
assert.equal(buildRequests[3].statusLabel(), 'Waiting');
let osx = Repository.findById(9);
assert.equal(osx.name(), 'OS X');
let webkit = Repository.findById(11);
assert.equal(webkit.name(), 'WebKit');
let firstRootSet = buildRequests[0].rootSet();
assert.equal(buildRequests[2].rootSet(), firstRootSet);
let secondRootSet = buildRequests[1].rootSet();
assert.equal(buildRequests[3].rootSet(), secondRootSet);
assert.equal(firstRootSet.revisionForRepository(osx), '10.11 15A284');
assert.equal(firstRootSet.revisionForRepository(webkit), '191622');
assert.equal(secondRootSet.revisionForRepository(osx), '10.11 15A284');
assert.equal(secondRootSet.revisionForRepository(webkit), '192736');
let osxCommit = firstRootSet.commitForRepository(osx);
assert.equal(osxCommit.revision(), '10.11 15A284');
assert.equal(osxCommit, secondRootSet.commitForRepository(osx));
let firstWebKitCommit = firstRootSet.commitForRepository(webkit);
assert.equal(firstWebKitCommit.revision(), '191622');
assert.equal(+firstWebKitCommit.time(), 1445945816878);
let secondWebKitCommit = secondRootSet.commitForRepository(webkit);
assert.equal(secondWebKitCommit.revision(), '192736');
assert.equal(+secondWebKitCommit.time(), 1448225325650);
done();
}).catch(done);
});
it('should not include a build request if all requests in the same group had been completed', function (done) {
let db = TestServer.database();
db.connect().then(function () {
return MockData.addMockData(db, ['completed', 'completed', 'completed', 'completed']);
}).then(function () {
return Manifest.fetch();
}).then(function () {
return BuildRequest.fetchForTriggerable('build-webkit');
}).then(function (buildRequests) {
assert.equal(buildRequests.length, 0);
done();
}).catch(done);
});
it('should not include a build request if all requests in the same group had been failed or cancled', function (done) {
let db = TestServer.database();
db.connect().then(function () {
return MockData.addMockData(db, ['failed', 'failed', 'canceled', 'canceled']);
}).then(function () {
return Manifest.fetch();
}).then(function () {
return BuildRequest.fetchForTriggerable('build-webkit');
}).then(function (buildRequests) {
assert.equal(buildRequests.length, 0);
done();
}).catch(done);
});
it('should include all build requests of a test group if one of the reqeusts in the group had not been finished', function (done) {
let db = TestServer.database();
db.connect().then(function () {
return MockData.addMockData(db, ['completed', 'completed', 'scheduled', 'pending']);
}).then(function () {
return Manifest.fetch();
}).then(function () {
return BuildRequest.fetchForTriggerable('build-webkit');
}).then(function (buildRequests) {
assert.equal(buildRequests.length, 4);
assert.ok(buildRequests[0].hasFinished());
assert.ok(buildRequests[0].hasStarted());
assert.ok(!buildRequests[0].isPending());
assert.ok(buildRequests[1].hasFinished());
assert.ok(buildRequests[1].hasStarted());
assert.ok(!buildRequests[1].isPending());
assert.ok(!buildRequests[2].hasFinished());
assert.ok(buildRequests[2].hasStarted());
assert.ok(!buildRequests[2].isPending());
assert.ok(!buildRequests[3].hasFinished());
assert.ok(!buildRequests[3].hasStarted());
assert.ok(buildRequests[3].isPending());
done();
}).catch(done);
});
it('should include all build requests of a test group if one of the reqeusts in the group is still running', function (done) {
let db = TestServer.database();
db.connect().then(function () {
return MockData.addMockData(db, ['completed', 'completed', 'completed', 'running']);
}).then(function () {
return Manifest.fetch();
}).then(function () {
return BuildRequest.fetchForTriggerable('build-webkit');
}).then(function (buildRequests) {
assert.equal(buildRequests.length, 4);
assert.ok(buildRequests[0].hasFinished());
assert.ok(buildRequests[0].hasStarted());
assert.ok(!buildRequests[0].isPending());
assert.ok(buildRequests[1].hasFinished());
assert.ok(buildRequests[1].hasStarted());
assert.ok(!buildRequests[1].isPending());
assert.ok(buildRequests[2].hasFinished());
assert.ok(buildRequests[2].hasStarted());
assert.ok(!buildRequests[2].isPending());
assert.ok(!buildRequests[3].hasFinished());
assert.ok(buildRequests[3].hasStarted());
assert.ok(!buildRequests[3].isPending());
done();
}).catch(done);
});
it('should order build requests based on test group creation time and order', function (done) {
let db = TestServer.database();
db.connect().then(function () {
return Promise.all([MockData.addMockData(db), MockData.addAnotherMockTestGroup(db)]);
}).then(function () {
return Manifest.fetch();
}).then(function () {
return BuildRequest.fetchForTriggerable('build-webkit');
}).then(function (buildRequests) {
assert.equal(buildRequests.length, 8);
assert.equal(buildRequests[0].id(), 700);
assert.equal(buildRequests[0].testGroupId(), 600);
assert.strictEqual(buildRequests[0].order(), 0);
assert.equal(buildRequests[1].id(), 701);
assert.equal(buildRequests[1].testGroupId(), 600);
assert.strictEqual(buildRequests[1].order(), 1);
assert.equal(buildRequests[2].id(), 702);
assert.equal(buildRequests[2].testGroupId(), 600);
assert.strictEqual(buildRequests[2].order(), 2);
assert.equal(buildRequests[3].id(), 703);
assert.equal(buildRequests[3].testGroupId(), 600);
assert.strictEqual(buildRequests[3].order(), 3);
assert.equal(buildRequests[4].id(), 710);
assert.equal(buildRequests[4].testGroupId(), 601);
assert.strictEqual(buildRequests[4].order(), 0);
assert.equal(buildRequests[5].id(), 711);
assert.equal(buildRequests[5].testGroupId(), 601);
assert.strictEqual(buildRequests[5].order(), 1);
assert.equal(buildRequests[6].id(), 712);
assert.equal(buildRequests[6].testGroupId(), 601);
assert.strictEqual(buildRequests[6].order(), 2);
assert.equal(buildRequests[7].id(), 713);
assert.equal(buildRequests[7].testGroupId(), 601);
assert.strictEqual(buildRequests[7].order(), 3);
done();
}).catch(done);
});
it('should place build requests created by user before automatically created ones', function (done) {
let db = TestServer.database();
db.connect().then(function () {
return Promise.all([MockData.addMockData(db), MockData.addAnotherMockTestGroup(db, null, 'rniwa')]);
}).then(function () {
return Manifest.fetch();
}).then(function () {
return BuildRequest.fetchForTriggerable('build-webkit');
}).then(function (buildRequests) {
assert.equal(buildRequests.length, 8);
assert.equal(buildRequests[0].id(), 710);
assert.equal(buildRequests[0].testGroupId(), 601);
assert.strictEqual(buildRequests[0].order(), 0);
assert.equal(buildRequests[1].id(), 711);
assert.equal(buildRequests[1].testGroupId(), 601);
assert.strictEqual(buildRequests[1].order(), 1);
assert.equal(buildRequests[2].id(), 712);
assert.equal(buildRequests[2].testGroupId(), 601);
assert.strictEqual(buildRequests[2].order(), 2);
assert.equal(buildRequests[3].id(), 713);
assert.equal(buildRequests[3].testGroupId(), 601);
assert.strictEqual(buildRequests[3].order(), 3);
assert.equal(buildRequests[4].id(), 700);
assert.equal(buildRequests[4].testGroupId(), 600);
assert.strictEqual(buildRequests[4].order(), 0);
assert.equal(buildRequests[5].id(), 701);
assert.equal(buildRequests[5].testGroupId(), 600);
assert.strictEqual(buildRequests[5].order(), 1);
assert.equal(buildRequests[6].id(), 702);
assert.equal(buildRequests[6].testGroupId(), 600);
assert.strictEqual(buildRequests[6].order(), 2);
assert.equal(buildRequests[7].id(), 703);
assert.equal(buildRequests[7].testGroupId(), 600);
assert.strictEqual(buildRequests[7].order(), 3);
done();
}).catch(done);
});
});