BuildRequest should have a method to fetch all in-progress and pending requests for...
[WebKit-https.git] / Websites / perf.webkit.org / server-tests / api-build-requests-tests.js
1 'use strict';
2
3 let assert = require('assert');
4
5 require('../tools/js/v3-models.js');
6
7 let TestServer = require('./resources/test-server.js');
8
9 describe('/api/build-requests', function () {
10     this.timeout(10000);
11     TestServer.inject();
12
13     beforeEach(function () {
14         AnalysisTask._fetchAllPromise = null;
15         AnalysisTask.clearStaticMap();
16         BuildRequest.clearStaticMap();
17         CommitLog.clearStaticMap();
18         Metric.clearStaticMap();
19         Platform.clearStaticMap();
20         Repository.clearStaticMap();
21         RootSet.clearStaticMap();
22         Test.clearStaticMap();
23         TestGroup.clearStaticMap();
24     })
25
26     it('should return "TriggerableNotFound" when the database is empty', function (done) {
27         TestServer.remoteAPI().getJSON('/api/build-requests/build-webkit').then(function (content) {
28             assert.equal(content['status'], 'TriggerableNotFound');
29             done();
30         }).catch(done);
31     });
32
33     it('should return an empty list when there are no build requests', function (done) {
34         TestServer.database().connect().then(function () {
35             return TestServer.database().insert('build_triggerables', {name: 'build-webkit'});
36         }).then(function () {
37             return TestServer.remoteAPI().getJSON('/api/build-requests/build-webkit');
38         }).then(function (content) {
39             assert.equal(content['status'], 'OK');
40             assert.deepEqual(content['buildRequests'], []);
41             assert.deepEqual(content['rootSets'], []);
42             assert.deepEqual(content['roots'], []);
43             assert.deepEqual(Object.keys(content).sort(), ['buildRequests', 'rootSets', 'roots', 'status']);
44             done();
45         }).catch(done);
46     });
47
48     function addMockData(db, statusList)
49     {
50         if (!statusList)
51             statusList = ['pending', 'pending', 'pending', 'pending'];
52         return Promise.all([
53             db.insert('build_triggerables', {id: 1, name: 'build-webkit'}),
54             db.insert('repositories', {id: 9, name: 'OS X'}),
55             db.insert('repositories', {id: 11, name: 'WebKit'}),
56             db.insert('commits', {id: 87832, repository: 9, revision: '10.11 15A284'}),
57             db.insert('commits', {id: 93116, repository: 11, revision: '191622', time: (new Date(1445945816878)).toISOString()}),
58             db.insert('commits', {id: 96336, repository: 11, revision: '192736', time: (new Date(1448225325650)).toISOString()}),
59             db.insert('platforms', {id: 65, name: 'some platform'}),
60             db.insert('tests', {id: 200, name: 'some test'}),
61             db.insert('test_metrics', {id: 300, test: 200, name: 'some metric'}),
62             db.insert('test_configurations', {id: 301, metric: 300, platform: 65, type: 'current'}),
63             db.insert('root_sets', {id: 401}),
64             db.insert('roots', {set: 401, commit: 87832}),
65             db.insert('roots', {set: 401, commit: 93116}),
66             db.insert('root_sets', {id: 402}),
67             db.insert('roots', {set: 402, commit: 87832}),
68             db.insert('roots', {set: 402, commit: 96336}),
69             db.insert('analysis_tasks', {id: 500, platform: 65, metric: 300, name: 'some task'}),
70             db.insert('analysis_test_groups', {id: 600, task: 500, name: 'some test group'}),
71             db.insert('build_requests', {id: 700, status: statusList[0], triggerable: 1, platform: 65, test: 200, group: 600, order: 0, root_set: 401}),
72             db.insert('build_requests', {id: 701, status: statusList[1], triggerable: 1, platform: 65, test: 200, group: 600, order: 1, root_set: 402}),
73             db.insert('build_requests', {id: 702, status: statusList[2], triggerable: 1, platform: 65, test: 200, group: 600, order: 2, root_set: 401}),
74             db.insert('build_requests', {id: 703, status: statusList[3], triggerable: 1, platform: 65, test: 200, group: 600, order: 3, root_set: 402}),
75         ]);
76     }
77
78     function addAnotherMockTestGroup(db, statusList)
79     {
80         if (!statusList)
81             statusList = ['pending', 'pending', 'pending', 'pending'];
82         return Promise.all([
83             db.insert('analysis_test_groups', {id: 599, task: 500, name: 'another test group'}),
84             db.insert('build_requests', {id: 713, status: statusList[3], triggerable: 1, platform: 65, test: 200, group: 599, order: 3, root_set: 402}),
85             db.insert('build_requests', {id: 710, status: statusList[0], triggerable: 1, platform: 65, test: 200, group: 599, order: 0, root_set: 401}),
86             db.insert('build_requests', {id: 712, status: statusList[2], triggerable: 1, platform: 65, test: 200, group: 599, order: 2, root_set: 401}),
87             db.insert('build_requests', {id: 711, status: statusList[1], triggerable: 1, platform: 65, test: 200, group: 599, order: 1, root_set: 402}),
88         ]);
89     }
90
91     it('should return build requets associated with a given triggerable with appropriate roots and rootSets', function (done) {
92         let db = TestServer.database();
93         db.connect().then(function () {
94             return addMockData(db);
95         }).then(function () {
96             return TestServer.remoteAPI().getJSONWithStatus('/api/build-requests/build-webkit');
97         }).then(function (content) {
98             assert.deepEqual(Object.keys(content).sort(), ['buildRequests', 'rootSets', 'roots', 'status']);
99
100             assert.equal(content['rootSets'].length, 2);
101             assert.equal(content['rootSets'][0].id, 401);
102             assert.deepEqual(content['rootSets'][0].roots, ['87832', '93116']);
103             assert.equal(content['rootSets'][1].id, 402);
104             assert.deepEqual(content['rootSets'][1].roots, ['87832', '96336']);
105
106             assert.equal(content['roots'].length, 3);
107             assert.equal(content['roots'][0].id, 87832);
108             assert.equal(content['roots'][0].repository, '9');
109             assert.equal(content['roots'][0].revision, '10.11 15A284');
110             assert.equal(content['roots'][1].id, 93116);
111             assert.equal(content['roots'][1].repository, '11');
112             assert.equal(content['roots'][1].revision, '191622');
113             assert.equal(content['roots'][2].id, 96336);
114             assert.equal(content['roots'][2].repository, '11');
115             assert.equal(content['roots'][2].revision, '192736');
116
117             assert.equal(content['buildRequests'].length, 4);
118             assert.deepEqual(content['buildRequests'][0].id, 700);
119             assert.deepEqual(content['buildRequests'][0].order, 0);
120             assert.deepEqual(content['buildRequests'][0].platform, '65');
121             assert.deepEqual(content['buildRequests'][0].rootSet, 401);
122             assert.deepEqual(content['buildRequests'][0].status, 'pending');
123             assert.deepEqual(content['buildRequests'][0].test, '200');
124
125             assert.deepEqual(content['buildRequests'][1].id, 701);
126             assert.deepEqual(content['buildRequests'][1].order, 1);
127             assert.deepEqual(content['buildRequests'][1].platform, '65');
128             assert.deepEqual(content['buildRequests'][1].rootSet, 402);
129             assert.deepEqual(content['buildRequests'][1].status, 'pending');
130             assert.deepEqual(content['buildRequests'][1].test, '200');
131
132             assert.deepEqual(content['buildRequests'][2].id, 702);
133             assert.deepEqual(content['buildRequests'][2].order, 2);
134             assert.deepEqual(content['buildRequests'][2].platform, '65');
135             assert.deepEqual(content['buildRequests'][2].rootSet, 401);
136             assert.deepEqual(content['buildRequests'][2].status, 'pending');
137             assert.deepEqual(content['buildRequests'][2].test, '200');
138
139             assert.deepEqual(content['buildRequests'][3].id, 703);
140             assert.deepEqual(content['buildRequests'][3].order, 3);
141             assert.deepEqual(content['buildRequests'][3].platform, '65');
142             assert.deepEqual(content['buildRequests'][3].rootSet, 402);
143             assert.deepEqual(content['buildRequests'][3].status, 'pending');
144             assert.deepEqual(content['buildRequests'][3].test, '200');
145             done();
146         }).catch(done);
147     });
148
149     it('should support useLegacyIdResolution option', function (done) {
150         let db = TestServer.database();
151         db.connect().then(function () {
152             return addMockData(db);
153         }).then(function () {
154             return TestServer.remoteAPI().getJSONWithStatus('/api/build-requests/build-webkit?useLegacyIdResolution=true');
155         }).then(function (content) {
156             assert.deepEqual(Object.keys(content).sort(), ['buildRequests', 'rootSets', 'roots', 'status']);
157
158             assert.equal(content['rootSets'].length, 2);
159             assert.equal(content['rootSets'][0].id, 401);
160             assert.deepEqual(content['rootSets'][0].roots, ['87832', '93116']);
161             assert.equal(content['rootSets'][1].id, 402);
162             assert.deepEqual(content['rootSets'][1].roots, ['87832', '96336']);
163
164             assert.equal(content['roots'].length, 3);
165             assert.equal(content['roots'][0].id, 87832);
166             assert.equal(content['roots'][0].repository, 'OS X');
167             assert.equal(content['roots'][0].revision, '10.11 15A284');
168             assert.equal(content['roots'][1].id, 93116);
169             assert.equal(content['roots'][1].repository, 'WebKit');
170             assert.equal(content['roots'][1].revision, '191622');
171             assert.equal(content['roots'][2].id, 96336);
172             assert.equal(content['roots'][2].repository, 'WebKit');
173             assert.equal(content['roots'][2].revision, '192736');
174
175             assert.equal(content['buildRequests'].length, 4);
176             assert.deepEqual(content['buildRequests'][0].id, 700);
177             assert.deepEqual(content['buildRequests'][0].order, 0);
178             assert.deepEqual(content['buildRequests'][0].platform, 'some platform');
179             assert.deepEqual(content['buildRequests'][0].rootSet, 401);
180             assert.deepEqual(content['buildRequests'][0].status, 'pending');
181             assert.deepEqual(content['buildRequests'][0].test, ['some test']);
182
183             assert.deepEqual(content['buildRequests'][1].id, 701);
184             assert.deepEqual(content['buildRequests'][1].order, 1);
185             assert.deepEqual(content['buildRequests'][1].platform, 'some platform');
186             assert.deepEqual(content['buildRequests'][1].rootSet, 402);
187             assert.deepEqual(content['buildRequests'][1].status, 'pending');
188             assert.deepEqual(content['buildRequests'][1].test, ['some test']);
189
190             assert.deepEqual(content['buildRequests'][2].id, 702);
191             assert.deepEqual(content['buildRequests'][2].order, 2);
192             assert.deepEqual(content['buildRequests'][2].platform, 'some platform');
193             assert.deepEqual(content['buildRequests'][2].rootSet, 401);
194             assert.deepEqual(content['buildRequests'][2].status, 'pending');
195             assert.deepEqual(content['buildRequests'][2].test, ['some test']);
196
197             assert.deepEqual(content['buildRequests'][3].id, 703);
198             assert.deepEqual(content['buildRequests'][3].order, 3);
199             assert.deepEqual(content['buildRequests'][3].platform, 'some platform');
200             assert.deepEqual(content['buildRequests'][3].rootSet, 402);
201             assert.deepEqual(content['buildRequests'][3].status, 'pending');
202             assert.deepEqual(content['buildRequests'][3].test, ['some test']);
203             done();
204         }).catch(done);
205     });
206
207     it('should be fetchable by BuildRequest.fetchForTriggerable', function (done) {
208         let db = TestServer.database();
209         db.connect().then(function () {
210             return addMockData(db);
211         }).then(function () {
212             return Manifest.fetch();
213         }).then(function () {
214             return BuildRequest.fetchForTriggerable('build-webkit');
215         }).then(function (buildRequests) {
216             assert.equal(buildRequests.length, 4);
217
218             assert.equal(buildRequests[0].id(), 700);
219             assert.equal(buildRequests[0].order(), 0);
220             assert.ok(buildRequests[0].rootSet() instanceof RootSet);
221             assert.ok(!buildRequests[0].hasFinished());
222             assert.ok(!buildRequests[0].hasStarted());
223             assert.ok(buildRequests[0].isPending());
224             assert.equal(buildRequests[0].statusLabel(), 'Waiting to be scheduled');
225
226             assert.equal(buildRequests[1].id(), 701);
227             assert.equal(buildRequests[1].order(), 1);
228             assert.ok(buildRequests[1].rootSet() instanceof RootSet);
229             assert.ok(!buildRequests[1].hasFinished());
230             assert.ok(!buildRequests[1].hasStarted());
231             assert.ok(buildRequests[1].isPending());
232             assert.equal(buildRequests[1].statusLabel(), 'Waiting to be scheduled');
233
234             assert.equal(buildRequests[2].id(), 702);
235             assert.equal(buildRequests[2].order(), 2);
236             assert.ok(buildRequests[2].rootSet() instanceof RootSet);
237             assert.ok(!buildRequests[2].hasFinished());
238             assert.ok(!buildRequests[2].hasStarted());
239             assert.ok(buildRequests[2].isPending());
240             assert.equal(buildRequests[2].statusLabel(), 'Waiting to be scheduled');
241
242             assert.equal(buildRequests[3].id(), 703);
243             assert.equal(buildRequests[3].order(), 3);
244             assert.ok(buildRequests[3].rootSet() instanceof RootSet);
245             assert.ok(!buildRequests[3].hasFinished());
246             assert.ok(!buildRequests[3].hasStarted());
247             assert.ok(buildRequests[3].isPending());
248             assert.equal(buildRequests[3].statusLabel(), 'Waiting to be scheduled');
249
250             let osx = Repository.findById(9);
251             assert.equal(osx.name(), 'OS X');
252
253             let webkit = Repository.findById(11);
254             assert.equal(webkit.name(), 'WebKit');
255
256             let firstRootSet = buildRequests[0].rootSet();
257             assert.equal(buildRequests[2].rootSet(), firstRootSet);
258
259             let secondRootSet = buildRequests[1].rootSet();
260             assert.equal(buildRequests[3].rootSet(), secondRootSet);
261
262             assert.equal(firstRootSet.revisionForRepository(osx), '10.11 15A284');
263             assert.equal(firstRootSet.revisionForRepository(webkit), '191622');
264
265             assert.equal(secondRootSet.revisionForRepository(osx), '10.11 15A284');
266             assert.equal(secondRootSet.revisionForRepository(webkit), '192736');
267
268             let osxCommit = firstRootSet.commitForRepository(osx);
269             assert.equal(osxCommit.revision(), '10.11 15A284');
270             assert.equal(osxCommit, secondRootSet.commitForRepository(osx));
271
272             let firstWebKitCommit = firstRootSet.commitForRepository(webkit);
273             assert.equal(firstWebKitCommit.revision(), '191622');
274             assert.equal(+firstWebKitCommit.time(), 1445945816878);
275
276             let secondWebKitCommit = secondRootSet.commitForRepository(webkit);
277             assert.equal(secondWebKitCommit.revision(), '192736');
278             assert.equal(+secondWebKitCommit.time(), 1448225325650);
279
280             done();
281         }).catch(done);
282     });
283
284     it('should not include a build request if all requests in the same group had been completed', function (done) {
285         let db = TestServer.database();
286         db.connect().then(function () {
287             return addMockData(db, ['completed', 'completed', 'completed', 'completed']);
288         }).then(function () {
289             return Manifest.fetch();
290         }).then(function () {
291             return BuildRequest.fetchForTriggerable('build-webkit');
292         }).then(function (buildRequests) {
293             assert.equal(buildRequests.length, 0);
294             done();
295         }).catch(done);
296     });
297
298     it('should not include a build request if all requests in the same group had been failed or cancled', function (done) {
299         let db = TestServer.database();
300         db.connect().then(function () {
301             return addMockData(db, ['failed', 'failed', 'canceled', 'canceled']);
302         }).then(function () {
303             return Manifest.fetch();
304         }).then(function () {
305             return BuildRequest.fetchForTriggerable('build-webkit');
306         }).then(function (buildRequests) {
307             assert.equal(buildRequests.length, 0);
308             done();
309         }).catch(done);
310     });
311
312     it('should include all build requests of a test group if one of the reqeusts in the group had not been finished', function (done) {
313         let db = TestServer.database();
314         db.connect().then(function () {
315             return addMockData(db, ['completed', 'completed', 'scheduled', 'pending']);
316         }).then(function () {
317             return Manifest.fetch();
318         }).then(function () {
319             return BuildRequest.fetchForTriggerable('build-webkit');
320         }).then(function (buildRequests) {
321             assert.equal(buildRequests.length, 4);
322             assert.ok(buildRequests[0].hasFinished());
323             assert.ok(buildRequests[0].hasStarted());
324             assert.ok(!buildRequests[0].isPending());
325             assert.ok(buildRequests[1].hasFinished());
326             assert.ok(buildRequests[1].hasStarted());
327             assert.ok(!buildRequests[1].isPending());
328             assert.ok(!buildRequests[2].hasFinished());
329             assert.ok(buildRequests[2].hasStarted());
330             assert.ok(!buildRequests[2].isPending());
331             assert.ok(!buildRequests[3].hasFinished());
332             assert.ok(!buildRequests[3].hasStarted());
333             assert.ok(buildRequests[3].isPending());
334             done();
335         }).catch(done);
336     });
337
338     it('should include all build requests of a test group if one of the reqeusts in the group is still running', function (done) {
339         let db = TestServer.database();
340         db.connect().then(function () {
341             return addMockData(db, ['completed', 'completed', 'completed', 'running']);
342         }).then(function () {
343             return Manifest.fetch();
344         }).then(function () {
345             return BuildRequest.fetchForTriggerable('build-webkit');
346         }).then(function (buildRequests) {
347             assert.equal(buildRequests.length, 4);
348             assert.ok(buildRequests[0].hasFinished());
349             assert.ok(buildRequests[0].hasStarted());
350             assert.ok(!buildRequests[0].isPending());
351             assert.ok(buildRequests[1].hasFinished());
352             assert.ok(buildRequests[1].hasStarted());
353             assert.ok(!buildRequests[1].isPending());
354             assert.ok(buildRequests[2].hasFinished());
355             assert.ok(buildRequests[2].hasStarted());
356             assert.ok(!buildRequests[2].isPending());
357             assert.ok(!buildRequests[3].hasFinished());
358             assert.ok(buildRequests[3].hasStarted());
359             assert.ok(!buildRequests[3].isPending());
360             done();
361         }).catch(done);
362     });
363
364     it('should order build requests based on test group and order', function (done) {
365         let db = TestServer.database();
366         db.connect().then(function () {
367             return Promise.all([addMockData(db), addAnotherMockTestGroup(db)])
368         }).then(function () {
369             return Manifest.fetch();
370         }).then(function () {
371             return BuildRequest.fetchForTriggerable('build-webkit');
372         }).then(function (buildRequests) {
373             assert.equal(buildRequests.length, 8);
374             assert.equal(buildRequests[0].id(), 710);
375             assert.equal(buildRequests[0].testGroupId(), 599);
376             assert.equal(buildRequests[1].id(), 711);
377             assert.equal(buildRequests[1].testGroupId(), 599);
378             assert.equal(buildRequests[2].id(), 712);
379             assert.equal(buildRequests[2].testGroupId(), 599);
380             assert.equal(buildRequests[3].id(), 713);
381             assert.equal(buildRequests[3].testGroupId(), 599);
382             done();
383         }).catch(done);
384     });
385
386 });