Beispiel #1
0
    def test_simple(self, vcs, get_options):
        responses.add(responses.POST, 'https://foo.example.com')

        repository = self.create_repo(
            backend=RepositoryBackend.hg,
        )

        project = self.create_project(repository=repository)

        source = self.create_source(
            project=project,
            revision_sha='a' * 40,
        )
        build = self.create_build(
            project=project,
            source=source,
        )

        build = self.create_build(
            project=project,
            source=source,
        )

        get_options.return_value = {
            'green-build.notify': '1',
        }
        vcs = build.source.repository.get_vcs.return_value
        vcs.run.return_value = '134:asdadfadf'

        # test with failing build
        build.result = Result.failed

        build_finished_handler(build_id=build.id.hex)

        assert len(responses.calls) == 0

        # test with passing build
        build.result = Result.passed

        build_finished_handler(build_id=build.id.hex)

        vcs.run.assert_called_once_with([
            'log', '-r aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa', '--limit=1',
            '--template={rev}:{node|short}'
        ])

        get_options.assert_called_once_with(build.project_id)

        assert len(responses.calls) == 1
        assert responses.calls[0].request.url == 'https://foo.example.com/'
        assert responses.calls[0].request.body == 'project={project_slug}&build_server=changes&build_url=http%3A%2F%2Fexample.com%2Fprojects%2F{project_slug}%2Fbuilds%2F{build_id}%2F&id=134%3Aasdadfadf'.format(
            project_slug=build.project.slug,
            build_id=build.id.hex,
        )

        event = Event.query.filter(
            Event.type == EventType.green_build,
        ).first()
        assert event
        assert event.item_id == build.id
Beispiel #2
0
    def test_set_latest_green_build_with_vcs_sha_errors(self, vcs, get_options):
        responses.add(responses.POST, 'https://foo.example.com')

        repository = self.create_repo(
            backend=RepositoryBackend.hg,
        )

        project = self.create_project(repository=repository)

        sha = uuid4().hex
        source = self.create_source(
            project=project,
            revision_sha=sha,
            revision=self.create_revision(repository=repository,
                                          branches=['default'],
                                          sha=sha
            )
        )
        vcs = repository.get_vcs.return_value
        vcs.is_child_parent.return_value = True

        # Ensure a new build can be set to green if the current green is
        # missing in vcs.
        vcs.is_child_parent.side_effect = UnknownParentRevision(
                cmd="vcs merge-base ...",
                retcode=128,
                stdout="",
                stderr="fatal: Not a valid commit name [some SHA]\n")
        build3 = self.create_build(project=project, source=source)
        get_options.return_value = {'green-build.notify': '1'}
        vcs.run.return_value = '137:asdadfadf'
        build3.result = Result.passed
        build_finished_handler(build_id=build3.id.hex)
        assert self._get_latest_green_build(project.id, 'default').build == build3

        # Ensure a new build cannot be set to green if the new build's SHA is
        # missing in vcs.
        vcs.is_child_parent.side_effect = UnknownChildRevision(
                cmd="vcs merge-base ...",
                retcode=128,
                stdout="",
                stderr="fatal: Not a valid commit name [some SHA]\n")
        bad_sha_build = self.create_build(project=project, source=source)
        get_options.return_value = {'green-build.notify': '1'}
        vcs.run.return_value = '138:asdadfadf'
        bad_sha_build.result = Result.passed
        build_finished_handler(build_id=bad_sha_build.id.hex)
        assert self._get_latest_green_build(project.id, 'default').build == build3

        # Cleanup the mock (in case more blocks are added)
        vcs.is_child_parent.side_effect = None
