示例#1
0
def test_backend_publication(mock_revision, mock_task):
    """
    Test the backend publication status modifies an issue publication
    """

    lines = [
        (1, None, b"deletion"),
        (None, 1, b"change here"),
    ]
    issue = ClangFormatIssue(
        mock_task(ClangFormatTask, "mock-clang-format"),
        "dom/somefile.cpp",
        lines,
        mock_revision,
    )
    assert issue.validates()

    # At first backend data is empty
    assert issue.on_backend is None

    # Not publishable as not in patch
    assert mock_revision.lines == {}
    assert not mock_revision.contains(issue)
    assert not issue.is_publishable()

    # The backend data takes precedence over local in patch
    issue.on_backend = {"publishable": True}
    assert issue.is_publishable()
示例#2
0
def test_phabricator_clang_format(mock_config, mock_phabricator, mock_try_task):
    """
    Test Phabricator reporter publication on a mock clang-format issue
    """
    from code_review_bot.report.phabricator import PhabricatorReporter
    from code_review_bot.revisions import Revision, ImprovementPatch
    from code_review_bot.tasks.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 = Revision.from_try(mock_try_task, 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(
        "source-test-clang-format", "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"
示例#3
0
def test_backend_publication(mock_revision):
    """
    Test the backend publication status modifies an issue publication
    """

    issue = ClangFormatIssue("mock-clang-format", "dom/somefile.cpp", 1, 1,
                             mock_revision)
    assert issue.validates()

    # At first backend data is empty
    assert issue.on_backend is None

    # Not publishable as not in patch
    assert mock_revision.lines == {}
    assert not mock_revision.contains(issue)
    assert not issue.is_publishable()

    # The backend data takes precedence over local in patch
    issue.on_backend = {"publishable": True}
    assert issue.is_publishable()
示例#4
0
def test_clang_format_3rd_party(mock_config, mock_revision):
    """
    Test a clang format issue in 3rd party is not publishable
    """
    from code_review_bot.tasks.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()
def test_phabricator_clang_format(mock_config, mock_phabricator, phab,
                                  mock_try_task, mock_task):
    """
    Test Phabricator reporter publication on a mock clang-format issue
    """

    with mock_phabricator as api:
        revision = Revision.from_try(mock_try_task, api)
        revision.mercurial_revision = "deadbeef1234"
        revision.repository = "https://hg.mozilla.org/try"
        revision.repository_try_name = "try"
        revision.lines = {
            # Add dummy lines diff
            "test.cpp": [41, 42, 43],
            "dom/test.cpp": [42],
        }
        reporter = PhabricatorReporter({"analyzers": ["clang-format"]},
                                       api=api)

    task = mock_task(ClangFormatTask, "source-test-clang-format")
    lines = [
        (41, 41, b"no change"),
        (42, None, b"deletion"),
        (None, 42, b"change here"),
    ]
    issue = ClangFormatIssue(task, "dom/test.cpp", lines, revision)
    assert issue.is_publishable()

    revision.improvement_patches = [
        ImprovementPatch(task, 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 comment has been posted
    assert phab.comments[51] == [
        VALID_CLANG_FORMAT_MESSAGE.format(
            results=mock_config.taskcluster.results_dir)
    ]