Beispiel #1
0
class TestApplicationBuilder_build_function(TestCase):
    def setUp(self):
        self.builder = ApplicationBuilder(Mock(), "/build/dir", "/base/dir")

    @patch("samcli.lib.build.app_builder._get_workflow_config")
    @patch("samcli.lib.build.app_builder.osutils")
    def test_must_build_in_process(self, osutils_mock,
                                   get_workflow_config_mock):
        function_name = "function_name"
        codeuri = "path/to/source"
        runtime = "runtime"
        scratch_dir = "scratch"
        config_mock = get_workflow_config_mock.return_value = Mock()
        config_mock.manifest_name = "manifest_name"

        osutils_mock.mkdir_temp.return_value.__enter__ = Mock(
            return_value=scratch_dir)
        osutils_mock.mkdir_temp.return_value.__exit__ = Mock()

        self.builder._build_function_in_process = Mock()

        code_dir = "/base/dir/path/to/source"
        artifacts_dir = "/build/dir/function_name"
        manifest_path = os.path.join(code_dir, config_mock.manifest_name)

        self.builder._build_function(function_name, codeuri, runtime)

        self.builder._build_function_in_process.assert_called_with(
            config_mock, code_dir, artifacts_dir, scratch_dir, manifest_path,
            runtime)

    @patch("samcli.lib.build.app_builder._get_workflow_config")
    @patch("samcli.lib.build.app_builder.osutils")
    def test_must_build_in_container(self, osutils_mock,
                                     get_workflow_config_mock):
        function_name = "function_name"
        codeuri = "path/to/source"
        runtime = "runtime"
        scratch_dir = "scratch"
        config_mock = get_workflow_config_mock.return_value = Mock()
        config_mock.manifest_name = "manifest_name"

        osutils_mock.mkdir_temp.return_value.__enter__ = Mock(
            return_value=scratch_dir)
        osutils_mock.mkdir_temp.return_value.__exit__ = Mock()

        self.builder._build_function_on_container = Mock()

        code_dir = "/base/dir/path/to/source"
        artifacts_dir = "/build/dir/function_name"
        manifest_path = os.path.join(code_dir, config_mock.manifest_name)

        # Settting the container manager will make us use the container
        self.builder._container_manager = Mock()
        self.builder._build_function(function_name, codeuri, runtime)

        self.builder._build_function_on_container.assert_called_with(
            config_mock, code_dir, artifacts_dir, scratch_dir, manifest_path,
            runtime)
Beispiel #2
0
    def test_should_run_build_for_only_unique_builds(self, persist_mock,
                                                     read_mock, osutils_mock):
        build_function_mock = Mock()

        # create 3 function resources where 2 of them would have same codeuri, runtime and metadata
        function1_1 = generate_function("function1_1")
        function1_2 = generate_function("function1_2")
        function2 = generate_function("function2", runtime="different_runtime")
        resources_to_build_collector = ResourcesToBuildCollector()
        resources_to_build_collector.add_functions(
            [function1_1, function1_2, function2])

        build_dir = "builddir"

        # instantiate the builder and run build method
        builder = ApplicationBuilder(resources_to_build_collector, "builddir",
                                     "basedir", "cachedir")
        builder._build_function = build_function_mock
        build_function_mock.side_effect = [
            os.path.join(build_dir, function1_1.name),
            os.path.join(build_dir, function1_2.name),
            os.path.join(build_dir, function1_2.name),
        ]

        result = builder.build()

        # result should contain all 3 functions as expected
        self.assertEqual(
            result,
            {
                function1_1.name: os.path.join(build_dir, function1_1.name),
                function1_2.name: os.path.join(build_dir, function1_2.name),
                function2.name: os.path.join(build_dir, function1_2.name),
            },
        )

        # actual build should only be called twice since only 2 of the functions have unique build
        build_function_mock.assert_has_calls(
            [
                call(
                    function1_1.name,
                    function1_1.codeuri,
                    ZIP,
                    function1_1.runtime,
                    function1_1.handler,
                    ANY,
                    function1_1.metadata,
                ),
                call(
                    function2.name,
                    function2.codeuri,
                    ZIP,
                    function2.runtime,
                    function2.handler,
                    ANY,
                    function2.metadata,
                ),
            ],
            any_order=True,
        )