Beispiel #3
0
    def test_set_latest_green_build_with_vcs_sha_errors(
            self, vcs, get_options):
        responses.add(responses.POST, 'https://foo.example.com')

        repository = self.create_repo(backend=RepositoryBackend.hg, )

        project = self.create_project(repository=repository)

        sha = uuid4().hex
        source = self.create_source(project=project,
                                    revision_sha=sha,
                                    revision=self.create_revision(
                                        repository=repository,
                                        branches=['default'],
                                        sha=sha))
        vcs = repository.get_vcs.return_value
        vcs.is_child_parent.return_value = True

        # Ensure a new build can be set to green if the current green is
        # missing in vcs.
        vcs.is_child_parent.side_effect = UnknownParentRevision(
            cmd="vcs merge-base ...",
            retcode=128,
            stdout="",
            stderr="fatal: Not a valid commit name [some SHA]\n")
        build3 = self.create_build(project=project, source=source)
        get_options.return_value = {'green-build.notify': '1'}
        vcs.run.return_value = '137:asdadfadf'
        build3.result = Result.passed
        build_finished_handler(build_id=build3.id.hex)
        assert self._get_latest_green_build(project.id,
                                            'default').build == build3

        # Ensure a new build cannot be set to green if the new build's SHA is
        # missing in vcs.
        vcs.is_child_parent.side_effect = UnknownChildRevision(
            cmd="vcs merge-base ...",
            retcode=128,
            stdout="",
            stderr="fatal: Not a valid commit name [some SHA]\n")
        bad_sha_build = self.create_build(project=project, source=source)
        get_options.return_value = {'green-build.notify': '1'}
        vcs.run.return_value = '138:asdadfadf'
        bad_sha_build.result = Result.passed
        build_finished_handler(build_id=bad_sha_build.id.hex)
        assert self._get_latest_green_build(project.id,
                                            'default').build == build3

        # Cleanup the mock (in case more blocks are added)
        vcs.is_child_parent.side_effect = None
Beispiel #4
0
def test_simple(get_options):
    with app.test_request_context():
        release_id = '134:asdadfadf'

        responses.add(responses.POST, 'https://foo.example.com')
        get_options.return_value = {
            'green-build.notify': '1',
        }

        build = mock.Mock(spec=Build())
        build.patch_id = None
        build.project.slug = 'server'
        build.id = UUID(hex='c' * 32)
        build.project_id = UUID(hex='b' * 32)
        build.revision_sha = 'a' * 40
        build.repository.backend = RepositoryBackend.hg

        vcs = build.repository.get_vcs.return_value
        vcs.run.return_value = release_id

        # test with failing build
        build.result = Result.failed

        build_finished_handler(build)

        assert len(responses.calls) == 0

        # test with passing build
        build.result = Result.passed

        build_finished_handler(build)

        vcs.run.assert_called_once_with([
            'log', '-r aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa', '--limit=1',
            '--template={rev}:{node|short}'
        ])

        get_options.assert_called_once_with(build.project_id)

        assert len(responses.calls) == 1
        assert responses.calls[0].request.url == 'https://foo.example.com/'
        assert responses.calls[0].request.body == 'project=server&build_server=changes&build_url=http%3A%2F%2Flocalhost%2Fbuilds%2Fcccccccccccccccccccccccccccccccc%2F&id=134%3Aasdadfadf'
Beispiel #5
0
    def test_set_latest_green_build(self, vcs, get_options):
        responses.add(responses.POST, 'https://foo.example.com')

        repository = self.create_repo(
            backend=RepositoryBackend.hg,
        )

        project = self.create_project(repository=repository)

        sha = uuid4().hex
        source = self.create_source(
            project=project,
            revision_sha=sha,
            revision=self.create_revision(repository=repository,
                                          branches=['default'],
                                          sha=sha
            )
        )
        vcs = repository.get_vcs.return_value
        vcs.is_child_parent.return_value = True

        # Ensure latest green build set even if notify is false.
        build = self.create_build(project=project, source=source)
        get_options.return_value = {'green-build.notify': '0'}
        vcs.run.return_value = '134:asdadfadf'
        build.result = Result.passed
        build_finished_handler(build_id=build.id.hex)
        assert self._get_latest_green_build(project.id, 'default').build == build

        # Ensure latest green build not set even if failed.
        failed_build = self.create_build(project=project, source=source)
        get_options.return_value = {'green-build.notify': '0'}
        vcs.run.return_value = '135:asdadfadf'
        failed_build.result = Result.failed
        build_finished_handler(build_id=failed_build.id.hex)
        assert self._get_latest_green_build(project.id, 'default').build == build

        build2 = self.create_build(project=project, source=source)
        get_options.return_value = {'green-build.notify': '1'}
        vcs.run.return_value = '136:asdadfadf'
        build2.result = Result.passed
        build_finished_handler(build_id=build2.id.hex)
        assert self._get_latest_green_build(project.id, 'default').build == build2
