Example #1
0
def test_phabricator_clang_format(mock_repository, mock_phabricator):
    '''
    Test Phabricator reporter publication on a mock clang-format issue
    '''
    from static_analysis_bot.report.phabricator import PhabricatorReporter
    from static_analysis_bot.revisions import PhabricatorRevision
    from static_analysis_bot.clang.format import ClangFormatIssue

    def _check_comment(request):
        # Check the Phabricator main comment is well formed
        payload = urllib.parse.parse_qs(request.body)
        assert payload['output'] == ['json']
        assert len(payload['params']) == 1
        details = json.loads(payload['params'][0])
        assert details['message'] == VALID_CLANG_FORMAT_MESSAGE

        # Outputs dummy empty response
        resp = {
            'error_code': None,
            'result': None,
        }
        return 201, {
            'Content-Type': 'application/json',
            'unittest': 'clang-format'
        }, json.dumps(resp)

    responses.add_callback(
        responses.POST,
        'http://phabricator.test/api/differential.createcomment',
        callback=_check_comment,
    )

    with mock_phabricator as api:
        revision = PhabricatorRevision('PHID-DIFF-abcdef', api)
        revision.lines = {
            # Add dummy lines diff
            'test.cpp': [41, 42, 43],
            'dom/test.cpp': [
                42,
            ],
        }
        reporter = PhabricatorReporter({'analyzers': ['clang-format']},
                                       api=api)

    issue = ClangFormatIssue('dom/test.cpp', 42, 1, revision)
    assert issue.is_publishable()

    revision.improvement_patches = {'clang-format': 'https://diff.url'}

    issues, patches = reporter.publish([
        issue,
    ], revision)
    assert len(issues) == 1
    assert len(patches) == 1

    # Check the callback has been used
    assert len(responses.calls) > 0
    call = responses.calls[-1]
    assert call.request.url == 'http://phabricator.test/api/differential.createcomment'
    assert call.response.headers.get('unittest') == 'clang-format'
def test_phabricator_clang_format(mock_config, mock_repository, mock_phabricator):
    '''
    Test Phabricator reporter publication on a mock clang-format issue
    '''
    from static_analysis_bot.report.phabricator import PhabricatorReporter
    from static_analysis_bot.revisions import PhabricatorRevision, ImprovementPatch
    from static_analysis_bot.clang.format import ClangFormatIssue

    def _check_comment(request):
        # Check the Phabricator main comment is well formed
        payload = urllib.parse.parse_qs(request.body)
        assert payload['output'] == ['json']
        assert len(payload['params']) == 1
        details = json.loads(payload['params'][0])
        assert details['message'] == VALID_CLANG_FORMAT_MESSAGE.format(results=mock_config.taskcluster.results_dir)

        # Outputs dummy empty response
        resp = {
            'error_code': None,
            'result': None,
        }
        return 201, {'Content-Type': 'application/json', 'unittest': 'clang-format'}, json.dumps(resp)

    responses.add_callback(
        responses.POST,
        'http://phabricator.test/api/differential.createcomment',
        callback=_check_comment,
    )

    with mock_phabricator as api:
        revision = PhabricatorRevision(api, 'PHID-DIFF-abcdef')
        revision.lines = {
            # Add dummy lines diff
            'test.cpp': [41, 42, 43],
            'dom/test.cpp': [42, ],
        }
        reporter = PhabricatorReporter({'analyzers': ['clang-format']}, api=api)

    issue = ClangFormatIssue('dom/test.cpp', 42, 1, revision)
    assert issue.is_publishable()

    revision.improvement_patches = [
        ImprovementPatch('clang-format', repr(revision), 'Some lint fixes'),
    ]
    list(map(lambda p: p.write(), revision.improvement_patches))  # trigger local write

    issues, patches = reporter.publish([issue, ], revision)
    assert len(issues) == 1
    assert len(patches) == 1

    # Check the callback has been used
    assert len(responses.calls) > 0
    call = responses.calls[-1]
    assert call.request.url == 'http://phabricator.test/api/differential.createcomment'
    assert call.response.headers.get('unittest') == 'clang-format'
