class test_runner_docker_build(unittest.TestCase):
    step = Step("test", "docker-pull", {
        "image": "busybox alpine"
    })

    project = Project(
        services=[],
        targets=[Target(
            name="target",
            dependencies=[],
            steps=[step]
        )])
    parameters = Parameters(dataconnection="runci.yml", targets=["target"], verbosity=0)

    @patch('runci.engine.runner.docker_pull.DockerPullRunner._run_process')
    def test_command_line_args(self, mock):
        async def run():
            runner = DockerPullRunner(self.project.targets[0], self.step, lambda e: None)
            context = create_context(self.project, self.parameters)
            await runner.run(context)

        asyncio.run(run())
        mock.assert_has_calls([
            call('docker pull busybox'.split(' ')),
            call('docker pull alpine'.split(' '))])

    @patch('runci.engine.runner.docker_pull.DockerPullRunner.run')
    def test_integration(self, mock):
        context = create_context(self.project, self.parameters)
        DependencyTree(context).run()
        mock.assert_called_once()
Beispiel #2
0
class test_runner_compose_build(unittest.TestCase):
    step = Step("test", "compose-build", {})
    project = Project(
        services=[],
        targets=[Target(name="target", dependencies=[], steps=[step])])
    parameters = Parameters(dataconnection="runci.yml",
                            targets=["target"],
                            verbosity=0)

    @patch('runci.engine.runner.compose_build.ComposeBuildRunner._run_process')
    def test_command_line_args(self, mock):
        async def run():
            runner = ComposeBuildRunner(None, self.step, lambda e: None)
            context = create_context(self.project, self.parameters)
            await runner.run(context)

        asyncio.run(run())
        mock.assert_called_once_with(
            'docker-compose -f runci.yml build'.split(' '))

    @patch('runci.engine.runner.compose_build.ComposeBuildRunner.run')
    def test_integration(self, mock):
        context = create_context(self.project, self.parameters)
        DependencyTree(context).run()
        mock.assert_called_once()
Beispiel #3
0
 def test_invalid_step_type(self, mock):
     target = Target("test", "", [Step("test", "invalid", {})])
     project = Project([], [target])
     context = core.create_context(project, None)
     job = Job(context, target)
     job.run()
     self.assertEqual(job.status, JobStatus.FAILED)
     self.assertTrue(
         any([
             mock_call for mock_call in mock.mock_calls
             if isinstance(mock_call.args[0], JobStepUnknownTypeEvent)
         ]))
Beispiel #4
0
    def __init__(self, context):
        self._context = context

        if len(self._context.parameters.targets) == 1:
            self._root_node = self._get_dependency_subtree(
                self._context.parameters.targets[0])
        else:
            dependent_subtree = list([
                self._get_dependency_subtree(target)
                for target in self._context.parameters.targets
            ])
            root_job = Job(self._context, Target("root", [], []))
            self._root_node = DependencyNode(root_job, dependent_subtree)
Beispiel #5
0
    def test_exception(self, mock):
        class TestRunner(RunnerBase):
            async def run_internal(self, project: Project):
                raise Exception("Simulating an exception")

        target = Target("test", "", [Step("test", "mock", {})])
        project = Project([], [target])
        context = core.create_context(project, None)
        job = Job(context, target)
        job.run()
        self.assertEqual(job.status, JobStatus.FAILED)

        self.assertEqual(mock.call_count, 3)
        self.assertIsInstance(mock.mock_calls[0].args[0], JobStartEvent)
        self.assertIsInstance(mock.mock_calls[1].args[0],
                              JobStepUnknownTypeEvent)
        self.assertIsInstance(mock.mock_calls[2].args[0], JobFailureEvent)