Beispiel #6
0
    def test_set_latest_green_build(self, vcs, get_options):
        responses.add(responses.POST, 'https://foo.example.com')

        repository = self.create_repo(
            backend=RepositoryBackend.hg,
        )

        project = self.create_project(repository=repository)

        sha = uuid4().hex
        source = self.create_source(
            project=project,
            revision_sha=sha,
            revision=self.create_revision(repository=repository,
                                          branches=['default'],
                                          sha=sha
            )
        )
        vcs = repository.get_vcs.return_value
        vcs.is_child_parent.return_value = True

        # Ensure latest green build set even if notify is false.
        build = self.create_build(project=project, source=source)
        get_options.return_value = {'green-build.notify': '0'}
        vcs.run.return_value = '134:asdadfadf'
        build.result = Result.passed
        build_finished_handler(build_id=build.id.hex)
        assert self._get_latest_green_build(project.id, 'default').build == build

        # Ensure latest green build not set even if failed.
        failed_build = self.create_build(project=project, source=source)
        get_options.return_value = {'green-build.notify': '0'}
        vcs.run.return_value = '135:asdadfadf'
        failed_build.result = Result.failed
        build_finished_handler(build_id=failed_build.id.hex)
        assert self._get_latest_green_build(project.id, 'default').build == build

        build2 = self.create_build(project=project, source=source)
        get_options.return_value = {'green-build.notify': '1'}
        vcs.run.return_value = '136:asdadfadf'
        build2.result = Result.passed
        build_finished_handler(build_id=build2.id.hex)
        assert self._get_latest_green_build(project.id, 'default').build == build2
Beispiel #7
0
    def test_simple(self, vcs, get_options):
        responses.add(responses.POST, 'https://foo.example.com')

        repository = self.create_repo(
            backend=RepositoryBackend.hg,
        )

        project = self.create_project(repository=repository)

        sha = uuid4().hex
        source = self.create_source(
            project=project,
            revision_sha=sha,
            revision=self.create_revision(repository=repository,
                                          branches=['default'],
                                          sha=sha
            )
        )

        build = self.create_build(
            project=project,
            source=source,
        )

        get_options.return_value = {
            'green-build.notify': '1',
        }
        vcs = build.source.repository.get_vcs.return_value
        vcs.run.return_value = '134:asdadfadf'

        # test with failing build
        build.result = Result.failed

        build_finished_handler(build_id=build.id.hex)

        assert len(responses.calls) == 0

        # test with passing build
        build.result = Result.passed

        build_finished_handler(build_id=build.id.hex)

        vcs.run.assert_called_once_with([
            'log', '-r %s' % sha, '--limit=1',
            '--template={rev}:{node|short}'
        ])

        get_options.assert_called_once_with(build.project_id)

        assert len(responses.calls) == 1
        assert responses.calls[0].request.url == 'https://foo.example.com/'
        assert responses.calls[0].request.body == 'project={project_slug}&build_server=changes&build_url=http%3A%2F%2Fexample.com%2Fprojects%2F{project_slug}%2Fbuilds%2F{build_id}%2F&id=134%3Aasdadfadf'.format(
            project_slug=build.project.slug,
            build_id=build.id.hex,
        )

        event = Event.query.filter(
            Event.type == EventType.green_build,
        ).first()
        assert event
        assert event.item_id == build.id