Beispiel #3
0
class TestApplicationBuilder_build_function(TestCase):
    def setUp(self):
        self.builder = ApplicationBuilder(Mock(), "/build/dir", "/base/dir",
                                          "cachedir")

    @patch("samcli.lib.build.app_builder.get_workflow_config")
    @patch("samcli.lib.build.app_builder.osutils")
    def test_must_build_in_process(self, osutils_mock,
                                   get_workflow_config_mock):
        function_name = "function_name"
        codeuri = "path/to/source"
        packagetype = ZIP
        runtime = "runtime"
        scratch_dir = "scratch"
        handler = "handler.handle"
        config_mock = get_workflow_config_mock.return_value = Mock()
        config_mock.manifest_name = "manifest_name"

        osutils_mock.mkdir_temp.return_value.__enter__ = Mock(
            return_value=scratch_dir)
        osutils_mock.mkdir_temp.return_value.__exit__ = Mock()

        self.builder._build_function_in_process = Mock()

        code_dir = str(Path("/base/dir/path/to/source").resolve())
        artifacts_dir = str(Path("/build/dir/function_name"))
        manifest_path = str(
            Path(os.path.join(code_dir, config_mock.manifest_name)).resolve())

        self.builder._build_function(function_name, codeuri, ZIP, runtime,
                                     handler, artifacts_dir)

        self.builder._build_function_in_process.assert_called_with(
            config_mock, code_dir, artifacts_dir, scratch_dir, manifest_path,
            runtime, None)

    @patch("samcli.lib.build.app_builder.get_workflow_config")
    @patch("samcli.lib.build.app_builder.osutils")
    def test_must_build_in_process_with_metadata(self, osutils_mock,
                                                 get_workflow_config_mock):
        function_name = "function_name"
        codeuri = "path/to/source"
        runtime = "runtime"
        packagetype = ZIP
        scratch_dir = "scratch"
        handler = "handler.handle"
        config_mock = get_workflow_config_mock.return_value = Mock()
        config_mock.manifest_name = "manifest_name"

        osutils_mock.mkdir_temp.return_value.__enter__ = Mock(
            return_value=scratch_dir)
        osutils_mock.mkdir_temp.return_value.__exit__ = Mock()

        self.builder._build_function_in_process = Mock()

        code_dir = str(Path("/base/dir/path/to/source").resolve())
        artifacts_dir = str(Path("/build/dir/function_name"))
        manifest_path = str(
            Path(os.path.join(code_dir, config_mock.manifest_name)).resolve())

        self.builder._build_function(function_name,
                                     codeuri,
                                     packagetype,
                                     runtime,
                                     handler,
                                     artifacts_dir,
                                     metadata={"BuildMethod": "Workflow"})

        get_workflow_config_mock.assert_called_with(
            runtime,
            code_dir,
            self.builder._base_dir,
            specified_workflow="Workflow")

        self.builder._build_function_in_process.assert_called_with(
            config_mock, code_dir, artifacts_dir, scratch_dir, manifest_path,
            runtime, None)

    @patch("samcli.lib.build.app_builder.get_workflow_config")
    @patch("samcli.lib.build.app_builder.osutils")
    def test_must_build_in_container(self, osutils_mock,
                                     get_workflow_config_mock):
        function_name = "function_name"
        codeuri = "path/to/source"
        runtime = "runtime"
        packagetype = ZIP
        scratch_dir = "scratch"
        handler = "handler.handle"
        config_mock = get_workflow_config_mock.return_value = Mock()
        config_mock.manifest_name = "manifest_name"

        osutils_mock.mkdir_temp.return_value.__enter__ = Mock(
            return_value=scratch_dir)
        osutils_mock.mkdir_temp.return_value.__exit__ = Mock()

        self.builder._build_function_on_container = Mock()

        code_dir = str(Path("/base/dir/path/to/source").resolve())
        artifacts_dir = str(Path("/build/dir/function_name"))
        manifest_path = str(
            Path(os.path.join(code_dir, config_mock.manifest_name)).resolve())

        # Settting the container manager will make us use the container
        self.builder._container_manager = Mock()
        self.builder._build_function(function_name, codeuri, packagetype,
                                     runtime, handler, artifacts_dir)

        self.builder._build_function_on_container.assert_called_with(
            config_mock, code_dir, artifacts_dir, scratch_dir, manifest_path,
            runtime, None)
class TestApplicationBuilder_build_function(TestCase):

    def setUp(self):
        self.builder = ApplicationBuilder(Mock(),
                                          "/build/dir",
                                          "/base/dir")

    @patch("samcli.lib.build.app_builder.get_workflow_config")
    @patch("samcli.lib.build.app_builder.osutils")
    def test_must_build_in_process(self, osutils_mock, get_workflow_config_mock):
        function_name = "function_name"
        codeuri = "path/to/source"
        runtime = "runtime"
        scratch_dir = "scratch"
        config_mock = get_workflow_config_mock.return_value = Mock()
        config_mock.manifest_name = "manifest_name"

        osutils_mock.mkdir_temp.return_value.__enter__ = Mock(return_value=scratch_dir)
        osutils_mock.mkdir_temp.return_value.__exit__ = Mock()

        self.builder._build_function_in_process = Mock()

        code_dir = "/base/dir/path/to/source"
        artifacts_dir = "/build/dir/function_name"
        manifest_path = os.path.join(code_dir, config_mock.manifest_name)

        self.builder._build_function(function_name, codeuri, runtime)

        self.builder._build_function_in_process.assert_called_with(config_mock,
                                                                   code_dir,
                                                                   artifacts_dir,
                                                                   scratch_dir,
                                                                   manifest_path,
                                                                   runtime)

    @patch("samcli.lib.build.app_builder.get_workflow_config")
    @patch("samcli.lib.build.app_builder.osutils")
    def test_must_build_in_container(self, osutils_mock, get_workflow_config_mock):
        function_name = "function_name"
        codeuri = "path/to/source"
        runtime = "runtime"
        scratch_dir = "scratch"
        config_mock = get_workflow_config_mock.return_value = Mock()
        config_mock.manifest_name = "manifest_name"

        osutils_mock.mkdir_temp.return_value.__enter__ = Mock(return_value=scratch_dir)
        osutils_mock.mkdir_temp.return_value.__exit__ = Mock()

        self.builder._build_function_on_container = Mock()

        code_dir = "/base/dir/path/to/source"
        artifacts_dir = "/build/dir/function_name"
        manifest_path = os.path.join(code_dir, config_mock.manifest_name)

        # Settting the container manager will make us use the container
        self.builder._container_manager = Mock()
        self.builder._build_function(function_name, codeuri, runtime)

        self.builder._build_function_on_container.assert_called_with(config_mock,
                                                                     code_dir,
                                                                     artifacts_dir,
                                                                     scratch_dir,
                                                                     manifest_path,
                                                                     runtime)