Example #1
0
def test_mail(mock_issues, mock_phabricator):
    '''
    Test mail sending through Taskcluster
    '''
    from shipit_static_analysis.report.mail import MailReporter
    from shipit_static_analysis.revisions import MozReviewRevision, PhabricatorRevision
    from shipit_static_analysis.report.phabricator import PhabricatorReporter

    phab = PhabricatorReporter({
        'url': 'http://phabricator.test/api/',
        'api_key': 'deadbeef',
    })

    def _check_email(request):
        payload = json.loads(request.body)

        assert payload['subject'] in (
            '[test] New Static Analysis MozReview #12345 - 1',
            '[test] New Static Analysis Phabricator #42 - PHID-DIFF-test',
        )
        assert payload['address'] == '*****@*****.**'
        assert payload['template'] == 'fullscreen'
        assert payload['content'].startswith(
            '\n# Found 3 publishable issues (5 total)')

        return (200, {}, '')  # ack

    # Add mock taskcluster email to check output
    responses.add_callback(
        responses.POST,
        'https://notify.taskcluster.net/v1/email',
        callback=_check_email,
    )

    # Publish email
    conf = {
        'emails': [
            '*****@*****.**',
        ],
    }
    r = MailReporter(conf, 'test_tc', 'token_tc')

    # Publish for mozreview
    mrev = MozReviewRevision('abcdef:12345:1')
    r.publish(mock_issues, mrev)

    prev = PhabricatorRevision('42:PHID-DIFF-test', phab)
    r.publish(mock_issues, prev)

    # Check stats
    mock_cls = mock_issues[0].__class__
    assert r.calc_stats(mock_issues) == {
        mock_cls: {
            'total': 5,
            'publishable': 3,
        }
    }
Example #2
0
def test_phabricator(mock_phabricator, mock_repository):
    '''
    Test a phabricator revision
    '''
    from shipit_static_analysis.revisions import PhabricatorRevision
    from shipit_static_analysis.report.phabricator import PhabricatorReporter

    api = PhabricatorReporter({
        'url': 'http://phabricator.test/api/',
        'api_key': 'deadbeef',
    })

    r = PhabricatorRevision('51:PHID-DIFF-testABcd12', api)
    assert not hasattr(r, 'mercurial')
    assert r.diff_id == 42
    assert r.diff_phid == 'PHID-DIFF-testABcd12'
    assert r.url == 'https://phabricator.test/PHID-DIFF-testABcd12/'
    assert r.build_diff_name() == 'PHID-DIFF-testABcd12-clang-format.diff'
    assert r.id == 51  # revision

    # Check test.txt content
    test_txt = os.path.join(mock_repository.directory, 'test.txt')
    assert open(test_txt).read() == 'Hello World\n'

    # Load full patch
    assert r.patch is None
    r.apply(mock_repository)
    assert r.patch is not None
    assert isinstance(r.patch, str)
    assert len(r.patch.split('\n')) == 7
    patch = Patch.parse_patch(r.patch)
    assert patch == {
        'test.txt': {
            'touched': [],
            'deleted': [],
            'added': [2],
            'new': False
        }
    }

    # Check file is updated
    assert open(test_txt).read() == 'Hello World\nSecond line\n'
Example #3
0
def test_phabricator(mock_phabricator):
    '''
    Test a phabricator revision
    '''
    from shipit_static_analysis.revisions import PhabricatorRevision
    from shipit_static_analysis.report.phabricator import PhabricatorReporter

    api = PhabricatorReporter({
        'url': 'http://phabricator.test/api/',
        'api_key': 'deadbeef',
    })

    r = PhabricatorRevision('51:PHID-DIFF-testABcd12', api)
    assert r.mercurial == 'coffeedeadbeef123456789'
    assert r.diff_id == 42
    assert r.diff_phid == 'PHID-DIFF-testABcd12'
    assert r.url == 'https://phabricator.test/PHID-DIFF-testABcd12/'
    assert r.build_diff_name() == 'PHID-DIFF-testABcd12-clang-format.diff'
    assert r.id == 51  # revision
    assert r.phid == 'PHID-DREV-zzzzz'
Example #4
0
def main(
    phabricator,
    mozreview,
    cache_root,
    taskcluster_secret,
    taskcluster_client_id,
    taskcluster_access_token,
):

    assert (phabricator is None) ^ (mozreview is None), \
        'Specify a phabricator XOR mozreview parameters'

    secrets = get_secrets(
        taskcluster_secret,
        config.PROJECT_NAME,
        required=(
            'APP_CHANNEL',
            'REPORTERS',
            'ANALYZERS',
        ),
        existing={
            'APP_CHANNEL': 'development',
            'REPORTERS': [],
            'ANALYZERS': [
                'clang-tidy',
            ],
        },
        taskcluster_client_id=taskcluster_client_id,
        taskcluster_access_token=taskcluster_access_token,
    )

    init_logger(
        config.PROJECT_NAME,
        PAPERTRAIL_HOST=secrets.get('PAPERTRAIL_HOST'),
        PAPERTRAIL_PORT=secrets.get('PAPERTRAIL_PORT'),
        SENTRY_DSN=secrets.get('SENTRY_DSN'),
        MOZDEF=secrets.get('MOZDEF'),
    )

    # Setup settings before stats
    settings.setup(secrets['APP_CHANNEL'])

    # Setup statistics
    datadog_api_key = secrets.get('DATADOG_API_KEY')
    if datadog_api_key:
        stats.auth(datadog_api_key)

    # Load reporters
    reporters = get_reporters(
        secrets['REPORTERS'],
        taskcluster_client_id,
        taskcluster_access_token,
    )

    # Load revisions
    revisions = []
    if phabricator:
        # Only one phabricator revision at a time
        api = reporters.get('phabricator')
        assert api is not None, \
            'Cannot use a phabricator revision without a phabricator reporter'
        revisions.append(PhabricatorRevision(phabricator, api))
    if mozreview:
        # Multiple mozreview revisions are possible
        revisions += [MozReviewRevision(r) for r in mozreview.split(' ')]

    w = Workflow(cache_root, reporters, secrets['ANALYZERS'])
    for revision in revisions:
        try:
            w.run(revision)
        except Exception as e:
            # Log errors to papertrail
            logger.error(
                'Static analysis failure',
                revision=revision,
                error=e,
            )