Beispiel #8
0
    def test_simple(self, vcs, get_options):
        responses.add(responses.POST, 'https://foo.example.com')

        repository = self.create_repo(backend=RepositoryBackend.hg, )

        project = self.create_project(repository=repository)

        sha = uuid4().hex
        source = self.create_source(project=project,
                                    revision_sha=sha,
                                    revision=self.create_revision(
                                        repository=repository,
                                        branches=['default'],
                                        sha=sha))

        build = self.create_build(
            project=project,
            source=source,
        )

        get_options.return_value = {
            'green-build.notify': '1',
        }
        vcs = build.source.repository.get_vcs.return_value
        vcs.run.return_value = '134:asdadfadf'

        # test with failing build
        build.result = Result.failed

        build_finished_handler(build_id=build.id.hex)

        assert len(responses.calls) == 0

        # test with passing build but not on correct branch:

        build.result = Result.passed

        get_options.return_value = {
            'green-build.notify': '1',
            'build.branch-names': 'some_other_branch',
        }

        build_finished_handler(build_id=build.id.hex)

        get_options.assert_called_once_with(build.project_id)

        assert len(responses.calls) == 0

        # test with passing build

        # (remove the branch filter)
        get_options.return_value = {
            'green-build.notify': '1',
        }

        def set_tags(b, tags):
            b.tags = tags
            db.session.add(b)
            db.session.commit()

        # Commit queue builds shouldn't be reported.
        set_tags(build, ['commit-queue'])
        build_finished_handler(build_id=build.id.hex)
        assert len(responses.calls) == 0

        # Not commit queue
        set_tags(build, [])

        build_finished_handler(build_id=build.id.hex)

        vcs.run.assert_called_once_with([
            'log',
            '-r %s' % sha, '--limit=1', '--template={rev}:{node|short}'
        ])

        assert len(responses.calls) == 1
        assert responses.calls[0].request.url == 'https://foo.example.com/'

        body = urlparse.parse_qs(responses.calls[0].request.body)
        assert body['project'][0] == build.project.slug
        assert body['build_server'][0] == 'changes'
        assert body['build_url'][
            0] == "http://example.com/projects/%s/builds/%s/" % (
                build.project.slug, build.id.hex)
        assert body['id'][0] == '134:asdadfadf'
        assert 'author_name' in body
        assert 'author_email' in body
        assert 'revision_message' in body
        assert 'commit_timestamp' in body

        event = Event.query.filter(
            Event.type == EventType.green_build, ).first()
        assert event
        assert event.item_id == build.id
    def test_simple(self, vcs, get_options):
        responses.add(responses.POST, 'https://foo.example.com')

        repository = self.create_repo(
            backend=RepositoryBackend.hg,
        )

        project = self.create_project(repository=repository)

        sha = uuid4().hex
        source = self.create_source(
            project=project,
            revision_sha=sha,
            revision=self.create_revision(repository=repository,
                                          branches=['default'],
                                          sha=sha
            )
        )

        build = self.create_build(
            project=project,
            source=source,
        )

        get_options.return_value = {
            'green-build.notify': '1',
        }
        vcs = build.source.repository.get_vcs.return_value
        vcs.run.return_value = '134:asdadfadf'

        # test with failing build
        build.result = Result.failed

        build_finished_handler(build_id=build.id.hex)

        assert len(responses.calls) == 0

        # test with passing build
        build.result = Result.passed

        build_finished_handler(build_id=build.id.hex)

        vcs.run.assert_called_once_with([
            'log', '-r %s' % sha, '--limit=1',
            '--template={rev}:{node|short}'
        ])

        get_options.assert_called_once_with(build.project_id)

        assert len(responses.calls) == 1
        assert responses.calls[0].request.url == 'https://foo.example.com/'

        body = urlparse.parse_qs(responses.calls[0].request.body)
        assert body['project'][0] == build.project.slug
        assert body['build_server'][0] == 'changes'
        assert body['build_url'][0] == "http://example.com/projects/%s/builds/%s/" % (build.project.slug, build.id.hex)
        assert body['id'][0] == '134:asdadfadf'
        assert 'author_name' in body
        assert 'author_email' in body
        assert 'revision_message' in body
        assert 'commit_timestamp' in body

        event = Event.query.filter(
            Event.type == EventType.green_build,
        ).first()
        assert event
        assert event.item_id == build.id