Example #3
0
def test_clang_format_3rd_party(mock_config, mock_repository, mock_revision):
    '''
    Test a clang format issue in 3rd party is not publishable
    '''
    from static_analysis_bot.clang.format import ClangFormatIssue

    mock_revision.lines = {
        'test/not_3rd.c': [
            10,
        ],
        'test/dummy/third_party.c': [
            10,
        ],
    }
    issue = ClangFormatIssue('test/not_3rd.c', 10, 1, mock_revision)
    assert issue.is_publishable()

    # test/dummy is a third party directory
    issue = ClangFormatIssue('test/dummy/third_party.c', 10, 1, mock_revision)
    assert not issue.is_publishable()
def test_clang_format_3rd_party(mock_config, mock_repository, mock_revision):
    '''
    Test a clang format issue in 3rd party is not publishable
    '''
    from static_analysis_bot.clang.format import ClangFormatIssue

    mock_revision.lines = {
        'test/not_3rd.c': [10, ],
        'test/dummy/third_party.c': [10, ],
    }
    issue = ClangFormatIssue('test/not_3rd.c', 10, 1, mock_revision)
    assert issue.is_publishable()
    assert issue.as_phabricator_lint() == {
        'code': 'clang-format',
        'line': 10,
        'name': 'C/C++ style issue',
        'path': 'test/not_3rd.c',
        'severity': 'warning',
    }

    # test/dummy is a third party directory
    issue = ClangFormatIssue('test/dummy/third_party.c', 10, 1, mock_revision)
    assert not issue.is_publishable()
Example #5
0
def test_comment(mock_mozreview, test_cpp, mock_revision):
    '''
    Test comment creation for specific issues
    '''
    from static_analysis_bot.clang.tidy import ClangTidyIssue
    from static_analysis_bot.clang.format import ClangFormatIssue
    from static_analysis_bot.lint import MozLintIssue
    from static_analysis_bot.report.base import Reporter

    # Init dummy reporter
    class TestReporter(Reporter):
        def __init__(self):
            pass

    reporter = TestReporter()

    # Build clang tidy fake issue, while forcing publication status
    header = ('test.cpp', 1, 1, 'error', 'Dummy message', 'test-check')
    clang_tidy_publishable = ClangTidyIssue(header, mock_revision)
    clang_tidy_publishable.is_publishable = lambda: True
    assert clang_tidy_publishable.is_publishable()
    issues = [
        clang_tidy_publishable,
    ]

    assert reporter.build_comment(issues, 'https://report.example.com') == '''
Code analysis found 1 defect in this patch:
 - 1 defect found by clang-tidy

You can run this analysis locally with:
 - `./mach static-analysis check path/to/file.cpp` (C/C++)


If you see a problem in this automated review, please report it here: https://report.example.com
'''

    # Now add a clang-format issue
    clang_format_publishable = ClangFormatIssue('test.cpp', '', '',
                                                ('delete', 1, 2, 3, 4),
                                                mock_revision)
    clang_format_publishable.is_publishable = lambda: True
    assert clang_tidy_publishable.is_publishable()
    issues.append(clang_format_publishable)

    assert reporter.build_comment(issues, 'https://report.example.com') == '''
Code analysis found 2 defects in this patch:
 - 1 defect found by clang-format
 - 1 defect found by clang-tidy

You can run this analysis locally with:
 - `./mach clang-format -p path/to/file.cpp` (C/C++)
 - `./mach static-analysis check path/to/file.cpp` (C/C++)


If you see a problem in this automated review, please report it here: https://report.example.com
'''

    # Now add a mozlint issue
    mozlint_publishable = MozLintIssue('test.cpp', 1, 'error', 1, 'test',
                                       'Dummy test', 'dummy rule',
                                       mock_revision)
    mozlint_publishable.is_publishable = lambda: True
    assert mozlint_publishable.is_publishable()
    issues.append(mozlint_publishable)

    assert reporter.build_comment(issues, 'https://report.example.com') == '''