blob: 42c5ae3a843125b50552f20aeec99e8eac3de19d [file] [log] [blame]
'use strict';
let assert = require('assert');
let BuildbotTriggerable = require('../tools/js/buildbot-triggerable.js').BuildbotTriggerable;
let MockData = require('./resources/mock-data.js');
let MockRemoteAPI = require('../unit-tests/resources/mock-remote-api.js').MockRemoteAPI;
let TestServer = require('./resources/test-server.js');
class MockLogger {
constructor()
{
this._logs = [];
}
log(text) { this._logs.push(text); }
error(text) { this._logs.push(text); }
}
describe('BuildbotTriggerable', function () {
this.timeout(1000);
TestServer.inject();
beforeEach(function () {
MockData.resetV3Models();
MockRemoteAPI.reset('http://build.webkit.org');
});
describe('syncOnce', function () {
it('should schedule the next build request when there are no pending builds', function (done) {
let db = TestServer.database();
let syncPromise;
db.connect().then(function () {
return MockData.addMockData(db, ['completed', 'running', 'pending', 'pending']);
}).then(function () {
return Manifest.fetch();
}).then(function () {
let config = MockData.mockTestSyncConfigWithSingleBuilder();
let logger = new MockLogger;
let slaveInfo = {name: 'sync-slave', password: 'password'};
let triggerable = new BuildbotTriggerable(config, TestServer.remoteAPI(), MockRemoteAPI, slaveInfo, logger);
syncPromise = triggerable.syncOnce();
syncPromise.catch(done);
return MockRemoteAPI.waitForRequest();
}).then(function () {
assert.equal(BuildRequest.all().length, 4);
assert.equal(BuildRequest.findById(700).status(), 'completed');
assert.equal(BuildRequest.findById(701).status(), 'running');
assert.equal(BuildRequest.findById(702).status(), 'pending');
assert.equal(BuildRequest.findById(703).status(), 'pending');
assert.equal(MockRemoteAPI.requests[0].method, 'GET');
assert.equal(MockRemoteAPI.requests[0].url, '/json/builders/some-builder-1/pendingBuilds');
MockRemoteAPI.requests[0].resolve([]);
return MockRemoteAPI.waitForRequest();
}).then(function () {
assert.equal(MockRemoteAPI.requests[1].method, 'GET');
assert.equal(MockRemoteAPI.requests[1].url, '/json/builders/some-builder-1/builds/?select=-1&select=-2');
MockRemoteAPI.requests[1].resolve({[-1]: MockData.runningBuild(), [-2]: MockData.finishedBuild()});
return MockRemoteAPI.waitForRequest();
}).then(function () {
assert.equal(MockRemoteAPI.requests[2].method, 'POST');
assert.equal(MockRemoteAPI.requests[2].url, '/builders/some-builder-1/force');
assert.deepEqual(MockRemoteAPI.requests[2].data, {'wk': '191622', 'os': '10.11 15A284', 'build-request-id': '702'});
MockRemoteAPI.requests[2].resolve('OK');
return MockRemoteAPI.waitForRequest();
}).then(function () {
assert.equal(MockRemoteAPI.requests[3].method, 'GET');
assert.equal(MockRemoteAPI.requests[3].url, '/json/builders/some-builder-1/pendingBuilds');
MockRemoteAPI.requests[3].resolve([MockData.pendingBuild()])
return MockRemoteAPI.waitForRequest();
}).then(function () {
assert.equal(MockRemoteAPI.requests[4].method, 'GET');
assert.equal(MockRemoteAPI.requests[4].url, '/json/builders/some-builder-1/builds/?select=-1&select=-2');
MockRemoteAPI.requests[4].resolve({[-1]: MockData.runningBuild(), [-2]: MockData.finishedBuild()});
return syncPromise;
}).then(function () {
return BuildRequest.fetchForTriggerable(MockData.mockTestSyncConfigWithSingleBuilder().triggerableName);
}).then(function () {
assert.equal(BuildRequest.all().length, 4);
assert.equal(BuildRequest.findById(700).status(), 'completed');
assert.equal(BuildRequest.findById(701).status(), 'running');
assert.equal(BuildRequest.findById(702).status(), 'scheduled');
assert.equal(BuildRequest.findById(703).status(), 'pending');
done();
}).catch(done);
});
it('should not schedule the next build request when there is a pending build', function (done) {
let db = TestServer.database();
let syncPromise;
db.connect().then(function () {
return MockData.addMockData(db, ['completed', 'running', 'pending', 'pending']);
}).then(function () {
return Manifest.fetch();
}).then(function () {
let config = MockData.mockTestSyncConfigWithSingleBuilder();
let logger = new MockLogger;
let slaveInfo = {name: 'sync-slave', password: 'password'};
let triggerable = new BuildbotTriggerable(config, TestServer.remoteAPI(), MockRemoteAPI, slaveInfo, logger);
syncPromise = triggerable.syncOnce();
syncPromise.catch(done);
return MockRemoteAPI.waitForRequest();
}).then(function () {
assert.equal(MockRemoteAPI.requests[0].method, 'GET');
assert.equal(MockRemoteAPI.requests[0].url, '/json/builders/some-builder-1/pendingBuilds');
MockRemoteAPI.requests[0].resolve([MockData.pendingBuild()]);
return MockRemoteAPI.waitForRequest();
}).then(function () {
assert.equal(MockRemoteAPI.requests[1].method, 'GET');
assert.equal(MockRemoteAPI.requests[1].url, '/json/builders/some-builder-1/builds/?select=-1&select=-2');
MockRemoteAPI.requests[1].resolve({[-1]: MockData.runningBuild(), [-2]: MockData.finishedBuild()});
return MockRemoteAPI.waitForRequest();
}).then(function () {
assert.equal(MockRemoteAPI.requests[2].method, 'GET');
assert.equal(MockRemoteAPI.requests[2].url, '/json/builders/some-builder-1/pendingBuilds');
MockRemoteAPI.requests[2].resolve([MockData.pendingBuild()])
return MockRemoteAPI.waitForRequest();
}).then(function () {
assert.equal(MockRemoteAPI.requests[3].method, 'GET');
assert.equal(MockRemoteAPI.requests[3].url, '/json/builders/some-builder-1/builds/?select=-1&select=-2');
MockRemoteAPI.requests[3].resolve({[-1]: MockData.runningBuild(), [-2]: MockData.finishedBuild()});
return syncPromise;
}).then(function () {
assert.equal(BuildRequest.all().length, 4);
assert.equal(BuildRequest.findById(700).status(), 'completed');
assert.equal(BuildRequest.findById(701).status(), 'running');
assert.equal(BuildRequest.findById(702).status(), 'pending');
assert.equal(BuildRequest.findById(703).status(), 'pending');
return BuildRequest.fetchForTriggerable(MockData.mockTestSyncConfigWithSingleBuilder().triggerableName);
}).then(function () {
assert.equal(BuildRequest.all().length, 4);
assert.equal(BuildRequest.findById(700).status(), 'completed');
assert.equal(BuildRequest.findById(701).status(), 'running');
assert.equal(BuildRequest.findById(702).status(), 'scheduled');
assert.equal(BuildRequest.findById(703).status(), 'pending');
done();
}).catch(done);
});
it('should schedule the build request on a builder without a pending build if it\'s the first request in the group', function (done) {
let db = TestServer.database();
let syncPromise;
db.connect().then(function () {
return MockData.addMockData(db, ['pending', 'pending', 'pending', 'pending']);
}).then(function () {
return Manifest.fetch();
}).then(function () {
let config = MockData.mockTestSyncConfigWithTwoBuilders();
let logger = new MockLogger;
let slaveInfo = {name: 'sync-slave', password: 'password'};
let triggerable = new BuildbotTriggerable(config, TestServer.remoteAPI(), MockRemoteAPI, slaveInfo, logger);
syncPromise = triggerable.syncOnce();
syncPromise.catch(done);
return MockRemoteAPI.waitForRequest();
}).then(function () {
assert.equal(MockRemoteAPI.requests.length, 2);
assert.equal(MockRemoteAPI.requests[0].method, 'GET');
assert.equal(MockRemoteAPI.requests[0].url, '/json/builders/some-builder-1/pendingBuilds');
MockRemoteAPI.requests[0].resolve([MockData.pendingBuild({buildRequestId: 999})]);
assert.equal(MockRemoteAPI.requests[1].method, 'GET');
assert.equal(MockRemoteAPI.requests[1].url, '/json/builders/some-builder-2/pendingBuilds');
MockRemoteAPI.requests[1].resolve([]);
return MockRemoteAPI.waitForRequest();
}).then(function () {
assert.equal(MockRemoteAPI.requests.length, 4);
assert.equal(MockRemoteAPI.requests[2].method, 'GET');
assert.equal(MockRemoteAPI.requests[2].url, '/json/builders/some-builder-1/builds/?select=-1&select=-2');
MockRemoteAPI.requests[2].resolve({});
assert.equal(MockRemoteAPI.requests[3].method, 'GET');
assert.equal(MockRemoteAPI.requests[3].url, '/json/builders/some-builder-2/builds/?select=-1&select=-2');
MockRemoteAPI.requests[3].resolve({});
return MockRemoteAPI.waitForRequest();
}).then(function () {
assert.equal(MockRemoteAPI.requests.length, 5);
assert.equal(MockRemoteAPI.requests[4].method, 'POST');
assert.equal(MockRemoteAPI.requests[4].url, '/builders/some-builder-2/force');
assert.deepEqual(MockRemoteAPI.requests[4].data, {'wk': '191622', 'os': '10.11 15A284', 'build-request-id': '700'});
MockRemoteAPI.requests[4].resolve('OK');
return MockRemoteAPI.waitForRequest();
}).then(function () {
assert.equal(MockRemoteAPI.requests.length, 7);
assert.equal(MockRemoteAPI.requests[5].method, 'GET');
assert.equal(MockRemoteAPI.requests[5].url, '/json/builders/some-builder-1/pendingBuilds');
MockRemoteAPI.requests[5].resolve([MockData.pendingBuild({buildRequestId: 999})]);
assert.equal(MockRemoteAPI.requests[6].method, 'GET');
assert.equal(MockRemoteAPI.requests[6].url, '/json/builders/some-builder-2/pendingBuilds');
MockRemoteAPI.requests[6].resolve([MockData.pendingBuild({builder: 'some-builder-2', buildRequestId: 700})]);
return MockRemoteAPI.waitForRequest();
}).then(function () {
assert.equal(MockRemoteAPI.requests.length, 9);
assert.equal(MockRemoteAPI.requests[7].method, 'GET');
assert.equal(MockRemoteAPI.requests[7].url, '/json/builders/some-builder-1/builds/?select=-1&select=-2');
MockRemoteAPI.requests[7].resolve({});
assert.equal(MockRemoteAPI.requests[8].method, 'GET');
assert.equal(MockRemoteAPI.requests[8].url, '/json/builders/some-builder-2/builds/?select=-1&select=-2');
MockRemoteAPI.requests[8].resolve({});
return syncPromise;
}).then(function () {
assert.equal(BuildRequest.all().length, 4);
assert.equal(BuildRequest.findById(700).status(), 'pending');
assert.equal(BuildRequest.findById(701).status(), 'pending');
assert.equal(BuildRequest.findById(702).status(), 'pending');
assert.equal(BuildRequest.findById(703).status(), 'pending');
return BuildRequest.fetchForTriggerable(MockData.mockTestSyncConfigWithTwoBuilders().triggerableName);
}).then(function () {
assert.equal(BuildRequest.all().length, 4);
assert.equal(BuildRequest.findById(700).status(), 'scheduled');
assert.equal(BuildRequest.findById(701).status(), 'pending');
assert.equal(BuildRequest.findById(702).status(), 'pending');
assert.equal(BuildRequest.findById(703).status(), 'pending');
done();
}).catch(done);
});
it('should not schedule a build request on a different builder than the one the first build request is pending', function (done) {
let db = TestServer.database();
let syncPromise;
db.connect().then(function () {
return MockData.addMockData(db, ['pending', 'pending', 'pending', 'pending']);
}).then(function () {
return Manifest.fetch();
}).then(function () {
let config = MockData.mockTestSyncConfigWithTwoBuilders();
let logger = new MockLogger;
let slaveInfo = {name: 'sync-slave', password: 'password'};
let triggerable = new BuildbotTriggerable(config, TestServer.remoteAPI(), MockRemoteAPI, slaveInfo, logger);
syncPromise = triggerable.syncOnce();
syncPromise.catch(done);
return MockRemoteAPI.waitForRequest();
}).then(function () {
assert.equal(MockRemoteAPI.requests.length, 2);
assert.equal(MockRemoteAPI.requests[0].method, 'GET');
assert.equal(MockRemoteAPI.requests[0].url, '/json/builders/some-builder-1/pendingBuilds');
MockRemoteAPI.requests[0].resolve([MockData.pendingBuild({buildRequestId: 700})]);
assert.equal(MockRemoteAPI.requests[1].method, 'GET');
assert.equal(MockRemoteAPI.requests[1].url, '/json/builders/some-builder-2/pendingBuilds');
MockRemoteAPI.requests[1].resolve([]);
return MockRemoteAPI.waitForRequest();
}).then(function () {
assert.equal(MockRemoteAPI.requests.length, 4);
assert.equal(MockRemoteAPI.requests[2].method, 'GET');
assert.equal(MockRemoteAPI.requests[2].url, '/json/builders/some-builder-1/builds/?select=-1&select=-2');
MockRemoteAPI.requests[2].resolve({});
assert.equal(MockRemoteAPI.requests[3].method, 'GET');
assert.equal(MockRemoteAPI.requests[3].url, '/json/builders/some-builder-2/builds/?select=-1&select=-2');
MockRemoteAPI.requests[3].resolve({});
return MockRemoteAPI.waitForRequest();
}).then(function () {
assert.equal(MockRemoteAPI.requests.length, 6);
assert.equal(MockRemoteAPI.requests[4].method, 'GET');
assert.equal(MockRemoteAPI.requests[4].url, '/json/builders/some-builder-1/pendingBuilds');
MockRemoteAPI.requests[4].resolve([MockData.pendingBuild({buildRequestId: 700})]);
assert.equal(MockRemoteAPI.requests[5].method, 'GET');
assert.equal(MockRemoteAPI.requests[5].url, '/json/builders/some-builder-2/pendingBuilds');
MockRemoteAPI.requests[5].resolve([]);
return MockRemoteAPI.waitForRequest();
}).then(function () {
assert.equal(MockRemoteAPI.requests.length, 8);
assert.equal(MockRemoteAPI.requests[6].method, 'GET');
assert.equal(MockRemoteAPI.requests[6].url, '/json/builders/some-builder-1/builds/?select=-1&select=-2');
MockRemoteAPI.requests[6].resolve({});
assert.equal(MockRemoteAPI.requests[7].method, 'GET');
assert.equal(MockRemoteAPI.requests[7].url, '/json/builders/some-builder-2/builds/?select=-1&select=-2');
MockRemoteAPI.requests[7].resolve({});
return syncPromise;
}).then(function () {
assert.equal(BuildRequest.all().length, 4);
assert.equal(BuildRequest.findById(700).status(), 'pending');
assert.equal(BuildRequest.findById(701).status(), 'pending');
assert.equal(BuildRequest.findById(702).status(), 'pending');
assert.equal(BuildRequest.findById(703).status(), 'pending');
return BuildRequest.fetchForTriggerable(MockData.mockTestSyncConfigWithTwoBuilders().triggerableName);
}).then(function () {
assert.equal(BuildRequest.all().length, 4);
assert.equal(BuildRequest.findById(700).status(), 'scheduled');
assert.equal(BuildRequest.findById(701).status(), 'pending');
assert.equal(BuildRequest.findById(702).status(), 'pending');
assert.equal(BuildRequest.findById(703).status(), 'pending');
done();
}).catch(done);
});
it('should update the status of a pending build and schedule a new build if the pending build had started running', function (done) {
let db = TestServer.database();
let syncPromise;
db.connect().then(function () {
return MockData.addMockData(db, ['pending', 'pending', 'pending', 'pending']);
}).then(function () {
return Manifest.fetch();
}).then(function () {
let config = MockData.mockTestSyncConfigWithTwoBuilders();
let logger = new MockLogger;
let slaveInfo = {name: 'sync-slave', password: 'password'};
let triggerable = new BuildbotTriggerable(config, TestServer.remoteAPI(), MockRemoteAPI, slaveInfo, logger);
syncPromise = triggerable.syncOnce();
syncPromise.catch(done);
return MockRemoteAPI.waitForRequest();
}).then(function () {
assert.equal(MockRemoteAPI.requests.length, 2);
assert.equal(MockRemoteAPI.requests[0].method, 'GET');
assert.equal(MockRemoteAPI.requests[0].url, '/json/builders/some-builder-1/pendingBuilds');
MockRemoteAPI.requests[0].resolve([]);
assert.equal(MockRemoteAPI.requests[1].method, 'GET');
assert.equal(MockRemoteAPI.requests[1].url, '/json/builders/some-builder-2/pendingBuilds');
MockRemoteAPI.requests[1].resolve([]);
return MockRemoteAPI.waitForRequest();
}).then(function () {
assert.equal(MockRemoteAPI.requests.length, 4);
assert.equal(MockRemoteAPI.requests[2].method, 'GET');
assert.equal(MockRemoteAPI.requests[2].url, '/json/builders/some-builder-1/builds/?select=-1&select=-2');
MockRemoteAPI.requests[2].resolve({[-1]: MockData.runningBuild({buildRequestId: 701}), [-2]: MockData.finishedBuild({buildRequestId: 700})});
assert.equal(MockRemoteAPI.requests[3].method, 'GET');
assert.equal(MockRemoteAPI.requests[3].url, '/json/builders/some-builder-2/builds/?select=-1&select=-2');
MockRemoteAPI.requests[3].resolve({});
return MockRemoteAPI.waitForRequest();
}).then(function () {
assert.equal(MockRemoteAPI.requests.length, 5);
assert.equal(MockRemoteAPI.requests[4].method, 'POST');
assert.equal(MockRemoteAPI.requests[4].url, '/builders/some-builder-1/force');
assert.deepEqual(MockRemoteAPI.requests[4].data, {'wk': '191622', 'os': '10.11 15A284', 'build-request-id': '702'});
MockRemoteAPI.requests[4].resolve('OK');
return MockRemoteAPI.waitForRequest();
}).then(function () {
assert.equal(MockRemoteAPI.requests.length, 7);
assert.equal(MockRemoteAPI.requests[5].method, 'GET');
assert.equal(MockRemoteAPI.requests[5].url, '/json/builders/some-builder-1/pendingBuilds');
MockRemoteAPI.requests[5].resolve([MockData.pendingBuild({buildRequestId: 702})]);
assert.equal(MockRemoteAPI.requests[6].method, 'GET');
assert.equal(MockRemoteAPI.requests[6].url, '/json/builders/some-builder-2/pendingBuilds');
MockRemoteAPI.requests[6].resolve([]);
return MockRemoteAPI.waitForRequest();
}).then(function () {
assert.equal(MockRemoteAPI.requests.length, 9);
assert.equal(MockRemoteAPI.requests[7].method, 'GET');
assert.equal(MockRemoteAPI.requests[7].url, '/json/builders/some-builder-1/builds/?select=-1&select=-2');
MockRemoteAPI.requests[7].resolve({[-1]: MockData.runningBuild({buildRequestId: 701}), [-2]: MockData.finishedBuild({buildRequestId: 700})});
assert.equal(MockRemoteAPI.requests[8].method, 'GET');
assert.equal(MockRemoteAPI.requests[8].url, '/json/builders/some-builder-2/builds/?select=-1&select=-2');
MockRemoteAPI.requests[8].resolve({});
return syncPromise;
}).then(function () {
assert.equal(BuildRequest.all().length, 4);
assert.equal(BuildRequest.findById(700).status(), 'pending');
assert.equal(BuildRequest.findById(701).status(), 'pending');
assert.equal(BuildRequest.findById(702).status(), 'pending');
assert.equal(BuildRequest.findById(703).status(), 'pending');
return BuildRequest.fetchForTriggerable(MockData.mockTestSyncConfigWithTwoBuilders().triggerableName);
}).then(function () {
assert.equal(BuildRequest.all().length, 4);
assert.equal(BuildRequest.findById(700).status(), 'failed');
assert.equal(BuildRequest.findById(701).status(), 'running');
assert.equal(BuildRequest.findById(702).status(), 'scheduled');
assert.equal(BuildRequest.findById(703).status(), 'pending');
done();
}).catch(done);
});
it('should schedule a build request on a builder without pending builds if the request belongs to a new test group', function (done) {
let db = TestServer.database();
let syncPromise;
db.connect().then(function () {
return Promise.all([
MockData.addMockData(db, ['completed', 'pending', 'pending', 'pending']),
MockData.addAnotherMockTestGroup(db, ['pending', 'pending', 'pending', 'pending'])
]);
}).then(function () {
return Manifest.fetch();
}).then(function () {
let config = MockData.mockTestSyncConfigWithTwoBuilders();
let logger = new MockLogger;
let slaveInfo = {name: 'sync-slave', password: 'password'};
let triggerable = new BuildbotTriggerable(config, TestServer.remoteAPI(), MockRemoteAPI, slaveInfo, logger);
syncPromise = triggerable.syncOnce();
syncPromise.catch(done);
return MockRemoteAPI.waitForRequest();
}).then(function () {
assert.equal(MockRemoteAPI.requests.length, 2);
assert.equal(MockRemoteAPI.requests[0].method, 'GET');
assert.equal(MockRemoteAPI.requests[0].url, '/json/builders/some-builder-1/pendingBuilds');
MockRemoteAPI.requests[0].resolve([MockData.pendingBuild({buildRequestId: 702})]);
assert.equal(MockRemoteAPI.requests[1].method, 'GET');
assert.equal(MockRemoteAPI.requests[1].url, '/json/builders/some-builder-2/pendingBuilds');
MockRemoteAPI.requests[1].resolve([]);
return MockRemoteAPI.waitForRequest();
}).then(function () {
assert.equal(MockRemoteAPI.requests.length, 4);
assert.equal(MockRemoteAPI.requests[2].method, 'GET');
assert.equal(MockRemoteAPI.requests[2].url, '/json/builders/some-builder-1/builds/?select=-1&select=-2');
MockRemoteAPI.requests[2].resolve({[-1]: MockData.runningBuild({buildRequestId: 701}), [-2]: MockData.finishedBuild({buildRequestId: 700})});
assert.equal(MockRemoteAPI.requests[3].method, 'GET');
assert.equal(MockRemoteAPI.requests[3].url, '/json/builders/some-builder-2/builds/?select=-1&select=-2');
MockRemoteAPI.requests[3].resolve({});
return MockRemoteAPI.waitForRequest();
}).then(function () {
assert.equal(MockRemoteAPI.requests.length, 5);
assert.equal(MockRemoteAPI.requests[4].method, 'POST');
assert.equal(MockRemoteAPI.requests[4].url, '/builders/some-builder-2/force');
assert.deepEqual(MockRemoteAPI.requests[4].data, {'wk': '191622', 'os': '10.11 15A284', 'build-request-id': '710'});
MockRemoteAPI.requests[4].resolve('OK');
return MockRemoteAPI.waitForRequest();
}).then(function () {
assert.equal(MockRemoteAPI.requests.length, 7);
assert.equal(MockRemoteAPI.requests[5].method, 'GET');
assert.equal(MockRemoteAPI.requests[5].url, '/json/builders/some-builder-1/pendingBuilds');
MockRemoteAPI.requests[5].resolve([MockData.pendingBuild({buildRequestId: 702})]);
assert.equal(MockRemoteAPI.requests[6].method, 'GET');
assert.equal(MockRemoteAPI.requests[6].url, '/json/builders/some-builder-2/pendingBuilds');
MockRemoteAPI.requests[6].resolve([MockData.pendingBuild({builder: 'some-builder-2', buildRequestId: 710})]);
return MockRemoteAPI.waitForRequest();
}).then(function () {
assert.equal(MockRemoteAPI.requests.length, 9);
assert.equal(MockRemoteAPI.requests[7].method, 'GET');
assert.equal(MockRemoteAPI.requests[7].url, '/json/builders/some-builder-1/builds/?select=-1&select=-2');
MockRemoteAPI.requests[7].resolve({[-1]: MockData.runningBuild({buildRequestId: 701}), [-2]: MockData.finishedBuild({buildRequestId: 700})});
assert.equal(MockRemoteAPI.requests[8].method, 'GET');
assert.equal(MockRemoteAPI.requests[8].url, '/json/builders/some-builder-2/builds/?select=-1&select=-2');
MockRemoteAPI.requests[8].resolve({});
return syncPromise;
}).then(function () {
assert.equal(BuildRequest.all().length, 8);
assert.equal(BuildRequest.findById(700).status(), 'completed');
assert.equal(BuildRequest.findById(701).status(), 'pending');
assert.equal(BuildRequest.findById(702).status(), 'pending');
assert.equal(BuildRequest.findById(703).status(), 'pending');
assert.equal(BuildRequest.findById(710).status(), 'pending');
assert.equal(BuildRequest.findById(711).status(), 'pending');
assert.equal(BuildRequest.findById(712).status(), 'pending');
assert.equal(BuildRequest.findById(713).status(), 'pending');
return BuildRequest.fetchForTriggerable(MockData.mockTestSyncConfigWithTwoBuilders().triggerableName);
}).then(function () {
assert.equal(BuildRequest.all().length, 8);
assert.equal(BuildRequest.findById(700).status(), 'completed');
assert.equal(BuildRequest.findById(701).status(), 'running');
assert.equal(BuildRequest.findById(702).status(), 'scheduled');
assert.equal(BuildRequest.findById(703).status(), 'pending');
assert.equal(BuildRequest.findById(710).status(), 'scheduled');
assert.equal(BuildRequest.findById(711).status(), 'pending');
assert.equal(BuildRequest.findById(712).status(), 'pending');
assert.equal(BuildRequest.findById(713).status(), 'pending');
done();
}).catch(done);
});
it('should update the status of a supposedly scheduled build that went missing', function (done) {
let db = TestServer.database();
let syncPromise;
db.connect().then(function () {
return MockData.addMockData(db, ['scheduled', 'pending', 'pending', 'pending']);
}).then(function () {
return Manifest.fetch();
}).then(function () {
let config = MockData.mockTestSyncConfigWithSingleBuilder();
let logger = new MockLogger;
let slaveInfo = {name: 'sync-slave', password: 'password'};
let triggerable = new BuildbotTriggerable(config, TestServer.remoteAPI(), MockRemoteAPI, slaveInfo, logger);
syncPromise = triggerable.syncOnce();
syncPromise.catch(done);
return MockRemoteAPI.waitForRequest();
}).then(function () {
assert.equal(MockRemoteAPI.requests.length, 1);
assert.equal(MockRemoteAPI.requests[0].method, 'GET');
assert.equal(MockRemoteAPI.requests[0].url, '/json/builders/some-builder-1/pendingBuilds');
MockRemoteAPI.requests[0].resolve([]);
return MockRemoteAPI.waitForRequest();
}).then(function () {
assert.equal(MockRemoteAPI.requests.length, 2);
assert.equal(MockRemoteAPI.requests[1].method, 'GET');
assert.equal(MockRemoteAPI.requests[1].url, '/json/builders/some-builder-1/builds/?select=-1&select=-2');
MockRemoteAPI.requests[1].resolve({});
return MockRemoteAPI.waitForRequest();
}).then(function () {
assert.equal(MockRemoteAPI.requests.length, 3);
assert.equal(MockRemoteAPI.requests[2].method, 'GET');
assert.equal(MockRemoteAPI.requests[2].url, '/json/builders/some-builder-1/pendingBuilds');
MockRemoteAPI.requests[2].resolve([]);
return MockRemoteAPI.waitForRequest();
}).then(function () {
assert.equal(MockRemoteAPI.requests.length, 4);
assert.equal(MockRemoteAPI.requests[3].method, 'GET');
assert.equal(MockRemoteAPI.requests[3].url, '/json/builders/some-builder-1/builds/?select=-1&select=-2');
MockRemoteAPI.requests[3].resolve({});
return syncPromise;
}).then(function () {
assert.equal(BuildRequest.all().length, 4);
assert.equal(BuildRequest.findById(700).status(), 'scheduled');
assert.equal(BuildRequest.findById(701).status(), 'pending');
assert.equal(BuildRequest.findById(702).status(), 'pending');
assert.equal(BuildRequest.findById(703).status(), 'pending');
return BuildRequest.fetchForTriggerable(MockData.mockTestSyncConfigWithTwoBuilders().triggerableName);
}).then(function () {
assert.equal(BuildRequest.all().length, 4);
assert.equal(BuildRequest.findById(700).status(), 'failed');
assert.equal(BuildRequest.findById(701).status(), 'pending');
assert.equal(BuildRequest.findById(702).status(), 'pending');
assert.equal(BuildRequest.findById(703).status(), 'pending');
done();
}).catch(done);
});
it('should schedule a build request of an user created test group before ones created by automatic change detection', function (done) {
let db = TestServer.database();
let syncPromise;
db.connect().then(function () {
return Promise.all([
MockData.addMockData(db, ['pending', 'pending', 'pending', 'pending']),
MockData.addAnotherMockTestGroup(db, ['pending', 'pending', 'pending', 'pending'], 'rniwa'),
]);
}).then(function () {
return Manifest.fetch();
}).then(function () {
let config = MockData.mockTestSyncConfigWithSingleBuilder();
let logger = new MockLogger;
let slaveInfo = {name: 'sync-slave', password: 'password'};
let triggerable = new BuildbotTriggerable(config, TestServer.remoteAPI(), MockRemoteAPI, slaveInfo, logger);
syncPromise = triggerable.syncOnce();
syncPromise.catch(done);
return MockRemoteAPI.waitForRequest();
}).then(function () {
assert.equal(MockRemoteAPI.requests.length, 1);
assert.equal(MockRemoteAPI.requests[0].method, 'GET');
assert.equal(MockRemoteAPI.requests[0].url, '/json/builders/some-builder-1/pendingBuilds');
MockRemoteAPI.requests[0].resolve([]);
return MockRemoteAPI.waitForRequest();
}).then(function () {
assert.equal(MockRemoteAPI.requests.length, 2);
assert.equal(MockRemoteAPI.requests[1].method, 'GET');
assert.equal(MockRemoteAPI.requests[1].url, '/json/builders/some-builder-1/builds/?select=-1&select=-2');
MockRemoteAPI.requests[1].resolve({});
return MockRemoteAPI.waitForRequest();
}).then(function () {
assert.equal(MockRemoteAPI.requests.length, 3);
assert.equal(MockRemoteAPI.requests[2].method, 'POST');
assert.equal(MockRemoteAPI.requests[2].url, '/builders/some-builder-1/force');
assert.deepEqual(MockRemoteAPI.requests[2].data, {'wk': '191622', 'os': '10.11 15A284', 'build-request-id': '710'});
MockRemoteAPI.requests[2].resolve('OK');
done();
}).catch(done);
});
});
});