Beispiel #6
0
    def test_release_messages(self):
        command = self.test_command

        class TestRunner(RunnerBase):
            async def run_internal(self, context: Context):
                await self._run_process(["sh", "-c", command])

        target = Target("test", "", [Step("test", "mock", {})])
        project = Project([], [target])
        context = core.create_context(project, None)
        context.runners["mock"] = TestRunner
        job = Job(context, target)
        job.run()
        self.assertEqual(job.status, JobStatus.SUCCEEDED)

        self.assertTrue(job.has_new_events())
        asyncio.run(job.process_events())
        self.assertFalse(job.has_new_events())
Beispiel #7
0
class test_runner_docker_build(unittest.TestCase):
    step = Step("test", "target-run", {
        "target": "test"
    })

    project = Project(
        services=[],
        targets=[Target(
            name="target",
            dependencies=[],
            steps=[step]
        )])
    parameters = Parameters(dataconnection="runci.yml", targets=["target"], verbosity=0)

    @patch('runci.engine.runner.target_run.TargetRunRunner.run')
    def test_integration(self, mock):
        context = create_context(self.project, self.parameters)
        DependencyTree(context).run()
        mock.assert_called_once()
Beispiel #8
0
class test_runner_compose_build(unittest.TestCase):
    step = Step("test", "compose-run", {
        "services": "app",
        "projectName": "test",
        "build": False
    })
    project = Project(
        services=[],
        targets=[Target(name="target", dependencies=[], steps=[step])])
    parameters = Parameters(dataconnection="runci.yml",
                            targets=["target"],
                            verbosity=0)

    @patch('runci.engine.runner.compose_run.ComposeRunRunner._run_process')
    def test_command_line_args(self, mock):
        async def run():
            runner = ComposeRunRunner(self.project.targets[0], self.step,
                                      lambda e: None)
            context = create_context(self.project, self.parameters)
            await runner.run(context)

        asyncio.run(run())
        mock.assert_has_calls([
            call(
                'docker-compose -f docker-compose.yml -f runci.yml -p test run --rm app'
                .split(' ')),
            call(
                'docker-compose -f docker-compose.yml -f runci.yml -p test down'
                .split(' '))
        ])

    @patch('runci.engine.runner.compose_run.ComposeRunRunner.run')
    def test_integration(self, mock):
        context = create_context(self.project, self.parameters)
        DependencyTree(context).run()
        mock.assert_called_once()
Beispiel #9
0
from parameterized import parameterized
import unittest
from unittest.mock import patch, call

from runci.entities.config import Project, Target, Step
from runci.entities.parameters import Parameters
from runci.engine.core import UnknownTargetException
from runci.engine import core, job, runner

param_inexistent_target = [
    Project(services=[],
            targets=[Target(name="target", dependencies=[], steps=[])]),
    Parameters(dataconnection="runci.yml",
               targets=["inexistant_target"],
               verbosity=0)
]

param_simple_target_single_step = [
    Project(services=[],
            targets=[
                Target(
                    name="target",
                    dependencies=[],
                    steps=[Step("test", "compose-build", {"services": "s1"})])
            ]),
    Parameters(dataconnection="runci.yml", targets=["target"], verbosity=0),
    [call("docker-compose -f runci.yml build s1".split(" "))]
]

param_dependent_targets_single_step = [
    Project(
Beispiel #10
0
from click.testing import CliRunner
import unittest

from runci.cli.main import main
from runci.entities.config import Project, Target, Step
from runci.entities.parameters import Parameters

test_project = Project(services=[],
                       targets=[Target(name="build_succeed",
                                       dependencies=[],
                                       steps=[]),
                                Target(name="build_fail",
                                       dependencies=[],
                                       steps=[Step("fail", "compose-build", {"services": "non-exist"})]),
                                Target(name="wrong_step_type",
                                       dependencies=[],
                                       steps=[Step("wrong_step", "wrong_type", {})])
                                ])

test_parameters = Parameters(dataconnection="runci.yml",
                             targets=["target"],
                             verbosity=0)
test_project_yaml = """
version: "2.4"
targets:
    build_succeed:
    build_fail:
        steps:
            - name: fail
              compose-build:
                services: non-exist