'use strict';

const assert = require('assert');

const OSBuildFetcher = require('../tools/js/os-build-fetcher.js').OSBuildFetcher;
const MockRemoteAPI = require('../unit-tests/resources/mock-remote-api.js').MockRemoteAPI;
const TestServer = require('./resources/test-server.js');
const addSlaveForReport = require('./resources/common-operations.js').addSlaveForReport;
const prepareServerTest = require('./resources/common-operations.js').prepareServerTest;
const MockSubprocess = require('./resources/mock-subprocess.js').MockSubprocess;
const MockLogger = require('./resources/mock-logger.js').MockLogger;


describe('OSBuildFetcher', function() {
    this.timeout(5000);
    TestServer.inject('node');

    beforeEach(function () {
        MockRemoteAPI.reset('http://build.webkit.org');
        MockSubprocess.reset();
    });

    const emptyReport = {
        'slaveName': 'someSlave',
        'slavePassword': 'somePassword',
    };

    const slaveAuth = {
        'name': 'someSlave',
        'password': 'somePassword'
    };

    const ownedCommitWithWebKit = {
        'WebKit': {'revision': '141978'}
    };

    const anotherownedCommitWithWebKit = {
        'WebKit': {'revision': '141999'}
    };

    const anotherownedCommitWithWebKitAndJavaScriptCore = {
        'WebKit': {'revision': '142000'},
        'JavaScriptCore': {'revision': '142000'}
    };

    const osxCommit = {
        'repository': 'OSX',
        'revision': 'Sierra16D32',
        'order': 1603003200
    };

    const anotherOSXCommit = {
        'repository': 'OSX',
        'revision': 'Sierra16E32',
        'order': 1603003200
    };


    const config = {
        'name': 'OSX',
        'customCommands': [
            {
                'command': ['list', 'all osx 16Dxx builds'],
                'ownedCommitCommand': ['list', 'ownedCommit', 'for', 'revision'],
                'linesToIgnore': '^\\.*$',
                'minRevision': 'Sierra16D0',
                'maxRevision': 'Sierra16D999'
            },
            {
                'command': ['list', 'all osx 16Exx builds'],
                'ownedCommitCommand': ['list', 'ownedCommit', 'for', 'revision'],
                'linesToIgnore': '^\\.*$',
                'minRevision': 'Sierra16E0',
                'maxRevision': 'Sierra16E999'
            }
        ]
    };


    const configWithoutOwnedCommitCommand = {
        'name': 'OSX',
        'customCommands': [
            {
                'command': ['list', 'all osx 16Dxx builds'],
                'linesToIgnore': '^\\.*$',
                'minRevision': 'Sierra16D0',
                'maxRevision': 'Sierra16D999'
            },
            {
                'command': ['list', 'all osx 16Exx builds'],
                'linesToIgnore': '^\\.*$',
                'minRevision': 'Sierra16E0',
                'maxRevision': 'Sierra16E999'
            }
        ]
    };

    const configTrackingOneOS = {
        'name': 'OSX',
        'customCommands': [
            {
                'command': ['list', 'all osx 16Dxx builds'],
                'linesToIgnore': '^\\.*$',
                'minRevision': 'Sierra16D100',
                'maxRevision': 'Sierra16D999'
            }
        ]
    };

    describe('OSBuilderFetcher._computeOrder', () => {
        it('should calculate the right order for a given valid revision', () => {
            const fetcher = new OSBuildFetcher({});
            assert.equal(fetcher._computeOrder('Sierra16D32'), 1603003200);
            assert.equal(fetcher._computeOrder('16D321'), 1603032100);
            assert.equal(fetcher._computeOrder('16d321'), 1603032100);
            assert.equal(fetcher._computeOrder('16D321z'), 1603032126);
            assert.equal(fetcher._computeOrder('16d321Z'), 1603032126);
            assert.equal(fetcher._computeOrder('10.12.3 16D32'), 1603003200);
            assert.equal(fetcher._computeOrder('10.12.3 Sierra16D32'), 1603003200);
        });

        it('should throw assertion error when given a invalid revision', () => {
            const fetcher = new OSBuildFetcher({});
            assert.throws(() => fetcher._computeOrder('invalid'), 'AssertionError [ERR_ASSERTION]');
            assert.throws(() => fetcher._computeOrder(''), 'AssertionError [ERR_ASSERTION]');
            assert.throws(() => fetcher._computeOrder('16'), 'AssertionError [ERR_ASSERTION]');
            assert.throws(() => fetcher._computeOrder('16D'), 'AssertionError [ERR_ASSERTION]');
            assert.throws(() => fetcher._computeOrder('123'), 'AssertionError [ERR_ASSERTION]');
            assert.throws(() => fetcher._computeOrder('D123'), 'AssertionError [ERR_ASSERTION]');
            assert.throws(() => fetcher._computeOrder('123z'), 'AssertionError [ERR_ASSERTION]');
            assert.throws(() => fetcher._computeOrder('16[163'), 'AssertionError [ERR_ASSERTION]');
            assert.throws(() => fetcher._computeOrder('16D163['), 'AssertionError [ERR_ASSERTION]');
        })
    });

    describe('OSBuilderFetcher._commitsForAvailableBuilds', () => {
        it('should compatible with command output only contains lines of revision', async () => {
            const logger = new MockLogger;
            const fetcher = new OSBuildFetcher({}, null, null, MockSubprocess, logger);
            const waitForInvocationPromise = MockSubprocess.waitForInvocation();
            const fetchCommitsPromise = fetcher._commitsForAvailableBuilds(['list', 'build1'], '^\\.*$');

            await waitForInvocationPromise;
            assert.equal(MockSubprocess.invocations.length, 1);
            assert.deepEqual(MockSubprocess.invocations[0].command, ['list', 'build1']);

            const expectedResults = {allRevisions: ["16D321", "16E321z", "16F321"], commitsWithTestability: {}};
            await MockSubprocess.invocations[0].resolve('16D321\n16E321z\n\n16F321');
            const buildInfo = await fetchCommitsPromise;
            assert.deepEqual(expectedResults, buildInfo);
        });

        it('should parse the command output as JSON format', async () => {
            const logger = new MockLogger;
            const fetcher = new OSBuildFetcher({}, null, null, MockSubprocess, logger);
            const waitForInvocationPromise = MockSubprocess.waitForInvocation();
            const fetchCommitsPromise = fetcher._commitsForAvailableBuilds(['list', 'build1']);

            await waitForInvocationPromise;
            assert.equal(MockSubprocess.invocations.length, 1);
            assert.deepEqual(MockSubprocess.invocations[0].command, ['list', 'build1']);

            const outputObject = {allRevisions: ["16D321", "16E321z", "16F321"], commitsWithTestability: {"16D321": "Panic"}};
            await MockSubprocess.invocations[0].resolve(JSON.stringify(outputObject));
            const buildInfo = await fetchCommitsPromise;
            assert.deepEqual(outputObject, buildInfo);
        });
    });


    describe('OSBuilderFetcher._commitsWithinRange', () => {
        it('should only return commits whose orders are higher than specified order', async () => {
            const logger = new MockLogger;
            const fetcher = new OSBuildFetcher({}, null, null, MockSubprocess, logger);
            const results = fetcher._commitsWithinRange(["16D321", "16E321z", "16F321"], "OSX", 1604000000, 1606000000);
            assert.equal(results.length, 2);
            assert.deepEqual(results[0], {repository: 'OSX', order: 1604032126, revision: '16E321z'});
            assert.deepEqual(results[1], {repository: 'OSX', order: 1605032100, revision: '16F321'});

        });

        it('should only return commits whose orders are higher than minOrder and lower than the maxOrder', async () => {
            const logger = new MockLogger;
            const fetcher = new OSBuildFetcher({}, null, null, MockSubprocess, logger);
            const results = fetcher._commitsWithinRange(["16D321", "16E321z", "16F321"], "OSX", 1604000000, 1605000000);
            assert.equal(results.length, 1);
            assert.deepEqual(results[0], {repository: 'OSX', order: 1604032126, revision: '16E321z'});
        });
    });

    describe('OSBuildFetcher._addOwnedCommitsForBuild', () => {
        it('should add owned-commit info for commits', () => {
            const logger = new MockLogger;
            const fetcher = new OSBuildFetcher({}, null, null, MockSubprocess, logger);
            const waitForInvocationPromise = MockSubprocess.waitForInvocation();
            const addownedCommitPromise = fetcher._addOwnedCommitsForBuild([osxCommit, anotherOSXCommit], ['ownedCommit', 'for', 'revision']);

            return waitForInvocationPromise.then(() => {
                assert.equal(MockSubprocess.invocations.length, 1);
                assert.deepEqual(MockSubprocess.invocations[0].command, ['ownedCommit', 'for', 'revision', 'Sierra16D32']);
                MockSubprocess.invocations[0].resolve(JSON.stringify(ownedCommitWithWebKit));
                MockSubprocess.reset();
                return MockSubprocess.waitForInvocation();
            }).then(() => {
                assert.equal(MockSubprocess.invocations.length, 1);
                assert.deepEqual(MockSubprocess.invocations[0].command, ['ownedCommit', 'for', 'revision', 'Sierra16E32']);
                MockSubprocess.invocations[0].resolve(JSON.stringify(anotherownedCommitWithWebKit));
                return addownedCommitPromise;
            }).then((results) => {
                assert.equal(results.length, 2);
                assert.equal(results[0]['repository'], osxCommit['repository']);
                assert.equal(results[0]['revision'], osxCommit['revision']);
                assert.deepEqual(results[0]['ownedCommits'], ownedCommitWithWebKit);
                assert.equal(results[1]['repository'], anotherOSXCommit['repository']);
                assert.equal(results[1]['revision'], anotherOSXCommit['revision']);
                assert.deepEqual(results[1]['ownedCommits'], anotherownedCommitWithWebKit);
            });
        });

        it('should fail if the command to get owned-commit info fails', () => {
            const logger = new MockLogger;
            const fetcher = new OSBuildFetcher({}, null, null, MockSubprocess, logger);
            const waitForInvocationPromise = MockSubprocess.waitForInvocation();
            const addownedCommitPromise = fetcher._addOwnedCommitsForBuild([osxCommit], ['ownedCommit', 'for', 'revision'])

            return waitForInvocationPromise.then(() => {
                assert.equal(MockSubprocess.invocations.length, 1);
                assert.deepEqual(MockSubprocess.invocations[0].command, ['ownedCommit', 'for', 'revision', 'Sierra16D32']);
                MockSubprocess.invocations[0].reject('Failed getting owned-commit');

                return addownedCommitPromise.then(() => {
                    assert(false, 'should never be reached');
                }, (error_output) => {
                    assert(error_output);
                    assert.equal(error_output, 'Failed getting owned-commit');
                });
            });
        });


        it('should fail if entries in owned-commits does not contain revision', () => {
            const logger = new MockLogger;
            const fetcher = new OSBuildFetcher({}, null, null, MockSubprocess, logger);
            const waitForInvocationPromise = MockSubprocess.waitForInvocation();
            const addownedCommitPromise = fetcher._addOwnedCommitsForBuild([osxCommit], ['ownedCommit', 'for', 'revision'])

            return waitForInvocationPromise.then(() => {
                assert.equal(MockSubprocess.invocations.length, 1);
                assert.deepEqual(MockSubprocess.invocations[0].command, ['ownedCommit', 'for', 'revision', 'Sierra16D32']);
                MockSubprocess.invocations[0].resolve('{"WebKit":{"RandomKey": "RandomValue"}}');

                return addownedCommitPromise.then(() => {
                    assert(false, 'should never be reached');
                }, (error_output) => {
                    assert(error_output);
                    assert.equal(error_output.name, 'AssertionError [ERR_ASSERTION]');
                });
            });
        })
    });

    describe('OSBuildFetcher.fetchReportAndUpdateBuilds', () => {
        const invocations = MockSubprocess.invocations;

        beforeEach(function () {
            TestServer.database().connect({keepAlive: true});
        });

        afterEach(function () {
            TestServer.database().disconnect();
        });

        it('should be backward compatible and report all build commits with owned-commits', () => {
            const logger = new MockLogger;
            const fetcher = new OSBuildFetcher(config, TestServer.remoteAPI(), slaveAuth, MockSubprocess, logger);
            const db = TestServer.database();

            let fetchReportAndUpdateBuildsPromise = null;
            let fetchAvailableBuildsPromise = null;

            return addSlaveForReport(emptyReport).then(() => {
                return Promise.all([
                    db.insert('repositories', {'id': 10, 'name': 'OSX'}),
                    db.insert('commits', {'repository': 10, 'revision': 'Sierra16D67', 'order': 1603006700, 'reported': true}),
                    db.insert('commits', {'repository': 10, 'revision': 'Sierra16D68', 'order': 1603006800, 'reported': true}),
                    db.insert('commits', {'repository': 10, 'revision': 'Sierra16D69', 'order': 1603006900, 'reported': false}),
                    db.insert('commits', {'repository': 10, 'revision': 'Sierra16E32', 'order': 1604003200, 'reported': true}),
                    db.insert('commits', {'repository': 10, 'revision': 'Sierra16E33', 'order': 1604003300, 'reported': true}),
                    db.insert('commits', {'repository': 10, 'revision': 'Sierra16E33g', 'order': 1604003307, 'reported': true})]);
            }).then(() => {
                return TestServer.remoteAPI().getJSON('/api/commits/OSX/last-reported?from=1603000000&to=1603099900');
            }).then((result) => {
                assert.equal(result['commits'].length, 1);
                assert.equal(result['commits'][0]['revision'], 'Sierra16D68');
                assert.equal(result['commits'][0]['order'], 1603006800);
                return TestServer.remoteAPI().getJSON('/api/commits/OSX/last-reported?from=1604000000&to=1604099900');
            }).then((result) => {
                assert.equal(result['commits'].length, 1);
                assert.equal(result['commits'][0]['revision'], 'Sierra16E33g');
                assert.equal(result['commits'][0]['order'], 1604003307);
                const waitForInvocationPromise = MockSubprocess.waitForInvocation();
                fetchAvailableBuildsPromise = fetcher._fetchAvailableBuilds();
                return waitForInvocationPromise;
            }).then(() => {
                assert.equal(invocations.length, 1);
                assert.deepEqual(invocations[0].command, ['list', 'all osx 16Dxx builds']);
                invocations[0].resolve('\n\nSierra16D68\nSierra16D69\n');
                return MockSubprocess.resetAndWaitForInvocation();
            }).then(() => {
                assert.equal(invocations.length, 1);
                assert.deepEqual(invocations[0].command, ['list', 'ownedCommit', 'for', 'revision', 'Sierra16D69']);
                invocations[0].resolve(JSON.stringify(ownedCommitWithWebKit));
                return MockSubprocess.resetAndWaitForInvocation();
            }).then(() => {
                assert.equal(invocations.length, 1);
                assert.deepEqual(invocations[0].command, ['list', 'all osx 16Exx builds']);
                invocations[0].resolve('\n\nSierra16E32\nSierra16E33\nSierra16E33h\nSierra16E34');
                return MockSubprocess.resetAndWaitForInvocation();
            }).then(() => {
                assert.equal(invocations.length, 1);
                assert.deepEqual(invocations[0].command, ['list', 'ownedCommit', 'for', 'revision', 'Sierra16E33h']);
                invocations[0].resolve(JSON.stringify(anotherownedCommitWithWebKit));
                return MockSubprocess.resetAndWaitForInvocation();
            }).then(() => {
                assert.equal(invocations.length, 1);
                assert.deepEqual(invocations[0].command, ['list', 'ownedCommit', 'for', 'revision', 'Sierra16E34']);
                invocations[0].resolve(JSON.stringify(anotherownedCommitWithWebKitAndJavaScriptCore));
                return fetchAvailableBuildsPromise;
            }).then(() => {
                MockSubprocess.reset();
                fetchReportAndUpdateBuildsPromise = fetcher.fetchReportAndUpdateBuilds();
                return MockSubprocess.waitForInvocation();
            }).then(() => {
                assert.equal(invocations.length, 1);
                assert.deepEqual(invocations[0].command, ['list', 'all osx 16Dxx builds']);
                invocations[0].resolve('\n\nSierra16D68\nSierra16D69\n');
                return MockSubprocess.resetAndWaitForInvocation();
            }).then(() => {
                assert.equal(invocations.length, 1);
                assert.deepEqual(invocations[0].command, ['list', 'ownedCommit', 'for', 'revision', 'Sierra16D69']);
                invocations[0].resolve(JSON.stringify(ownedCommitWithWebKit));
                return MockSubprocess.resetAndWaitForInvocation();
            }).then(() => {
                assert.equal(invocations.length, 1);
                assert.deepEqual(invocations[0].command, ['list', 'all osx 16Exx builds']);
                invocations[0].resolve('\n\nSierra16E32\nSierra16E33\nSierra16E33h\nSierra16E34');
                return MockSubprocess.resetAndWaitForInvocation();
            }).then(() => {
                assert.equal(invocations.length, 1);
                assert.deepEqual(invocations[0].command, ['list', 'ownedCommit', 'for', 'revision', 'Sierra16E33h']);
                invocations[0].resolve(JSON.stringify(anotherownedCommitWithWebKit));
                return MockSubprocess.resetAndWaitForInvocation();
            }).then(() => {
                assert.equal(invocations.length, 1);
                invocations[0].resolve(JSON.stringify(anotherownedCommitWithWebKitAndJavaScriptCore));
                assert.deepEqual(invocations[0].command, ['list', 'ownedCommit', 'for', 'revision', 'Sierra16E34']);

                return fetchReportAndUpdateBuildsPromise;
            }).then(() => {
                return Promise.all([
                    db.selectRows('repositories', {'name': 'WebKit'}),
                    db.selectRows('repositories', {'name': 'JavaScriptCore'}),
                    db.selectRows('commits', {'revision': 'Sierra16D69'}),
                    db.selectRows('commits', {'revision': 'Sierra16E33h'}),
                    db.selectRows('commits', {'revision': 'Sierra16E34'})]);
            }).then((results) => {
                const webkitRepository = results[0];
                const jscRepository = results[1];
                const osxCommit16D69 = results[2];
                const osxCommit16E33h = results[3];
                const osxCommit16E34 = results[4];

                assert.equal(webkitRepository.length, 1);
                assert.equal(webkitRepository[0]['owner'], 10);
                assert.equal(jscRepository.length, 1);
                assert.equal(jscRepository[0]['owner'], 10);

                assert.equal(osxCommit16D69.length, 1);
                assert.equal(osxCommit16D69[0]['repository'], 10);
                assert.equal(osxCommit16D69[0]['order'], 1603006900);

                assert.equal(osxCommit16E33h.length, 1);
                assert.equal(osxCommit16E33h[0]['repository'], 10);
                assert.equal(osxCommit16E33h[0]['order'], 1604003308);

                assert.equal(osxCommit16E34.length, 1);
                assert.equal(osxCommit16E34[0]['repository'], 10);
                assert.equal(osxCommit16E34[0]['order'], 1604003400);

                return TestServer.remoteAPI().getJSON('/api/commits/OSX/last-reported?from=1603000000&to=1603099900');
            }).then((result) => {
                assert.equal(result['commits'].length, 1);
                assert.equal(result['commits'][0]['revision'], 'Sierra16D69');
                assert.equal(result['commits'][0]['order'], 1603006900);

                return TestServer.remoteAPI().getJSON('/api/commits/OSX/last-reported?from=1604000000&to=1604099900');
            }).then((result) => {
                assert.equal(result['commits'].length, 1);
                assert.equal(result['commits'][0]['revision'], 'Sierra16E34');
                assert.equal(result['commits'][0]['order'], 1604003400);
            });
        });

        it('should report all build commits with owned-commits', () => {
            const logger = new MockLogger;
            const fetcher = new OSBuildFetcher(config, TestServer.remoteAPI(), slaveAuth, MockSubprocess, logger);
            const db = TestServer.database();
            const resultsForSierraD = {allRevisions: ["Sierra16D68", "Sierra16D69"], commitsWithTestability: {}};
            const resultsForSierraE = {allRevisions: ["Sierra16E32", "Sierra16E33", "Sierra16E33h", "Sierra16E34"], commitsWithTestability: {}};

            let fetchReportAndUpdateBuildsPromise = null;
            let fetchAvailableBuildsPromise = null;

            return addSlaveForReport(emptyReport).then(() => {
                return Promise.all([
                    db.insert('repositories', {'id': 10, 'name': 'OSX'}),
                    db.insert('commits', {'repository': 10, 'revision': 'Sierra16D67', 'order': 1603006700, 'reported': true}),
                    db.insert('commits', {'repository': 10, 'revision': 'Sierra16D68', 'order': 1603006800, 'reported': true}),
                    db.insert('commits', {'repository': 10, 'revision': 'Sierra16D69', 'order': 1603006900, 'reported': false}),
                    db.insert('commits', {'repository': 10, 'revision': 'Sierra16E32', 'order': 1604003200, 'reported': true}),
                    db.insert('commits', {'repository': 10, 'revision': 'Sierra16E33', 'order': 1604003300, 'reported': true}),
                    db.insert('commits', {'repository': 10, 'revision': 'Sierra16E33g', 'order': 1604003307, 'reported': true})]);
            }).then(() => {
                return TestServer.remoteAPI().getJSON('/api/commits/OSX/last-reported?from=1603000000&to=1603099900');
            }).then((result) => {
                assert.equal(result['commits'].length, 1);
                assert.equal(result['commits'][0]['revision'], 'Sierra16D68');
                assert.equal(result['commits'][0]['order'], 1603006800);
                return TestServer.remoteAPI().getJSON('/api/commits/OSX/last-reported?from=1604000000&to=1604099900');
            }).then((result) => {
                assert.equal(result['commits'].length, 1);
                assert.equal(result['commits'][0]['revision'], 'Sierra16E33g');
                assert.equal(result['commits'][0]['order'], 1604003307);
                const waitForInvocationPromise = MockSubprocess.waitForInvocation();
                fetchAvailableBuildsPromise = fetcher._fetchAvailableBuilds();
                return waitForInvocationPromise;
            }).then(() => {
                assert.equal(invocations.length, 1);
                assert.deepEqual(invocations[0].command, ['list', 'all osx 16Dxx builds']);
                invocations[0].resolve(JSON.stringify(resultsForSierraD));
                return MockSubprocess.resetAndWaitForInvocation();
            }).then(() => {
                assert.equal(invocations.length, 1);
                assert.deepEqual(invocations[0].command, ['list', 'ownedCommit', 'for', 'revision', 'Sierra16D69']);
                invocations[0].resolve(JSON.stringify(ownedCommitWithWebKit));
                return MockSubprocess.resetAndWaitForInvocation();
            }).then(() => {
                assert.equal(invocations.length, 1);
                assert.deepEqual(invocations[0].command, ['list', 'all osx 16Exx builds']);
                invocations[0].resolve(JSON.stringify(resultsForSierraE));
                return MockSubprocess.resetAndWaitForInvocation();
            }).then(() => {
                assert.equal(invocations.length, 1);
                assert.deepEqual(invocations[0].command, ['list', 'ownedCommit', 'for', 'revision', 'Sierra16E33h']);
                invocations[0].resolve(JSON.stringify(anotherownedCommitWithWebKit));
                return MockSubprocess.resetAndWaitForInvocation();
            }).then(() => {
                assert.equal(invocations.length, 1);
                assert.deepEqual(invocations[0].command, ['list', 'ownedCommit', 'for', 'revision', 'Sierra16E34']);
                invocations[0].resolve(JSON.stringify(anotherownedCommitWithWebKitAndJavaScriptCore));
                return fetchAvailableBuildsPromise;
            }).then(() => {
                MockSubprocess.reset();
                fetchReportAndUpdateBuildsPromise = fetcher.fetchReportAndUpdateBuilds();
                return MockSubprocess.waitForInvocation();
            }).then(() => {
                assert.equal(invocations.length, 1);
                assert.deepEqual(invocations[0].command, ['list', 'all osx 16Dxx builds']);
                invocations[0].resolve(JSON.stringify(resultsForSierraD));
                return MockSubprocess.resetAndWaitForInvocation();
            }).then(() => {
                assert.equal(invocations.length, 1);
                assert.deepEqual(invocations[0].command, ['list', 'ownedCommit', 'for', 'revision', 'Sierra16D69']);
                invocations[0].resolve(JSON.stringify(ownedCommitWithWebKit));
                return MockSubprocess.resetAndWaitForInvocation();
            }).then(() => {
                assert.equal(invocations.length, 1);
                assert.deepEqual(invocations[0].command, ['list', 'all osx 16Exx builds']);
                invocations[0].resolve(JSON.stringify(resultsForSierraE));
                return MockSubprocess.resetAndWaitForInvocation();
            }).then(() => {
                assert.equal(invocations.length, 1);
                assert.deepEqual(invocations[0].command, ['list', 'ownedCommit', 'for', 'revision', 'Sierra16E33h']);
                invocations[0].resolve(JSON.stringify(anotherownedCommitWithWebKit));
                return MockSubprocess.resetAndWaitForInvocation();
            }).then(() => {
                assert.equal(invocations.length, 1);
                invocations[0].resolve(JSON.stringify(anotherownedCommitWithWebKitAndJavaScriptCore));
                assert.deepEqual(invocations[0].command, ['list', 'ownedCommit', 'for', 'revision', 'Sierra16E34']);

                return fetchReportAndUpdateBuildsPromise;
            }).then(() => {
                return Promise.all([
                    db.selectRows('repositories', {'name': 'WebKit'}),
                    db.selectRows('repositories', {'name': 'JavaScriptCore'}),
                    db.selectRows('commits', {'revision': 'Sierra16D69'}),
                    db.selectRows('commits', {'revision': 'Sierra16E33h'}),
                    db.selectRows('commits', {'revision': 'Sierra16E34'})]);
            }).then((results) => {
                const webkitRepository = results[0];
                const jscRepository = results[1];
                const osxCommit16D69 = results[2];
                const osxCommit16E33h = results[3];
                const osxCommit16E34 = results[4];

                assert.equal(webkitRepository.length, 1);
                assert.equal(webkitRepository[0]['owner'], 10);
                assert.equal(jscRepository.length, 1);
                assert.equal(jscRepository[0]['owner'], 10);

                assert.equal(osxCommit16D69.length, 1);
                assert.equal(osxCommit16D69[0]['repository'], 10);
                assert.equal(osxCommit16D69[0]['order'], 1603006900);

                assert.equal(osxCommit16E33h.length, 1);
                assert.equal(osxCommit16E33h[0]['repository'], 10);
                assert.equal(osxCommit16E33h[0]['order'], 1604003308);

                assert.equal(osxCommit16E34.length, 1);
                assert.equal(osxCommit16E34[0]['repository'], 10);
                assert.equal(osxCommit16E34[0]['order'], 1604003400);

                return TestServer.remoteAPI().getJSON('/api/commits/OSX/last-reported?from=1603000000&to=1603099900');
            }).then((result) => {
                assert.equal(result['commits'].length, 1);
                assert.equal(result['commits'][0]['revision'], 'Sierra16D69');
                assert.equal(result['commits'][0]['order'], 1603006900);

                return TestServer.remoteAPI().getJSON('/api/commits/OSX/last-reported?from=1604000000&to=1604099900');
            }).then((result) => {
                assert.equal(result['commits'].length, 1);
                assert.equal(result['commits'][0]['revision'], 'Sierra16E34');
                assert.equal(result['commits'][0]['order'], 1604003400);
            });
        });

        it('should update testability message for commits', async () => {
            const logger = new MockLogger;
            const fetcher = new OSBuildFetcher(config, TestServer.remoteAPI(), slaveAuth, MockSubprocess, logger);
            const db = TestServer.database();
            const resultsForSierraD = {allRevisions: ["Sierra16D68", "Sierra16D69"], commitsWithTestability: {"Sierra16D68": "Panic", "Sierra16D69": "Spin CPU"}};
            const resultsForSierraE = {allRevisions: ["Sierra16E32", "Sierra16E33", "Sierra16E33h", "Sierra16E34"], commitsWithTestability: {"Sierra16E31": "WebKit crashes"}};

            await addSlaveForReport(emptyReport);

            await Promise.all([
                db.insert('repositories', {'id': 10, 'name': 'OSX'}),
                db.insert('commits', {'repository': 10, 'revision': 'Sierra16D67', 'order': 1603006700, 'reported': true}),
                db.insert('commits', {'repository': 10, 'revision': 'Sierra16D68', 'order': 1603006800, 'reported': true}),
                db.insert('commits', {'repository': 10, 'revision': 'Sierra16D69', 'order': 1603006900, 'reported': false}),
                db.insert('commits', {'repository': 10, 'revision': 'Sierra16E31', 'order': 1604003100, 'reported': true}),
                db.insert('commits', {'repository': 10, 'revision': 'Sierra16E32', 'order': 1604003200, 'reported': true}),
                db.insert('commits', {'repository': 10, 'revision': 'Sierra16E33', 'order': 1604003300, 'reported': true}),
                db.insert('commits', {'repository': 10, 'revision': 'Sierra16E33g', 'order': 1604003307, 'reported': true})]);

            let result = await TestServer.remoteAPI().getJSON('/api/commits/OSX/last-reported?from=1603000000&to=1603099900');

            assert.equal(result['commits'].length, 1);
            assert.equal(result['commits'][0]['revision'], 'Sierra16D68');
            assert.equal(result['commits'][0]['order'], 1603006800);
            result = await TestServer.remoteAPI().getJSON('/api/commits/OSX/last-reported?from=1604000000&to=1604099900');

            assert.equal(result['commits'].length, 1);
            assert.equal(result['commits'][0]['revision'], 'Sierra16E33g');
            assert.equal(result['commits'][0]['order'], 1604003307);

            const fetchReportAndUpdatePromise = fetcher.fetchReportAndUpdateBuilds();
            await MockSubprocess.waitForInvocation();

            assert.equal(invocations.length, 1);
            assert.deepEqual(invocations[0].command, ['list', 'all osx 16Dxx builds']);
            invocations[0].resolve(JSON.stringify(resultsForSierraD));
            await MockSubprocess.resetAndWaitForInvocation();

            assert.equal(invocations.length, 1);
            assert.deepEqual(invocations[0].command, ['list', 'ownedCommit', 'for', 'revision', 'Sierra16D69']);
            invocations[0].resolve(JSON.stringify(ownedCommitWithWebKit));
            await MockSubprocess.resetAndWaitForInvocation();

            assert.equal(invocations.length, 1);
            assert.deepEqual(invocations[0].command, ['list', 'all osx 16Exx builds']);
            invocations[0].resolve(JSON.stringify(resultsForSierraE));

            await MockSubprocess.resetAndWaitForInvocation();

            assert.equal(invocations.length, 1);
            assert.deepEqual(invocations[0].command, ['list', 'ownedCommit', 'for', 'revision', 'Sierra16E33h']);
            invocations[0].resolve(JSON.stringify(anotherownedCommitWithWebKit));
            await  MockSubprocess.resetAndWaitForInvocation();
            assert.equal(invocations.length, 1);
            invocations[0].resolve(JSON.stringify(anotherownedCommitWithWebKitAndJavaScriptCore));
            assert.deepEqual(invocations[0].command, ['list', 'ownedCommit', 'for', 'revision', 'Sierra16E34']);

            await fetchReportAndUpdatePromise;

            const webkitRepository = await db.selectRows('repositories', {'name': 'WebKit'});
            const jscRepository = await db.selectRows('repositories', {'name': 'JavaScriptCore'});
            const osxCommit16D68 = await db.selectRows('commits', {'revision': 'Sierra16D68'});
            const osxCommit16D69 = await db.selectRows('commits', {'revision': 'Sierra16D69'});
            const osxCommit16E31 = await db.selectRows('commits', {'revision': 'Sierra16E31'});
            const osxCommit16E33h = await db.selectRows('commits', {'revision': 'Sierra16E33h'});
            const osxCommit16E34 = await db.selectRows('commits', {'revision': 'Sierra16E34'});

            assert.equal(webkitRepository.length, 1);
            assert.equal(webkitRepository[0]['owner'], 10);
            assert.equal(jscRepository.length, 1);
            assert.equal(jscRepository[0]['owner'], 10);

            assert.equal(osxCommit16D68.length, 1);
            assert.equal(osxCommit16D68[0]['repository'], 10);
            assert.equal(osxCommit16D68[0]['order'], 1603006800);
            assert.equal(osxCommit16D68[0]['testability'], "Panic");

            assert.equal(osxCommit16D69.length, 1);
            assert.equal(osxCommit16D69[0]['repository'], 10);
            assert.equal(osxCommit16D69[0]['order'], 1603006900);
            assert.equal(osxCommit16D69[0]['testability'], "Spin CPU");

            assert.equal(osxCommit16E31.length, 1);
            assert.equal(osxCommit16E31[0]['repository'], 10);
            assert.equal(osxCommit16E31[0]['order'], 1604003100);
            assert.equal(osxCommit16E31[0]['testability'], "WebKit crashes");

            assert.equal(osxCommit16E33h.length, 1);
            assert.equal(osxCommit16E33h[0]['repository'], 10);
            assert.equal(osxCommit16E33h[0]['order'], 1604003308);

            assert.equal(osxCommit16E34.length, 1);
            assert.equal(osxCommit16E34[0]['repository'], 10);
            assert.equal(osxCommit16E34[0]['order'], 1604003400);

            result = await TestServer.remoteAPI().getJSON('/api/commits/OSX/last-reported?from=1603000000&to=1603099900');
            assert.equal(result['commits'].length, 1);
            assert.equal(result['commits'][0]['revision'], 'Sierra16D69');
            assert.equal(result['commits'][0]['order'], 1603006900);

            result = await TestServer.remoteAPI().getJSON('/api/commits/OSX/last-reported?from=1604000000&to=1604099900');
            assert.equal(result['commits'].length, 1);
            assert.equal(result['commits'][0]['revision'], 'Sierra16E34');
            assert.equal(result['commits'][0]['order'], 1604003400);
        });

        it('should report commits without owned-commits if "ownedCommitCommand" is not specified in config', async () => {

            const logger = new MockLogger;
            const fetcher = new OSBuildFetcher(configWithoutOwnedCommitCommand, TestServer.remoteAPI(), slaveAuth, MockSubprocess, logger);
            const db = TestServer.database();
            const resultsForSierraD = {allRevisions: ["Sierra16D68", "Sierra16D69"], commitsWithTestability: {}};
            const resultsForSierraE = {allRevisions: ["Sierra16E32", "Sierra16E33", "Sierra16E33h", "Sierra16E34"], commitsWithTestability: {}};

            await addSlaveForReport(emptyReport);
            await Promise.all([
                db.insert('repositories', {'id': 10, 'name': 'OSX'}),
                db.insert('commits', {'repository': 10, 'revision': 'Sierra16D67', 'order': 1603006700, 'reported': true}),
                db.insert('commits', {'repository': 10, 'revision': 'Sierra16D68', 'order': 1603006800, 'reported': true}),
                db.insert('commits', {'repository': 10, 'revision': 'Sierra16D69', 'order': 1603006900, 'reported': false}),
                db.insert('commits', {'repository': 10, 'revision': 'Sierra16E32', 'order': 1604003200, 'reported': true}),
                db.insert('commits', {'repository': 10, 'revision': 'Sierra16E33', 'order': 1604003300, 'reported': true}),
                db.insert('commits', {'repository': 10, 'revision': 'Sierra16E33g', 'order': 1604003307, 'reported': true})]);

            let result = await TestServer.remoteAPI().getJSON('/api/commits/OSX/last-reported?from=1603000000&to=1603099900');
            assert.equal(result['commits'].length, 1);
            assert.equal(result['commits'][0]['revision'], 'Sierra16D68');
            assert.equal(result['commits'][0]['order'], 1603006800);

            result = await TestServer.remoteAPI().getJSON('/api/commits/OSX/last-reported?from=1604000000&to=1604099900');
            assert.equal(result['commits'].length, 1);
            assert.equal(result['commits'][0]['revision'], 'Sierra16E33g');
            assert.equal(result['commits'][0]['order'], 1604003307);

            const waitForInvocationPromise = MockSubprocess.waitForInvocation();
            const fetchReportAndUpdatePromise = fetcher.fetchReportAndUpdateBuilds();
            await waitForInvocationPromise;
            assert.equal(invocations.length, 1);
            assert.deepEqual(invocations[0].command, ['list', 'all osx 16Dxx builds']);
            invocations[0].resolve(JSON.stringify(resultsForSierraD));

            await MockSubprocess.resetAndWaitForInvocation();
            assert.equal(invocations.length, 1);
            assert.deepEqual(invocations[0].command, ['list', 'all osx 16Exx builds']);
            invocations[0].resolve(JSON.stringify(resultsForSierraE));

            result = await fetchReportAndUpdatePromise;
            const results = await Promise.all([
                db.selectRows('repositories', {'name': 'WebKit'}),
                db.selectRows('repositories', {'name': 'JavaScriptCore'}),
                db.selectRows('commits', {'revision': 'Sierra16D69'}),
                db.selectRows('commits', {'revision': 'Sierra16E33h'}),
                db.selectRows('commits', {'revision': 'Sierra16E34'})]);

            const webkitRepository = results[0];
            const jscRepository = results[1];
            const osxCommit16D69 = results[2];
            const osxCommit16E33h = results[3];
            const osxCommit16E34 = results[4];

            assert.equal(webkitRepository.length, 0);
            assert.equal(jscRepository.length, 0);

            assert.equal(osxCommit16D69.length, 1);
            assert.equal(osxCommit16D69[0]['repository'], 10);
            assert.equal(osxCommit16D69[0]['order'], 1603006900);

            assert.equal(osxCommit16E33h.length, 1);
            assert.equal(osxCommit16E33h[0]['repository'], 10);
            assert.equal(osxCommit16E33h[0]['order'], 1604003308);

            assert.equal(osxCommit16E34.length, 1);
            assert.equal(osxCommit16E34[0]['repository'], 10);
            assert.equal(osxCommit16E34[0]['order'], 1604003400);

            result = await TestServer.remoteAPI().getJSON('/api/commits/OSX/last-reported?from=1603000000&to=1603099900');
            assert.equal(result['commits'].length, 1);
            assert.equal(result['commits'][0]['revision'], 'Sierra16D69');
            assert.equal(result['commits'][0]['order'], 1603006900);

            result = await TestServer.remoteAPI().getJSON('/api/commits/OSX/last-reported?from=1604000000&to=1604099900');
            assert.equal(result['commits'].length, 1);
            assert.equal(result['commits'][0]['revision'], 'Sierra16E34');
            assert.equal(result['commits'][0]['order'], 1604003400);
        });

        it('should report commits within specified revision range', async () => {
            const logger = new MockLogger;
            const fetcher = new OSBuildFetcher(configWithoutOwnedCommitCommand, TestServer.remoteAPI(), slaveAuth, MockSubprocess, logger);
            const db = TestServer.database();
            const resultsForSierraD = {allRevisions: ["Sierra16D68", "Sierra16D69", "Sierra16D10000"], commitsWithTestability: {}};
            const resultsForSierraE = {allRevisions: ["Sierra16E32", "Sierra16E33", "Sierra16E33h", "Sierra16E34", "Sierra16E10000"], commitsWithTestability: {}};

            await addSlaveForReport(emptyReport);
            await Promise.all([
                db.insert('repositories', {'id': 10, 'name': 'OSX'}),
                db.insert('commits', {'repository': 10, 'revision': 'Sierra16D67', 'order': 1603006700, 'reported': true}),
                db.insert('commits', {'repository': 10, 'revision': 'Sierra16D68', 'order': 1603006800, 'reported': true}),
                db.insert('commits', {'repository': 10, 'revision': 'Sierra16D69', 'order': 1603006900, 'reported': false}),
                db.insert('commits', {'repository': 10, 'revision': 'Sierra16E32', 'order': 1604003200, 'reported': true}),
                db.insert('commits', {'repository': 10, 'revision': 'Sierra16E33', 'order': 1604003300, 'reported': true}),
                db.insert('commits', {'repository': 10, 'revision': 'Sierra16E33g', 'order': 1604003307, 'reported': true})]);

            let result = await TestServer.remoteAPI().getJSON('/api/commits/OSX/last-reported?from=1603000000&to=1603099900');
            assert.equal(result['commits'].length, 1);
            assert.equal(result['commits'][0]['revision'], 'Sierra16D68');
            assert.equal(result['commits'][0]['order'], 1603006800);

            result = await TestServer.remoteAPI().getJSON('/api/commits/OSX/last-reported?from=1604000000&to=1604099900');
            assert.equal(result['commits'].length, 1);
            assert.equal(result['commits'][0]['revision'], 'Sierra16E33g');
            assert.equal(result['commits'][0]['order'], 1604003307);
            const waitForInvocationPromise = MockSubprocess.waitForInvocation();
            const fetchReportAndUpdatePromise = fetcher.fetchReportAndUpdateBuilds();

            await waitForInvocationPromise;
            assert.equal(invocations.length, 1);
            assert.deepEqual(invocations[0].command, ['list', 'all osx 16Dxx builds']);
            invocations[0].resolve(JSON.stringify(resultsForSierraD));

            await MockSubprocess.resetAndWaitForInvocation();
            assert.equal(invocations.length, 1);
            assert.deepEqual(invocations[0].command, ['list', 'all osx 16Exx builds']);
            invocations[0].resolve(JSON.stringify(resultsForSierraE));

            result = await fetchReportAndUpdatePromise;
            const results = await Promise.all([
                db.selectRows('repositories', {'name': 'WebKit'}),
                db.selectRows('repositories', {'name': 'JavaScriptCore'}),
                db.selectRows('commits', {'revision': 'Sierra16D69'}),
                db.selectRows('commits', {'revision': 'Sierra16E33h'}),
                db.selectRows('commits', {'revision': 'Sierra16E34'})]);

            const webkitRepository = results[0];
            const jscRepository = results[1];
            const osxCommit16D69 = results[2];
            const osxCommit16E33h = results[3];
            const osxCommit16E34 = results[4];

            assert.equal(webkitRepository.length, 0);
            assert.equal(jscRepository.length, 0);

            assert.equal(osxCommit16D69.length, 1);
            assert.equal(osxCommit16D69[0]['repository'], 10);
            assert.equal(osxCommit16D69[0]['order'], 1603006900);

            assert.equal(osxCommit16E33h.length, 1);
            assert.equal(osxCommit16E33h[0]['repository'], 10);
            assert.equal(osxCommit16E33h[0]['order'], 1604003308);

            assert.equal(osxCommit16E34.length, 1);
            assert.equal(osxCommit16E34[0]['repository'], 10);
            assert.equal(osxCommit16E34[0]['order'], 1604003400);

            result = await TestServer.remoteAPI().getJSON('/api/commits/OSX/last-reported?from=1603000000&to=1603099900');
            assert.equal(result['commits'].length, 1);
            assert.equal(result['commits'][0]['revision'], 'Sierra16D69');
            assert.equal(result['commits'][0]['order'], 1603006900);

            result = await TestServer.remoteAPI().getJSON('/api/commits/OSX/last-reported?from=1604000000&to=1604099900');
            assert.equal(result['commits'].length, 1);
            assert.equal(result['commits'][0]['revision'], 'Sierra16E34');
            assert.equal(result['commits'][0]['order'], 1604003400);
        });

        it('should update commits within specified revision range', async () => {
            const logger = new MockLogger;
            const fetcher = new OSBuildFetcher(configWithoutOwnedCommitCommand, TestServer.remoteAPI(), slaveAuth, MockSubprocess, logger);
            const db = TestServer.database();
            const resultsForSierraD = {allRevisions: ["Sierra16D68", "Sierra16D69"], commitsWithTestability: {"Sierra16D10000": "Panic"}};
            const resultsForSierraE = {allRevisions: ["Sierra16E32", "Sierra16E33", "Sierra16E33h", "Sierra16E34", "Sierra16E10000"], commitsWithTestability: {}};

            await addSlaveForReport(emptyReport);
            await Promise.all([
                db.insert('repositories', {'id': 10, 'name': 'OSX'}),
                db.insert('commits', {'repository': 10, 'revision': 'Sierra16D67', 'order': 1603006700, 'reported': true}),
                db.insert('commits', {'repository': 10, 'revision': 'Sierra16D68', 'order': 1603006800, 'reported': true}),
                db.insert('commits', {'repository': 10, 'revision': 'Sierra16D69', 'order': 1603006900, 'reported': false}),
                db.insert('commits', {'repository': 10, 'revision': 'Sierra16E32', 'order': 1604003200, 'reported': true}),
                db.insert('commits', {'repository': 10, 'revision': 'Sierra16E33', 'order': 1604003300, 'reported': true}),
                db.insert('commits', {'repository': 10, 'revision': 'Sierra16E33g', 'order': 1604003307, 'reported': true})]);

            let result = await TestServer.remoteAPI().getJSON('/api/commits/OSX/last-reported?from=1603000000&to=1603099900');
            assert.equal(result['commits'].length, 1);
            assert.equal(result['commits'][0]['revision'], 'Sierra16D68');
            assert.equal(result['commits'][0]['order'], 1603006800);

            result = await TestServer.remoteAPI().getJSON('/api/commits/OSX/last-reported?from=1604000000&to=1604099900');
            assert.equal(result['commits'].length, 1);
            assert.equal(result['commits'][0]['revision'], 'Sierra16E33g');
            assert.equal(result['commits'][0]['order'], 1604003307);
            const waitForInvocationPromise = MockSubprocess.waitForInvocation();
            const fetchAvailableBuildsPromise = fetcher._fetchAvailableBuilds();

            await waitForInvocationPromise;
            assert.equal(invocations.length, 1);
            assert.deepEqual(invocations[0].command, ['list', 'all osx 16Dxx builds']);
            invocations[0].resolve(JSON.stringify(resultsForSierraD));

            await MockSubprocess.resetAndWaitForInvocation();
            assert.equal(invocations.length, 1);
            assert.deepEqual(invocations[0].command, ['list', 'all osx 16Exx builds']);
            invocations[0].resolve(JSON.stringify(resultsForSierraE));

            result = await fetchAvailableBuildsPromise;
            assert.equal(result.commitsToUpdate.length, 0);
        });

        it('should use "last-reported" order + 1 as "minOrder"', async () => {
            const logger = new MockLogger;
            const fetcher = new OSBuildFetcher(configTrackingOneOS, TestServer.remoteAPI(), slaveAuth, MockSubprocess, logger);
            const db = TestServer.database();
            const resultsForSierraD = {allRevisions: ["Sierra16D68", "Sierra16D69", "Sierra16D100", "Sierra16D100a"], commitsWithTestability: {}};

            await addSlaveForReport(emptyReport);
            await db.insert('repositories', {'id': 10, 'name': 'OSX'});
            await db.insert('commits', {'repository': 10, 'revision': 'Sierra16D100', 'order': 1603010000, 'reported': true});

            let result = await TestServer.remoteAPI().getJSON('/api/commits/OSX/last-reported?from=1603010000&to=1603099900');
            assert.equal(result['commits'].length, 1);
            assert.equal(result['commits'][0]['revision'], 'Sierra16D100');
            assert.equal(result['commits'][0]['order'], 1603010000);

            const waitForInvocationPromise = MockSubprocess.waitForInvocation();
            const fetchAndReportPromise = fetcher.fetchReportAndUpdateBuilds();
            await waitForInvocationPromise;
            assert.equal(invocations.length, 1);
            assert.deepEqual(invocations[0].command, ['list', 'all osx 16Dxx builds']);
            invocations[0].resolve(JSON.stringify(resultsForSierraD));

            result = await fetchAndReportPromise;
            const results = await Promise.all([
                db.selectRows('repositories', {'name': 'WebKit'}),
                db.selectRows('repositories', {'name': 'JavaScriptCore'}),
                db.selectRows('commits', {'revision': 'Sierra16D69'}),
                db.selectRows('commits', {'revision': 'Sierra16D100a'})]);

            const webkitRepository = results[0];
            const jscRepository = results[1];
            const osxCommit16D69 = results[2];
            const osxCommit16D100a = results[3];

            assert.equal(webkitRepository.length, 0);
            assert.equal(jscRepository.length, 0);

            assert.equal(osxCommit16D69.length, 0);

            assert.equal(osxCommit16D100a.length, 1);
            assert.equal(osxCommit16D100a[0]['repository'], 10);
            assert.equal(osxCommit16D100a[0]['order'], 1603010001);

            result = await TestServer.remoteAPI().getJSON('/api/commits/OSX/last-reported?from=1603010000&to=1603099900');
            assert.equal(result['commits'].length, 1);
            assert.equal(result['commits'][0]['revision'], 'Sierra16D100a');
            assert.equal(result['commits'][0]['order'], 1603010001);
        });

        it('should use minRevision in the config if there is no commit', async () => {
            const logger = new MockLogger;
            const fetcher = new OSBuildFetcher(configTrackingOneOS, TestServer.remoteAPI(), slaveAuth, MockSubprocess, logger);
            const db = TestServer.database();
            const resultsForSierraD = {allRevisions: ["Sierra16D68", "Sierra16D69", "Sierra16D100", "Sierra16D101"], commitsWithTestability: {}};

            await addSlaveForReport(emptyReport);
            await db.insert('repositories', {'id': 10, 'name': 'OSX'});

            let result = await TestServer.remoteAPI().getJSON('/api/commits/OSX/last-reported?from=1603010000&to=1603099900');
            assert.equal(result['commits'].length, 0);

            const waitForInvocationPromise = MockSubprocess.waitForInvocation();
            const fetchReportAndUpdatePromise = fetcher.fetchReportAndUpdateBuilds();
            await waitForInvocationPromise;
            assert.equal(invocations.length, 1);
            assert.deepEqual(invocations[0].command, ['list', 'all osx 16Dxx builds']);
            invocations[0].resolve(JSON.stringify(resultsForSierraD));

            result = await fetchReportAndUpdatePromise;
            const results = await Promise.all([
                db.selectRows('repositories', {'name': 'WebKit'}),
                db.selectRows('repositories', {'name': 'JavaScriptCore'}),
                db.selectRows('commits', {'revision': 'Sierra16D69'}),
                db.selectRows('commits', {'revision': 'Sierra16D100'}),
                db.selectRows('commits', {'revision': 'Sierra16D101'})]);

            const webkitRepository = results[0];
            const jscRepository = results[1];
            const osxCommit16D69 = results[2];
            const osxCommit16D100 = results[3];
            const osxCommit16D101 = results[4];

            assert.equal(webkitRepository.length, 0);
            assert.equal(jscRepository.length, 0);

            assert.equal(osxCommit16D69.length, 0);

            assert.equal(osxCommit16D100.length, 1);
            assert.equal(osxCommit16D100[0]['repository'], 10);
            assert.equal(osxCommit16D100[0]['order'], 1603010000);

            assert.equal(osxCommit16D101.length, 1);
            assert.equal(osxCommit16D101[0]['repository'], 10);
            assert.equal(osxCommit16D101[0]['order'], 1603010100);

            result = await TestServer.remoteAPI().getJSON('/api/commits/OSX/last-reported?from=1603010000&to=1603099900');
            assert.equal(result['commits'].length, 1);
            assert.equal(result['commits'][0]['revision'], 'Sierra16D101');
            assert.equal(result['commits'][0]['order'], 1603010100);
        });

        it('should stop reporting if any custom command fails', () => {
            const logger = new MockLogger;
            const fetcher = new OSBuildFetcher(config, TestServer.remoteAPI(), slaveAuth, MockSubprocess, logger);
            const db = TestServer.database();
            const resultsForSierraD = {allRevisions: ["Sierra16D68", "Sierra16D69"], commitsWithTestability: {}};
            const resultsForSierraE = {allRevisions: ["Sierra16E32", "Sierra16E33", "Sierra16E33h", "Sierra16E34"], commitsWithTestability: {}};
            let fetchAndReportPromise = null;

            return addSlaveForReport(emptyReport).then(() => {
                return Promise.all([
                    db.insert('repositories', {'id': 10, 'name': 'OSX'}),
                    db.insert('commits', {'repository': 10, 'revision': 'Sierra16D67', 'order': 1603006700, 'reported': true}),
                    db.insert('commits', {'repository': 10, 'revision': 'Sierra16D68', 'order': 1603006800, 'reported': true}),
                    db.insert('commits', {'repository': 10, 'revision': 'Sierra16D69', 'order': 1603006900, 'reported': false}),
                    db.insert('commits', {'repository': 10, 'revision': 'Sierra16E32', 'order': 1604003200, 'reported': true}),
                    db.insert('commits', {'repository': 10, 'revision': 'Sierra16E33', 'order': 1604003300, 'reported': true}),
                    db.insert('commits', {'repository': 10, 'revision': 'Sierra16E33g', 'order': 1604003307, 'reported': true})]);
            }).then(() => {
                return TestServer.remoteAPI().getJSON('/api/commits/OSX/last-reported?from=1603000000&to=1603099900');
            }).then((result) => {
                assert.equal(result['commits'].length, 1);
                assert.equal(result['commits'][0]['revision'], 'Sierra16D68');
                assert.equal(result['commits'][0]['order'], 1603006800);

                return TestServer.remoteAPI().getJSON('/api/commits/OSX/last-reported?from=1604000000&to=1604099900');
            }).then((result) => {
                assert.equal(result['commits'].length, 1);
                assert.equal(result['commits'][0]['revision'], 'Sierra16E33g');
                assert.equal(result['commits'][0]['order'], 1604003307);

                const waitForInvocationPromise = MockSubprocess.waitForInvocation();
                fetchAndReportPromise = fetcher.fetchReportAndUpdateBuilds();
                return waitForInvocationPromise;
            }).then(() => {
                assert.equal(invocations.length, 1);
                assert.deepEqual(invocations[0].command, ['list', 'all osx 16Dxx builds']);
                invocations[0].resolve(JSON.stringify(resultsForSierraD));
                return MockSubprocess.resetAndWaitForInvocation();
            }).then(() => {
                assert.equal(invocations.length, 1);
                assert.deepEqual(invocations[0].command, ['list', 'ownedCommit', 'for', 'revision', 'Sierra16D69']);
                MockSubprocess.invocations[0].resolve(JSON.stringify(ownedCommitWithWebKit));
                return MockSubprocess.resetAndWaitForInvocation();
            }).then(() => {
                assert.equal(invocations.length, 1);
                assert.deepEqual(invocations[0].command, ['list', 'all osx 16Exx builds']);
                invocations[0].resolve(JSON.stringify(resultsForSierraE));
                return MockSubprocess.resetAndWaitForInvocation();
            }).then(() => {
                assert.deepEqual(invocations[0].command, ['list', 'ownedCommit', 'for', 'revision', 'Sierra16E33h']);
                invocations[0].resolve(JSON.stringify(anotherownedCommitWithWebKit));
                return MockSubprocess.resetAndWaitForInvocation();
            }).then(() => {
                assert.equal(invocations.length, 1);
                assert.deepEqual(invocations[0].command, ['list', 'ownedCommit', 'for', 'revision', 'Sierra16E34']);
                invocations[0].reject('Command failed');
                return fetchAndReportPromise.then(() => {
                    assert(false, 'should never be reached');
                }, (error_output) => {
                    assert(error_output);
                    assert.equal(error_output, 'Command failed');
                });
            }).then(() => {
                return TestServer.remoteAPI().getJSON('/api/commits/OSX/last-reported?from=1603000000&to=1603099900');
            }).then((result) => {
                assert.equal(result['commits'].length, 1);
                assert.equal(result['commits'][0]['revision'], 'Sierra16D68');
                assert.equal(result['commits'][0]['order'], 1603006800);

                return TestServer.remoteAPI().getJSON('/api/commits/OSX/last-reported?from=1604000000&to=1604099900');
            }).then((result) => {
                assert.equal(result['commits'].length, 1);
                assert.equal(result['commits'][0]['revision'], 'Sierra16E33g');
                assert.equal(result['commits'][0]['order'], 1604003307);
            });
        })
    })
});
