def test_must_invoke(self): input_event = '"some data"' expected_env_vars = { "var1": "override_value1", "var2": "shell_env_value2" } manager = ContainerManager() local_runtime = LambdaRuntime(manager) runner = LocalLambdaRunner(local_runtime, self.mock_function_provider, self.cwd, self.env_var_overrides, debug_args=None, debug_port=None, aws_profile=None) # Append the real AWS credentials to the expected values. creds = runner.get_aws_creds() # default value for creds is not configured by the test. But coming from a downstream class expected_env_vars["AWS_SECRET_ACCESS_KEY"] = creds.get("secret", "defaultsecret") expected_env_vars["AWS_ACCESS_KEY_ID"] = creds.get("key", "defaultkey") expected_env_vars["AWS_REGION"] = creds.get("region", "us-east-1") stdout_stream = io.BytesIO() stderr_stream = io.BytesIO() runner.invoke(self.function_name, input_event, stdout=stdout_stream, stderr=stderr_stream) # stderr is where the Lambda container runtime logs are available. It usually contains requestId, start time # etc. So it is non-zero in size self.assertGreater(len(stderr_stream.getvalue().strip()), 0, "stderr stream must contain data") # This should contain all the environment variables passed to the function actual_output = json.loads(stdout_stream.getvalue().strip().decode('utf-8')) for key, value in expected_env_vars.items(): self.assertTrue(key in actual_output, "Key '{}' must be in function output".format(key)) self.assertEquals(actual_output.get(key), value)
class TestLocalLambda_invoke(TestCase): def setUp(self): self.runtime_mock = Mock() self.function_provider_mock = Mock() self.cwd = "/my/current/working/directory" self.debug_context = None self.aws_profile = "myprofile" self.aws_region = "region" self.env_vars_values = {} self.local_lambda = LocalLambdaRunner( self.runtime_mock, self.function_provider_mock, self.cwd, env_vars_values=self.env_vars_values, debug_context=self.debug_context, ) def test_must_work(self): name = "name" event = "event" stdout = "stdout" stderr = "stderr" function = Mock(functionname="name") invoke_config = "config" self.function_provider_mock.get_all.return_value = [function] self.local_lambda._get_invoke_config = Mock() self.local_lambda._get_invoke_config.return_value = invoke_config self.local_lambda.invoke(name, event, stdout, stderr) self.runtime_mock.invoke.assert_called_with(invoke_config, event, debug_context=None, stdout=stdout, stderr=stderr) def test_must_raise_if_function_not_found(self): function = Mock() function.name = "name" function.functionname = "FunctionLogicalId" self.function_provider_mock.get.return_value = None # function not found self.function_provider_mock.get_all.return_value = [function] with self.assertRaises(FunctionNotFound): self.local_lambda.invoke("name", "event")
class TestLocalLambda_invoke_with_container_host_option(TestCase): def setUp(self): self.runtime_mock = Mock() self.function_provider_mock = Mock() self.cwd = "/my/current/working/directory" self.debug_context = None self.aws_profile = "myprofile" self.aws_region = "region" self.env_vars_values = {} self.container_host = "localhost" self.container_host_interface = "127.0.0.1" self.local_lambda = LocalLambdaRunner( self.runtime_mock, self.function_provider_mock, self.cwd, env_vars_values=self.env_vars_values, debug_context=self.debug_context, container_host=self.container_host, container_host_interface=self.container_host_interface, ) def test_must_work(self): name = "name" event = "event" stdout = "stdout" stderr = "stderr" function = Mock(functionname="name") invoke_config = "config" self.function_provider_mock.get_all.return_value = [function] self.local_lambda.get_invoke_config = Mock() self.local_lambda.get_invoke_config.return_value = invoke_config self.local_lambda.invoke(name, event, stdout, stderr) self.runtime_mock.invoke.assert_called_with( invoke_config, event, debug_context=None, stdout=stdout, stderr=stderr, container_host="localhost", container_host_interface="127.0.0.1", )
class TestLocalLambda_invoke(TestCase): def setUp(self): self.runtime_mock = Mock() self.function_provider_mock = Mock() self.cwd = "/my/current/working/directory" self.debug_context = None self.aws_profile = "myprofile" self.aws_region = "region" self.env_vars_values = {} self.local_lambda = LocalLambdaRunner(self.runtime_mock, self.function_provider_mock, self.cwd, env_vars_values=self.env_vars_values, debug_context=self.debug_context) def test_must_work(self): name = "name" event = "event" stdout = "stdout" stderr = "stderr" function = Mock() invoke_config = "config" self.function_provider_mock.get.return_value = function self.local_lambda._get_invoke_config = Mock() self.local_lambda._get_invoke_config.return_value = invoke_config self.local_lambda.invoke(name, event, stdout, stderr) self.runtime_mock.invoke.assert_called_with(invoke_config, event, debug_context=None, stdout=stdout, stderr=stderr) def test_must_raise_if_function_not_found(self): function = Mock() function.name = 'FunctionLogicalId' self.function_provider_mock.get.return_value = None # function not found self.function_provider_mock.get_all.return_value = [function] with self.assertRaises(FunctionNotFound): self.local_lambda.invoke("name", "event")
class TestLocalLambda_invoke(TestCase): def setUp(self): self.runtime_mock = Mock() self.function_provider_mock = Mock() self.cwd = "/my/current/working/directory" self.debug_port = 123 self.debug_args = "abc" self.aws_profile = "myprofile" self.env_vars_values = {} self.local_lambda = LocalLambdaRunner(self.runtime_mock, self.function_provider_mock, self.cwd, self.env_vars_values, self.debug_port, self.debug_args, self.aws_profile) def test_must_work(self): name = "name" event = "event" stdout = "stdout" stderr = "stderr" function = Mock() invoke_config = "config" self.function_provider_mock.get.return_value = function self.local_lambda._get_invoke_config = Mock() self.local_lambda._get_invoke_config.return_value = invoke_config self.local_lambda.invoke(name, event, stdout, stderr) self.runtime_mock.invoke.assert_called_with(invoke_config, event, debug_port=self.debug_port, debug_args=self.debug_args, stdout=stdout, stderr=stderr) def test_must_raise_if_function_not_found(self): self.function_provider_mock.get.return_value = None # function not found with self.assertRaises(FunctionNotFound): self.local_lambda.invoke("name", "event")
def test_must_invoke(self): input_event = '"some data"' expected_env_vars = { "var1": "override_value1", "var2": "shell_env_value2" } manager = ContainerManager() layer_downloader = LayerDownloader("./", "./") lambda_image = LambdaImage(layer_downloader, False, False) local_runtime = LambdaRuntime(manager, lambda_image) runner = LocalLambdaRunner(local_runtime, self.mock_function_provider, self.cwd, self.env_var_overrides, debug_context=None) # Append the real AWS credentials to the expected values. creds = runner.get_aws_creds() # default value for creds is not configured by the test. But coming from a downstream class expected_env_vars["AWS_SECRET_ACCESS_KEY"] = creds.get("secret", "defaultsecret") expected_env_vars["AWS_ACCESS_KEY_ID"] = creds.get("key", "defaultkey") expected_env_vars["AWS_REGION"] = creds.get("region", "us-east-1") stdout_stream = io.BytesIO() stderr_stream = io.BytesIO() stdout_stream_writer = StreamWriter(stdout_stream) stderr_stream_writer = StreamWriter(stderr_stream) runner.invoke(self.function_name, input_event, stdout=stdout_stream_writer, stderr=stderr_stream_writer) # stderr is where the Lambda container runtime logs are available. It usually contains requestId, start time # etc. So it is non-zero in size self.assertGreater(len(stderr_stream.getvalue().strip()), 0, "stderr stream must contain data") # This should contain all the environment variables passed to the function actual_output = json.loads(stdout_stream.getvalue().strip().decode('utf-8')) for key, value in expected_env_vars.items(): self.assertTrue(key in actual_output, "Key '{}' must be in function output".format(key)) self.assertEqual(actual_output.get(key), value)
class TestLocalLambda_invoke(TestCase): def setUp(self): self.runtime_mock = Mock() self.function_provider_mock = Mock() self.cwd = "/my/current/working/directory" self.debug_context = None self.aws_profile = "myprofile" self.aws_region = "region" self.env_vars_values = {} self.local_lambda = LocalLambdaRunner( self.runtime_mock, self.function_provider_mock, self.cwd, env_vars_values=self.env_vars_values, debug_context=self.debug_context, ) def test_must_work(self): name = "name" event = "event" stdout = "stdout" stderr = "stderr" function = Mock(functionname="name") invoke_config = "config" self.function_provider_mock.get_all.return_value = [function] self.local_lambda.get_invoke_config = Mock() self.local_lambda.get_invoke_config.return_value = invoke_config self.local_lambda.invoke(name, event, stdout, stderr) self.runtime_mock.invoke.assert_called_with(invoke_config, event, debug_context=None, stdout=stdout, stderr=stderr) def test_must_work_packagetype_ZIP(self): name = "name" event = "event" stdout = "stdout" stderr = "stderr" function = Mock(functionname="name", handler="app.handler", runtime="test", packagetype=ZIP) invoke_config = "config" self.function_provider_mock.get.return_value = function self.local_lambda.get_invoke_config = Mock() self.local_lambda.get_invoke_config.return_value = invoke_config self.local_lambda.invoke(name, event, stdout, stderr) self.runtime_mock.invoke.assert_called_with(invoke_config, event, debug_context=None, stdout=stdout, stderr=stderr) def test_must_raise_if_no_privilege(self): function = Mock() function.name = "name" function.functionname = "FunctionLogicalId" invoke_config = "config" self.function_provider_mock.get_all.return_value = [function] self.local_lambda.get_invoke_config = Mock() self.local_lambda.get_invoke_config.return_value = invoke_config os_error = OSError() os_error.winerror = 1314 self.runtime_mock.invoke.side_effect = os_error with self.assertRaises(NoPrivilegeException): self.local_lambda.invoke("name", "event") def test_must_raise_os_error(self): function = Mock() function.name = "name" function.functionname = "FunctionLogicalId" invoke_config = "config" self.function_provider_mock.get_all.return_value = [function] self.local_lambda.get_invoke_config = Mock() self.local_lambda.get_invoke_config.return_value = invoke_config os_error = OSError() os_error.winerror = 1315 self.runtime_mock.invoke.side_effect = os_error with self.assertRaises(OSError): self.local_lambda.invoke("name", "event") def test_must_raise_if_function_not_found(self): function = Mock() function.name = "name" function.functionname = "FunctionLogicalId" self.function_provider_mock.get.return_value = None # function not found self.function_provider_mock.get_all.return_value = [function] with self.assertRaises(FunctionNotFound): self.local_lambda.invoke("name", "event") def test_must_not_raise_if_invoked_container_has_no_response(self): function = Mock() function.name = "name" function.functionname = "FunctionLogicalId" invoke_config = "invoke_config" self.function_provider_mock.get.return_value = function self.local_lambda.get_invoke_config = Mock() self.local_lambda.get_invoke_config.return_value = invoke_config self.runtime_mock.invoke = Mock(side_effect=ContainerResponseException) # No exception raised back self.local_lambda.invoke("name", "event") def test_works_if_imageuri_and_Image_packagetype(self): name = "name" event = "event" stdout = "stdout" stderr = "stderr" function = Mock(functionname="name", packagetype=IMAGE, imageuri="testimage:tag") invoke_config = "config" self.function_provider_mock.get.return_value = function self.local_lambda.get_invoke_config = Mock() self.local_lambda.get_invoke_config.return_value = invoke_config self.local_lambda.invoke(name, event, stdout, stderr) self.runtime_mock.invoke.assert_called_with(invoke_config, event, debug_context=None, stdout=stdout, stderr=stderr) def test_must_raise_if_imageuri_not_found(self): name = "name" event = "event" stdout = "stdout" stderr = "stderr" function = Mock(functionname="name", packagetype=IMAGE, imageuri=None) self.function_provider_mock.get.return_value = function with self.assertRaises(InvalidIntermediateImageError): self.local_lambda.invoke(name, event, stdout, stderr)