haikuwebkit/Websites/perf.webkit.org/server-tests/api-upload-root-tests.js

814 lines
40 KiB
JavaScript

'use strict';
const assert = require('assert');
require('../tools/js/v3-models.js');
const MockData = require('./resources/mock-data.js');
const TestServer = require('./resources/test-server.js');
const TemporaryFile = require('./resources/temporary-file.js').TemporaryFile;
const addWorkerForReport = require('./resources/common-operations.js').addWorkerForReport;
const prepareServerTest = require('./resources/common-operations.js').prepareServerTest;
function makeReport(rootFile, buildRequestId = 1, repositoryList = ['WebKit'], buildTime = '2017-05-10T02:54:08.666')
{
return {
workerName: 'someWorker',
workerPassword: 'somePassword',
builderName: 'someBuilder',
buildTag: "123",
buildTime: buildTime,
buildRequest: buildRequestId,
rootFile: rootFile,
repositoryList: JSON.stringify(repositoryList),
};
}
function addWorkerAndCreateRootFile(workerInfo = makeReport())
{
return addWorkerForReport(workerInfo).then(() => {
return TemporaryFile.makeTemporaryFile('some.dat', 'some content');
});
}
function createTestGroupWihPatch()
{
const triggerableConfiguration = {
'workerName': 'sync-worker',
'workerPassword': 'password',
'triggerable': 'build-webkit',
'configurations': [
{test: MockData.someTestId(), platform: MockData.somePlatformId()},
],
'repositoryGroups': [
{name: 'webkit', repositories: [
{repository: MockData.webkitRepositoryId(), acceptsPatch: true},
{repository: MockData.sharedRepositoryId()},
]}
]
};
const db = TestServer.database();
return MockData.addMockData(db).then(() => {
return Promise.all([TemporaryFile.makeTemporaryFile('patch.dat', 'patch file'), Manifest.fetch()]);
}).then((result) => {
const patchFile = result[0];
return Promise.all([UploadedFile.uploadFile(patchFile), TestServer.remoteAPI().postJSON('/api/update-triggerable/', triggerableConfiguration)]);
}).then((result) => {
const patchFile = result[0];
const someTest = Test.findById(MockData.someTestId());
const webkit = Repository.findById(MockData.webkitRepositoryId());
const shared = Repository.findById(MockData.sharedRepositoryId());
const set1 = new CustomCommitSet;
set1.setRevisionForRepository(webkit, '191622', patchFile);
set1.setRevisionForRepository(shared, '80229');
const set2 = new CustomCommitSet;
set2.setRevisionForRepository(webkit, '191622');
set2.setRevisionForRepository(shared, '80229');
return TestGroup.createWithTask('custom task', Platform.findById(MockData.somePlatformId()), someTest, 'some group', 2, 'alternating', [set1, set2]);
}).then((task) => {
return TestGroup.findAllByTask(task.id())[0];
}).then((group) => {
return db.query('UPDATE analysis_test_groups SET testgroup_author = $1', ['someUser']).then(() => group);
});
}
function createTestGroupWithPatchAndOwnedCommits()
{
const triggerableConfiguration = {
'workerName': 'sync-worker',
'workerPassword': 'password',
'triggerable': 'build-webkit',
'configurations': [
{test: MockData.someTestId(), platform: MockData.somePlatformId()},
],
'repositoryGroups': [
{name: 'webkit', repositories: [
{repository: MockData.webkitRepositoryId(), acceptsPatch: true}
]}
]
};
const db = TestServer.database();
return MockData.addMockData(db).then(() => {
return Promise.all([TemporaryFile.makeTemporaryFile('patch.dat', 'patch file'), Manifest.fetch()]);
}).then((result) => {
const patchFile = result[0];
return Promise.all([UploadedFile.uploadFile(patchFile), TestServer.remoteAPI().postJSON('/api/update-triggerable/', triggerableConfiguration)]);
}).then((result) => {
const patchFile = result[0];
const someTest = Test.findById(MockData.someTestId());
const webkit = Repository.findById(MockData.webkitRepositoryId());
const ownedSJC = Repository.findById(MockData.ownedJSCRepositoryId());
const set1 = new CustomCommitSet;
set1.setRevisionForRepository(webkit, '191622', patchFile);
set1.setRevisionForRepository(ownedSJC, 'owned-jsc-6161', null, '191622');
const set2 = new CustomCommitSet;
set2.setRevisionForRepository(webkit, '192736');
set2.setRevisionForRepository(ownedSJC, 'owned-jsc-9191', null, '192736');
return TestGroup.createWithTask('custom task', Platform.findById(MockData.somePlatformId()), someTest, 'some group', 2, 'alternating', [set1, set2]);
}).then((task) => {
return TestGroup.findAllByTask(task.id())[0];
}).then((group) => {
return db.query('UPDATE analysis_test_groups SET testgroup_author = $1', ['someUser']).then(() => group);
});
}
describe('/api/upload-root/', function () {
prepareServerTest(this);
TemporaryFile.inject();
it('should reject when root file is missing', () => {
return TestServer.remoteAPI().postFormData('/api/upload-root/', {}).then((response) => {
assert.strictEqual(response['status'], 'NoFileSpecified');
});
});
it('should reject when there are no workers', () => {
return TemporaryFile.makeTemporaryFile('some.dat', 'some content').then((rootFile) => {
return TestServer.remoteAPI().postFormData('/api/upload-root/', makeReport(rootFile));
}).then((response) => {
assert.strictEqual(response['status'], 'WorkerNotFound');
});
});
it('should reject when worker name is missing', () => {
return addWorkerAndCreateRootFile().then((rootFile) => {
const report = makeReport(rootFile);
delete report.workerName;
return TestServer.remoteAPI().postFormData('/api/upload-root/', report);
}).then((response) => {
assert.strictEqual(response['status'], 'MissingWorkerName');
});
});
it('should reject when builder name is missing', () => {
return addWorkerAndCreateRootFile().then((rootFile) => {
const report = makeReport(rootFile);
delete report.builderName;
return TestServer.remoteAPI().postFormData('/api/upload-root/', report);
}).then((response) => {
assert.strictEqual(response['status'], 'InvalidBuilderName');
});
});
it('should reject when build tag is missing', () => {
return addWorkerAndCreateRootFile().then((rootFile) => {
const report = makeReport(rootFile);
delete report.buildTag;
return TestServer.remoteAPI().postFormData('/api/upload-root/', report);
}).then((response) => {
assert.strictEqual(response['status'], 'InvalidBuildTag');
});
});
it('should reject when build number is not a number', () => {
return addWorkerAndCreateRootFile().then((rootFile) => {
const report = makeReport(rootFile);
delete report.buildTag;
report.buildNumber = '1abc';
return TestServer.remoteAPI().postFormData('/api/upload-root/', report);
}).then((response) => {
assert.strictEqual(response['status'], 'InvalidBuildNumber');
});
});
it('should reject if both build number and build tag exists but different', async () => {
const rootFile = await addWorkerAndCreateRootFile();
const report = makeReport(rootFile);
report.buildNumber = '456';
const response = await TestServer.remoteAPI().postFormData('/api/upload-root/', report);
assert.strictEqual(response['status'], 'BuilderNumberTagMismatch');
});
it('should accept if both build number and build tag exists with same value', async () => {
const testGroup = await createTestGroupWithPatchAndOwnedCommits();
const webkit = Repository.findById(MockData.webkitRepositoryId());
const ownedJSC = Repository.findById(MockData.ownedJSCRepositoryId());
const buildRequest = testGroup.buildRequests()[0];
assert.strictEqual(testGroup.buildRequests().length, 6);
assert(buildRequest.isBuild());
assert(!buildRequest.isTest());
assert(!buildRequest.hasFinished());
assert(buildRequest.isPending());
assert.strictEqual(buildRequest.buildId(), null);
const commitSet = buildRequest.commitSet();
assert.strictEqual(commitSet.revisionForRepository(webkit), '191622');
const webkitPatch = commitSet.patchForRepository(webkit);
assert(webkitPatch instanceof UploadedFile);
assert.strictEqual(webkitPatch.filename(), 'patch.dat');
assert.strictEqual(commitSet.rootForRepository(webkit), null);
assert.strictEqual(commitSet.revisionForRepository(ownedJSC), 'owned-jsc-6161');
assert.strictEqual(commitSet.patchForRepository(ownedJSC), null);
assert.strictEqual(commitSet.rootForRepository(ownedJSC), null);
assert.deepStrictEqual(commitSet.allRootFiles(), []);
const otherBuildRequest = testGroup.buildRequests()[1];
const otherCommitSet = otherBuildRequest.commitSet();
assert.strictEqual(otherCommitSet.revisionForRepository(webkit), '192736');
assert.strictEqual(otherCommitSet.patchForRepository(webkit), null);
assert.strictEqual(otherCommitSet.rootForRepository(webkit), null);
assert.strictEqual(otherCommitSet.revisionForRepository(ownedJSC), 'owned-jsc-9191');
assert.strictEqual(otherCommitSet.patchForRepository(ownedJSC), null);
assert.strictEqual(otherCommitSet.rootForRepository(ownedJSC), null);
assert.deepStrictEqual(otherCommitSet.allRootFiles(), []);
const rootFile = await addWorkerAndCreateRootFile();
const report = makeReport(rootFile, buildRequest.id(), ['WebKit']);
report.buildNumber = report.buildTag;
const response = await TestServer.remoteAPI().postFormData('/api/upload-root/', report);
assert.strictEqual(response['status'], 'OK');
});
it('should continue working with build number if build tag is not present', async () => {
const testGroup = await createTestGroupWithPatchAndOwnedCommits();
const webkit = Repository.findById(MockData.webkitRepositoryId());
const ownedJSC = Repository.findById(MockData.ownedJSCRepositoryId());
const buildRequest = testGroup.buildRequests()[0];
assert.strictEqual(testGroup.buildRequests().length, 6);
assert(buildRequest.isBuild());
assert(!buildRequest.isTest());
assert(!buildRequest.hasFinished());
assert(buildRequest.isPending());
assert.strictEqual(buildRequest.buildId(), null);
const commitSet = buildRequest.commitSet();
assert.strictEqual(commitSet.revisionForRepository(webkit), '191622');
const webkitPatch = commitSet.patchForRepository(webkit);
assert(webkitPatch instanceof UploadedFile);
assert.strictEqual(webkitPatch.filename(), 'patch.dat');
assert.strictEqual(commitSet.rootForRepository(webkit), null);
assert.strictEqual(commitSet.revisionForRepository(ownedJSC), 'owned-jsc-6161');
assert.strictEqual(commitSet.patchForRepository(ownedJSC), null);
assert.strictEqual(commitSet.rootForRepository(ownedJSC), null);
assert.deepStrictEqual(commitSet.allRootFiles(), []);
const otherBuildRequest = testGroup.buildRequests()[1];
const otherCommitSet = otherBuildRequest.commitSet();
assert.strictEqual(otherCommitSet.revisionForRepository(webkit), '192736');
assert.strictEqual(otherCommitSet.patchForRepository(webkit), null);
assert.strictEqual(otherCommitSet.rootForRepository(webkit), null);
assert.strictEqual(otherCommitSet.revisionForRepository(ownedJSC), 'owned-jsc-9191');
assert.strictEqual(otherCommitSet.patchForRepository(ownedJSC), null);
assert.strictEqual(otherCommitSet.rootForRepository(ownedJSC), null);
assert.deepStrictEqual(otherCommitSet.allRootFiles(), []);
const rootFile = await addWorkerAndCreateRootFile();
const report = makeReport(rootFile, buildRequest.id(), ['WebKit']);
delete report.buildTag;
report.buildNumber = '123';
const response = await TestServer.remoteAPI().postFormData('/api/upload-root/', report);
assert.strictEqual(response['status'], 'OK');
});
it('should reject when build time is missing', () => {
return addWorkerAndCreateRootFile().then((rootFile) => {
const report = makeReport(rootFile);
delete report.buildTime;
return TestServer.remoteAPI().postFormData('/api/upload-root/', report);
}).then((response) => {
assert.strictEqual(response['status'], 'InvalidBuildTime');
});
});
it('should reject when build time is malformed', () => {
return addWorkerAndCreateRootFile().then((rootFile) => {
const report = makeReport(rootFile);
report.buildTime = 'Wed, 10 May 2017 03:02:30 GMT';
return TestServer.remoteAPI().postFormData('/api/upload-root/', report);
}).then((response) => {
assert.strictEqual(response['status'], 'InvalidBuildTime');
});
});
it('should reject when build request ID is missing', () => {
return addWorkerAndCreateRootFile().then((rootFile) => {
const report = makeReport(rootFile);
delete report.buildRequest;
return TestServer.remoteAPI().postFormData('/api/upload-root/', report);
}).then((response) => {
assert.strictEqual(response['status'], 'InvalidBuildRequest');
});
});
it('should reject when build request ID is not a number', () => {
return addWorkerAndCreateRootFile().then((rootFile) => {
const report = makeReport(rootFile);
report.buildRequest = 'abc';
return TestServer.remoteAPI().postFormData('/api/upload-root/', report);
}).then((response) => {
assert.strictEqual(response['status'], 'InvalidBuildRequest');
});
});
it('should reject when build request does not exist', () => {
return addWorkerAndCreateRootFile().then((rootFile) => {
return TestServer.remoteAPI().postFormData('/api/upload-root/', makeReport(rootFile));
}).then((response) => {
assert.strictEqual(response['status'], 'InvalidBuildRequestType');
});
});
it('should reject when repository list is missing', () => {
return addWorkerAndCreateRootFile().then((rootFile) => {
const report = makeReport(rootFile);
delete report.repositoryList;
return TestServer.remoteAPI().postFormData('/api/upload-root/', report);
}).then((response) => {
assert.strictEqual(response['status'], 'InvalidRepositoryList');
});
});
it('should reject when repository list is not a valid JSON string', () => {
return addWorkerAndCreateRootFile().then((rootFile) => {
const report = makeReport(rootFile);
report.repositoryList = 'a+b';
return TestServer.remoteAPI().postFormData('/api/upload-root/', report);
}).then((response) => {
assert.strictEqual(response['status'], 'InvalidRepositoryList');
});
});
it('should reject when using invalid key to specify an owned repository', () => {
let webkit;
let webkitPatch;
let ownedJSC;
let testGroup;
let buildRequest;
let otherBuildRequest;
let uploadedRoot;
return createTestGroupWithPatchAndOwnedCommits().then((group) => {
webkit = Repository.findById(MockData.webkitRepositoryId());
ownedJSC = Repository.findById(MockData.ownedJSCRepositoryId());
testGroup = group;
buildRequest = testGroup.buildRequests()[0];
assert.strictEqual(testGroup.buildRequests().length, 6);
assert(buildRequest.isBuild());
assert(!buildRequest.isTest());
assert(!buildRequest.hasFinished());
assert(buildRequest.isPending());
assert.strictEqual(buildRequest.buildId(), null);
const commitSet = buildRequest.commitSet();
assert.strictEqual(commitSet.revisionForRepository(webkit), '191622');
webkitPatch = commitSet.patchForRepository(webkit);
assert(webkitPatch instanceof UploadedFile);
assert.strictEqual(webkitPatch.filename(), 'patch.dat');
assert.strictEqual(commitSet.rootForRepository(webkit), null);
assert.strictEqual(commitSet.revisionForRepository(ownedJSC), 'owned-jsc-6161');
assert.strictEqual(commitSet.patchForRepository(ownedJSC), null);
assert.strictEqual(commitSet.rootForRepository(ownedJSC), null);
assert.deepStrictEqual(commitSet.allRootFiles(), []);
otherBuildRequest = testGroup.buildRequests()[1];
const otherCommitSet = otherBuildRequest.commitSet();
assert.strictEqual(otherCommitSet.revisionForRepository(webkit), '192736');
assert.strictEqual(otherCommitSet.patchForRepository(webkit), null);
assert.strictEqual(otherCommitSet.rootForRepository(webkit), null);
assert.strictEqual(otherCommitSet.revisionForRepository(ownedJSC), 'owned-jsc-9191');
assert.strictEqual(otherCommitSet.patchForRepository(ownedJSC), null);
assert.strictEqual(otherCommitSet.rootForRepository(ownedJSC), null);
assert.deepStrictEqual(otherCommitSet.allRootFiles(), []);
return addWorkerAndCreateRootFile();
}).then((rootFile) => {
const report = makeReport(rootFile, buildRequest.id(), ['WebKit']);
return TestServer.remoteAPI().postFormData('/api/upload-root/', report);
}).then((response) => {
assert.strictEqual(response['status'], 'OK');
const uploadedRootRawData = response['uploadedFile'];
uploadedRoot = UploadedFile.ensureSingleton(uploadedRootRawData.id, uploadedRootRawData);
assert.strictEqual(uploadedRoot.filename(), 'some.dat');
return TestGroup.fetchForTask(buildRequest.testGroup().task().id(), true);
}).then((testGroups) => {
assert.strictEqual(testGroups.length, 1);
const group = testGroups[0];
assert.strictEqual(group, testGroup);
assert.strictEqual(testGroup.buildRequests().length, 6);
const updatedBuildRequest = testGroup.buildRequests()[0];
assert.strictEqual(updatedBuildRequest, buildRequest);
assert(buildRequest.isBuild());
assert(!buildRequest.isTest());
assert(!buildRequest.hasFinished());
assert.strictEqual(buildRequest.buildId(), null);
assert.deepStrictEqual(buildRequest.commitSet().allRootFiles(), [uploadedRoot]);
assert.deepStrictEqual(otherBuildRequest.commitSet().allRootFiles(), []);
return TemporaryFile.makeTemporaryFile('JavaScriptCore-Root.dat', 'JavaScript Content 0');
}).then((rootFile) => {
const report = makeReport(rootFile, buildRequest.id(), [{ownerRepositoryWrongKey: 'WebKit', ownedRepository: 'JavaScriptCore'}], '2017-05-10T02:54:09.666');
return TestServer.remoteAPI().postFormData('/api/upload-root/', report);
}).then((response) => {
assert.strictEqual(response['status'], 'InvalidKeyForRepository');
});
});
it('should reject when reporting an invalid owned repository', () => {
let webkit;
let webkitPatch;
let ownedJSC;
let testGroup;
let buildRequest;
let otherBuildRequest;
let uploadedRoot;
return createTestGroupWithPatchAndOwnedCommits().then((group) => {
webkit = Repository.findById(MockData.webkitRepositoryId());
ownedJSC = Repository.findById(MockData.ownedJSCRepositoryId());
testGroup = group;
buildRequest = testGroup.buildRequests()[0];
assert.strictEqual(testGroup.buildRequests().length, 6);
assert(buildRequest.isBuild());
assert(!buildRequest.isTest());
assert(!buildRequest.hasFinished());
assert(buildRequest.isPending());
assert.strictEqual(buildRequest.buildId(), null);
const commitSet = buildRequest.commitSet();
assert.strictEqual(commitSet.revisionForRepository(webkit), '191622');
webkitPatch = commitSet.patchForRepository(webkit);
assert(webkitPatch instanceof UploadedFile);
assert.strictEqual(webkitPatch.filename(), 'patch.dat');
assert.strictEqual(commitSet.rootForRepository(webkit), null);
assert.strictEqual(commitSet.revisionForRepository(ownedJSC), 'owned-jsc-6161');
assert.strictEqual(commitSet.patchForRepository(ownedJSC), null);
assert.strictEqual(commitSet.rootForRepository(ownedJSC), null);
assert.deepStrictEqual(commitSet.allRootFiles(), []);
otherBuildRequest = testGroup.buildRequests()[1];
const otherCommitSet = otherBuildRequest.commitSet();
assert.strictEqual(otherCommitSet.revisionForRepository(webkit), '192736');
assert.strictEqual(otherCommitSet.patchForRepository(webkit), null);
assert.strictEqual(otherCommitSet.rootForRepository(webkit), null);
assert.strictEqual(otherCommitSet.revisionForRepository(ownedJSC), 'owned-jsc-9191');
assert.strictEqual(otherCommitSet.patchForRepository(ownedJSC), null);
assert.strictEqual(otherCommitSet.rootForRepository(ownedJSC), null);
assert.deepStrictEqual(otherCommitSet.allRootFiles(), []);
return addWorkerAndCreateRootFile();
}).then((rootFile) => {
const report = makeReport(rootFile, buildRequest.id(), ['WebKit']);
return TestServer.remoteAPI().postFormData('/api/upload-root/', report);
}).then((response) => {
assert.strictEqual(response['status'], 'OK');
const uploadedRootRawData = response['uploadedFile'];
uploadedRoot = UploadedFile.ensureSingleton(uploadedRootRawData.id, uploadedRootRawData);
assert.strictEqual(uploadedRoot.filename(), 'some.dat');
return TestGroup.fetchForTask(buildRequest.testGroup().task().id(), true);
}).then((testGroups) => {
assert.strictEqual(testGroups.length, 1);
const group = testGroups[0];
assert.strictEqual(group, testGroup);
assert.strictEqual(testGroup.buildRequests().length, 6);
const updatedBuildRequest = testGroup.buildRequests()[0];
assert.strictEqual(updatedBuildRequest, buildRequest);
assert(buildRequest.isBuild());
assert(!buildRequest.isTest());
assert(!buildRequest.hasFinished());
assert.strictEqual(buildRequest.buildId(), null);
assert.deepStrictEqual(buildRequest.commitSet().allRootFiles(), [uploadedRoot]);
assert.deepStrictEqual(otherBuildRequest.commitSet().allRootFiles(), []);
return TemporaryFile.makeTemporaryFile('JavaScriptCore-Root.dat', 'JavaScript Content 0');
}).then((rootFile) => {
const report = makeReport(rootFile, buildRequest.id(), [{ownerRepository: 'WebKit2', ownedRepository: 'JavaScriptCore'}], '2017-05-10T02:54:09.666');
return TestServer.remoteAPI().postFormData('/api/upload-root/', report);
}).then((response) => {
assert.strictEqual(response['status'], 'InvalidRepository');
});
});
it('should accept when build request exists', () => {
let webkit;
let webkitPatch;
let shared;
let testGroup;
let buildRequest;
let otherBuildRequest;
let uploadedRoot;
return createTestGroupWihPatch().then((group) => {
webkit = Repository.findById(MockData.webkitRepositoryId());
shared = Repository.findById(MockData.sharedRepositoryId());
testGroup = group;
buildRequest = testGroup.buildRequests()[0];
assert.strictEqual(testGroup.buildRequests().length, 6);
assert(buildRequest.isBuild());
assert(!buildRequest.isTest());
assert(!buildRequest.hasFinished());
assert(buildRequest.isPending());
assert.strictEqual(buildRequest.buildId(), null);
const commitSet = buildRequest.commitSet();
assert.strictEqual(commitSet.revisionForRepository(webkit), '191622');
webkitPatch = commitSet.patchForRepository(webkit);
assert(webkitPatch instanceof UploadedFile);
assert.strictEqual(webkitPatch.filename(), 'patch.dat');
assert.strictEqual(commitSet.rootForRepository(webkit), null);
assert.strictEqual(commitSet.revisionForRepository(shared), '80229');
assert.strictEqual(commitSet.patchForRepository(shared), null);
assert.strictEqual(commitSet.rootForRepository(shared), null);
assert.deepStrictEqual(commitSet.allRootFiles(), []);
otherBuildRequest = testGroup.buildRequests()[1];
const otherCommitSet = otherBuildRequest.commitSet();
assert.strictEqual(otherCommitSet.revisionForRepository(webkit), '191622');
assert.strictEqual(otherCommitSet.patchForRepository(webkit), null);
assert.strictEqual(otherCommitSet.rootForRepository(webkit), null);
assert.strictEqual(otherCommitSet.revisionForRepository(shared), '80229');
assert.strictEqual(otherCommitSet.patchForRepository(shared), null);
assert.strictEqual(otherCommitSet.rootForRepository(shared), null);
assert.deepStrictEqual(otherCommitSet.allRootFiles(), []);
return addWorkerAndCreateRootFile();
}).then((rootFile) => {
return TestServer.remoteAPI().postFormData('/api/upload-root/', makeReport(rootFile, buildRequest.id()));
}).then((response) => {
assert.strictEqual(response['status'], 'OK');
const uploadedRootRawData = response['uploadedFile'];
uploadedRoot = UploadedFile.ensureSingleton(uploadedRootRawData.id, uploadedRootRawData);
assert.strictEqual(uploadedRoot.filename(), 'some.dat');
assert.strictEqual(uploadedRoot.author(), 'someUser');
return TestGroup.fetchForTask(buildRequest.testGroup().task().id(), true);
}).then((testGroups) => {
assert.strictEqual(testGroups.length, 1);
const group = testGroups[0];
assert.strictEqual(group, testGroup);
assert.strictEqual(testGroup.buildRequests().length, 6);
const updatedBuildRequest = testGroup.buildRequests()[0];
assert.strictEqual(updatedBuildRequest, buildRequest);
assert(buildRequest.isBuild());
assert(!buildRequest.isTest());
assert(buildRequest.hasFinished());
assert(!buildRequest.isPending());
assert.notStrictEqual(buildRequest.buildId(), null);
const commitSet = buildRequest.commitSet();
assert.strictEqual(commitSet.revisionForRepository(webkit), '191622');
assert.strictEqual(commitSet.patchForRepository(webkit), webkitPatch);
const webkitRoot = commitSet.rootForRepository(webkit);
assert.strictEqual(webkitRoot, uploadedRoot);
assert.strictEqual(commitSet.revisionForRepository(shared), '80229');
assert.strictEqual(commitSet.patchForRepository(shared), null);
assert.strictEqual(commitSet.rootForRepository(shared), null);
assert.deepStrictEqual(commitSet.allRootFiles(), [uploadedRoot]);
const otherCommitSet = otherBuildRequest.commitSet();
assert.strictEqual(otherCommitSet.revisionForRepository(webkit), '191622');
assert.strictEqual(otherCommitSet.patchForRepository(webkit), null);
assert.strictEqual(otherCommitSet.rootForRepository(webkit), null);
assert.strictEqual(otherCommitSet.revisionForRepository(shared), '80229');
assert.strictEqual(otherCommitSet.patchForRepository(shared), null);
assert.strictEqual(otherCommitSet.rootForRepository(shared), null);
assert.deepStrictEqual(otherCommitSet.allRootFiles(), []);
});
});
it('should reject when the repository list is not an array', () => {
let buildRequest;
return createTestGroupWihPatch().then((group) => {
buildRequest = group.buildRequests()[0];
return addWorkerAndCreateRootFile();
}).then((rootFile) => {
const report = makeReport(rootFile, buildRequest.id());
report.repositoryList = '"a"';
return TestServer.remoteAPI().postFormData('/api/upload-root/', report);
}).then((response) => {
assert.strictEqual(response['status'], 'InvalidRepositoryList');
});
});
it('should reject when the repository list refers to a non-existent repository', () => {
let buildRequest;
return createTestGroupWihPatch().then((group) => {
buildRequest = group.buildRequests()[0];
return addWorkerAndCreateRootFile();
}).then((rootFile) => {
const report = makeReport(rootFile, buildRequest.id());
report.repositoryList = '["WebKit", "BadRepositoryName"]';
return TestServer.remoteAPI().postFormData('/api/upload-root/', report);
}).then((response) => {
assert.strictEqual(response['status'], 'InvalidRepository');
assert.strictEqual(response['repositoryName'], 'BadRepositoryName');
});
});
it('should reject when the repository list refers to a repository not present in the commit set', () => {
let buildRequest;
return createTestGroupWihPatch().then((group) => {
buildRequest = group.buildRequests()[0];
return addWorkerAndCreateRootFile();
}).then((rootFile) => {
const report = makeReport(rootFile, buildRequest.id());
report.repositoryList = '["WebKit", "macOS"]';
return TestServer.remoteAPI().postFormData('/api/upload-root/', report);
}).then((response) => {
assert.strictEqual(response['status'], 'InvalidRepository');
assert.strictEqual(response['repositoryName'], 'macOS');
});
});
it('should update all commit set items in the repository listed', () => {
let webkit;
let webkitPatch;
let shared;
let testGroup;
let buildRequest;
let otherBuildRequest;
let uploadedRoot;
return createTestGroupWihPatch().then((group) => {
webkit = Repository.findById(MockData.webkitRepositoryId());
shared = Repository.findById(MockData.sharedRepositoryId());
testGroup = group;
buildRequest = testGroup.buildRequests()[0];
assert.strictEqual(testGroup.buildRequests().length, 6);
assert(buildRequest.isBuild());
assert(!buildRequest.isTest());
assert(!buildRequest.hasFinished());
assert(buildRequest.isPending());
assert.strictEqual(buildRequest.buildId(), null);
const commitSet = buildRequest.commitSet();
assert.strictEqual(commitSet.revisionForRepository(webkit), '191622');
webkitPatch = commitSet.patchForRepository(webkit);
assert(webkitPatch instanceof UploadedFile);
assert.strictEqual(webkitPatch.filename(), 'patch.dat');
assert.strictEqual(commitSet.rootForRepository(webkit), null);
assert.strictEqual(commitSet.revisionForRepository(shared), '80229');
assert.strictEqual(commitSet.patchForRepository(shared), null);
assert.strictEqual(commitSet.rootForRepository(shared), null);
assert.deepStrictEqual(commitSet.allRootFiles(), []);
otherBuildRequest = testGroup.buildRequests()[1];
const otherCommitSet = otherBuildRequest.commitSet();
assert.strictEqual(otherCommitSet.revisionForRepository(webkit), '191622');
assert.strictEqual(otherCommitSet.patchForRepository(webkit), null);
assert.strictEqual(otherCommitSet.rootForRepository(webkit), null);
assert.strictEqual(otherCommitSet.revisionForRepository(shared), '80229');
assert.strictEqual(otherCommitSet.patchForRepository(shared), null);
assert.strictEqual(otherCommitSet.rootForRepository(shared), null);
assert.deepStrictEqual(otherCommitSet.allRootFiles(), []);
return addWorkerAndCreateRootFile();
}).then((rootFile) => {
const report = makeReport(rootFile, buildRequest.id());
report.repositoryList = '["WebKit", "Shared"]';
return TestServer.remoteAPI().postFormData('/api/upload-root/', report);
}).then((response) => {
assert.strictEqual(response['status'], 'OK');
const uploadedRootRawData = response['uploadedFile'];
uploadedRoot = UploadedFile.ensureSingleton(uploadedRootRawData.id, uploadedRootRawData);
assert.strictEqual(uploadedRoot.filename(), 'some.dat');
assert.strictEqual(uploadedRoot.author(), 'someUser');
return TestGroup.fetchForTask(buildRequest.testGroup().task().id(), true);
}).then((testGroups) => {
assert.strictEqual(testGroups.length, 1);
const group = testGroups[0];
assert.strictEqual(group, testGroup);
assert.strictEqual(testGroup.buildRequests().length, 6);
const updatedBuildRequest = testGroup.buildRequests()[0];
assert.strictEqual(updatedBuildRequest, buildRequest);
assert(buildRequest.isBuild());
assert(!buildRequest.isTest());
assert(buildRequest.hasFinished());
assert(!buildRequest.isPending());
assert.notStrictEqual(buildRequest.buildId(), null);
const commitSet = buildRequest.commitSet();
assert.strictEqual(commitSet.revisionForRepository(webkit), '191622');
assert.strictEqual(commitSet.patchForRepository(webkit), webkitPatch);
assert.strictEqual(commitSet.rootForRepository(webkit), uploadedRoot);
assert.strictEqual(commitSet.revisionForRepository(shared), '80229');
assert.strictEqual(commitSet.patchForRepository(shared), null);
assert.strictEqual(commitSet.rootForRepository(shared), uploadedRoot);
assert.deepStrictEqual(commitSet.allRootFiles(), [uploadedRoot]);
const otherCommitSet = otherBuildRequest.commitSet();
assert.strictEqual(otherCommitSet.revisionForRepository(webkit), '191622');
assert.strictEqual(otherCommitSet.patchForRepository(webkit), null);
assert.strictEqual(otherCommitSet.rootForRepository(webkit), null);
assert.strictEqual(otherCommitSet.revisionForRepository(shared), '80229');
assert.strictEqual(otherCommitSet.patchForRepository(shared), null);
assert.strictEqual(otherCommitSet.rootForRepository(shared), null);
assert.deepStrictEqual(otherCommitSet.allRootFiles(), []);
});
});
it('should only set build requests as complete when all roots are built', () => {
let webkit;
let webkitPatch;
let ownedJSC;
let testGroup;
let buildRequest;
let otherBuildRequest;
let uploadedRoot;
let jscRoot;
return createTestGroupWithPatchAndOwnedCommits().then((group) => {
webkit = Repository.findById(MockData.webkitRepositoryId());
ownedJSC = Repository.findById(MockData.ownedJSCRepositoryId());
testGroup = group;
buildRequest = testGroup.buildRequests()[0];
assert.strictEqual(testGroup.buildRequests().length, 6);
assert(buildRequest.isBuild());
assert(!buildRequest.isTest());
assert(!buildRequest.hasFinished());
assert(buildRequest.isPending());
assert.strictEqual(buildRequest.buildId(), null);
const commitSet = buildRequest.commitSet();
assert.strictEqual(commitSet.revisionForRepository(webkit), '191622');
webkitPatch = commitSet.patchForRepository(webkit);
assert(webkitPatch instanceof UploadedFile);
assert.strictEqual(webkitPatch.filename(), 'patch.dat');
assert.strictEqual(commitSet.rootForRepository(webkit), null);
assert.strictEqual(commitSet.revisionForRepository(ownedJSC), 'owned-jsc-6161');
assert.strictEqual(commitSet.patchForRepository(ownedJSC), null);
assert.strictEqual(commitSet.rootForRepository(ownedJSC), null);
assert.deepStrictEqual(commitSet.allRootFiles(), []);
otherBuildRequest = testGroup.buildRequests()[1];
const otherCommitSet = otherBuildRequest.commitSet();
assert.strictEqual(otherCommitSet.revisionForRepository(webkit), '192736');
assert.strictEqual(otherCommitSet.patchForRepository(webkit), null);
assert.strictEqual(otherCommitSet.rootForRepository(webkit), null);
assert.strictEqual(otherCommitSet.revisionForRepository(ownedJSC), 'owned-jsc-9191');
assert.strictEqual(otherCommitSet.patchForRepository(ownedJSC), null);
assert.strictEqual(otherCommitSet.rootForRepository(ownedJSC), null);
assert.deepStrictEqual(otherCommitSet.allRootFiles(), []);
return addWorkerAndCreateRootFile();
}).then((rootFile) => {
const report = makeReport(rootFile, buildRequest.id(), ['WebKit']);
return TestServer.remoteAPI().postFormData('/api/upload-root/', report);
}).then((response) => {
assert.strictEqual(response['status'], 'OK');
const uploadedRootRawData = response['uploadedFile'];
uploadedRoot = UploadedFile.ensureSingleton(uploadedRootRawData.id, uploadedRootRawData);
assert.strictEqual(uploadedRoot.filename(), 'some.dat');
return TestGroup.fetchForTask(buildRequest.testGroup().task().id(), true);
}).then((testGroups) => {
assert.strictEqual(testGroups.length, 1);
const group = testGroups[0];
assert.strictEqual(group, testGroup);
assert.strictEqual(testGroup.buildRequests().length, 6);
const updatedBuildRequest = testGroup.buildRequests()[0];
assert.strictEqual(updatedBuildRequest, buildRequest);
assert(buildRequest.isBuild());
assert(!buildRequest.isTest());
assert(!buildRequest.hasFinished());
assert.strictEqual(buildRequest.buildId(), null);
assert.deepStrictEqual(buildRequest.commitSet().allRootFiles(), [uploadedRoot]);
assert.deepStrictEqual(otherBuildRequest.commitSet().allRootFiles(), []);
return TemporaryFile.makeTemporaryFile('JavaScriptCore-Root.dat', 'JavaScript Content 0');
}).then((rootFile) => {
const report = makeReport(rootFile, buildRequest.id(), [{ownerRepository: 'WebKit', ownedRepository: 'JavaScriptCore'}], '2017-05-10T02:54:09.666');
return TestServer.remoteAPI().postFormData('/api/upload-root/', report);
}).then((response) => {
assert.strictEqual(response['status'], 'OK');
const uploadedRootRawData = response['uploadedFile'];
jscRoot = UploadedFile.ensureSingleton(uploadedRootRawData.id, uploadedRootRawData);
assert.strictEqual(jscRoot.filename(), 'JavaScriptCore-Root.dat');
return TestGroup.fetchForTask(buildRequest.testGroup().task().id(), true);
}).then((testGroups) => {
assert.strictEqual(testGroups.length, 1);
const group = testGroups[0];
assert.strictEqual(group, testGroup);
assert.strictEqual(testGroup.buildRequests().length, 6);
const updatedBuildRequest = testGroup.buildRequests()[0];
assert.strictEqual(updatedBuildRequest, buildRequest);
assert(buildRequest.isBuild());
assert(!buildRequest.isTest());
assert(buildRequest.hasFinished());
assert(!buildRequest.isPending());
assert.notStrictEqual(buildRequest.buildId(), null);
assert.deepStrictEqual(buildRequest.commitSet().allRootFiles(), [uploadedRoot, jscRoot]);
assert.deepStrictEqual(otherBuildRequest.commitSet().allRootFiles(), []);
});
});
});