Path: blob/develop/tests/functional/awslambda/test_function.py
1567 views
# Copyright 2015 Amazon.com, Inc. or its affiliates. All Rights Reserved.1#2# Licensed under the Apache License, Version 2.0 (the "License"). You3# may not use this file except in compliance with the License. A copy of4# the License is located at5#6# http://aws.amazon.com/apache2.0/7#8# or in the "license" file accompanying this file. This file is9# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF10# ANY KIND, either express or implied. See the License for the specific11# language governing permissions and limitations under the License.12import os13import zipfile14from contextlib import closing1516from awscli.testutils import BaseAWSCommandParamsTest17from awscli.testutils import FileCreator181920class BaseLambdaTests(BaseAWSCommandParamsTest):2122def setUp(self):23super(BaseLambdaTests, self).setUp()24self.files = FileCreator()25self.temp_file = self.files.create_file(26'foo', 'mycontents')27self.zip_file = os.path.join(self.files.rootdir, 'foo.zip')28with closing(zipfile.ZipFile(self.zip_file, 'w')) as f:29f.write(self.temp_file)30with open(self.zip_file, 'rb') as f:31self.zip_file_contents = f.read()3233def tearDown(self):34super(BaseLambdaTests, self).tearDown()35self.files.remove_all()363738class TestCreateFunction(BaseLambdaTests):3940prefix = 'lambda create-function'4142def test_create_function_with_file(self):43cmdline = self.prefix44cmdline += ' --function-name myfunction --runtime myruntime'45cmdline += ' --role myrole --handler myhandler'46cmdline += ' --zip-file fileb://%s' % self.zip_file47result = {48'FunctionName': 'myfunction',49'Runtime': 'myruntime',50'Role': 'myrole',51'Handler': 'myhandler',52'Code': {'ZipFile': self.zip_file_contents}53}54self.assert_params_for_cmd(cmdline, result)5556def test_create_function_with_code_argument(self):57cmdline = self.prefix58cmdline += ' --function-name myfunction --runtime myruntime'59cmdline += ' --role myrole --handler myhandler'60cmdline += ' --code S3Bucket=mybucket,S3Key=mykey,S3ObjectVersion=vs'61result = {62'FunctionName': 'myfunction',63'Runtime': 'myruntime',64'Role': 'myrole',65'Handler': 'myhandler',66'Code': {'S3Bucket': 'mybucket',67'S3Key': 'mykey',68'S3ObjectVersion': 'vs'}69}70self.assert_params_for_cmd(cmdline, result)7172def test_create_function_with_code_and_zipfile_argument(self):73cmdline = self.prefix74cmdline += ' --function-name myfunction --runtime myruntime'75cmdline += ' --role myrole --handler myhandler'76cmdline += ' --code S3Bucket=mybucket,S3Key=mykey,S3ObjectVersion=vs'77cmdline += ' --zip-file fileb://%s' % self.zip_file78result = {79'FunctionName': 'myfunction',80'Runtime': 'myruntime',81'Role': 'myrole',82'Handler': 'myhandler',83'Code': {'S3Bucket': 'mybucket',84'S3Key': 'mykey',85'S3ObjectVersion': 'vs',86'ZipFile': self.zip_file_contents}87}88self.assert_params_for_cmd(cmdline, result)8990def test_create_function_with_zip_file_in_code_argument(self):91cmdline = self.prefix92cmdline += ' --function-name myfunction --runtime myruntime'93cmdline += ' --role myrole --handler myhandler'94cmdline += ' --code S3Bucket=mybucket,S3Key=mykey,S3ObjectVersion=vs,'95cmdline += 'ZipFile=foo'96stdout, stderr, rc = self.run_cmd(cmdline, expected_rc=255)97self.assertIn('ZipFile cannot be provided as part of the --code',98stderr)99100def test_create_function_with_invalid_file_contents(self):101cmdline = self.prefix102cmdline += ' --function-name myfunction --runtime myruntime'103cmdline += ' --role myrole --handler myhandler'104cmdline += ' --zip-file filename_instead_of_contents.zip'105stdout, stderr, rc = self.run_cmd(cmdline, expected_rc=255)106self.assertIn('must be a zip file with the fileb:// prefix', stderr)107# Should also give a pointer to fileb:// for them.108self.assertIn('fileb://', stderr)109110def test_not_using_fileb_prefix(self):111cmdline = self.prefix112cmdline += ' --function-name myfunction --runtime myruntime'113cmdline += ' --role myrole --handler myhandler'114# Note file:// instead of fileb://115cmdline += ' --zip-file file://%s' % self.zip_file116stdout, stderr, rc = self.run_cmd(cmdline, expected_rc=255)117# Ensure we mention fileb:// to give the user an idea of118# where to go next.119self.assertIn('fileb://', stderr)120121122class TestPublishLayerVersion(BaseLambdaTests):123124prefix = 'lambda publish-layer-version'125126def test_publish_layer_version_with_file(self):127cmdline = self.prefix128cmdline += ' --layer-name mylayer'129cmdline += ' --zip-file fileb://%s' % self.zip_file130result = {131'LayerName': 'mylayer',132'Content': {'ZipFile': self.zip_file_contents}133}134self.assert_params_for_cmd(cmdline, result)135136def test_publish_layer_version_with_content_argument(self):137cmdline = self.prefix138cmdline += ' --layer-name mylayer'139cmdline += ' --content'140cmdline += ' S3Bucket=mybucket,S3Key=mykey,S3ObjectVersion=vs'141result = {142'LayerName': 'mylayer',143'Content': {'S3Bucket': 'mybucket',144'S3Key': 'mykey',145'S3ObjectVersion': 'vs'}146}147self.assert_params_for_cmd(cmdline, result)148149def test_publish_layer_version_with_content_and_zipfile_argument(self):150cmdline = self.prefix151cmdline += ' --layer-name mylayer'152cmdline += ' --content'153cmdline += ' S3Bucket=mybucket,S3Key=mykey,S3ObjectVersion=vs'154cmdline += ' --zip-file fileb://%s' % self.zip_file155result = {156'LayerName': 'mylayer',157'Content': {'S3Bucket': 'mybucket',158'S3Key': 'mykey',159'S3ObjectVersion': 'vs',160'ZipFile': self.zip_file_contents}161}162self.assert_params_for_cmd(cmdline, result)163164def test_publish_layer_version_with_zip_file_in_content_argument(self):165cmdline = self.prefix166cmdline += ' --layer-name mylayer'167cmdline += ' --content'168cmdline += ' S3Bucket=mybucket,S3Key=mykey,S3ObjectVersion=vs,'169cmdline += 'ZipFile=foo'170stdout, stderr, rc = self.run_cmd(cmdline, expected_rc=255)171self.assertIn('ZipFile cannot be provided as part of the --content',172stderr)173174def test_publish_layer_version_with_invalid_file_contents(self):175cmdline = self.prefix176cmdline += ' --layer-name mylayer'177cmdline += ' --zip-file filename_instead_of_contents.zip'178stdout, stderr, rc = self.run_cmd(cmdline, expected_rc=255)179self.assertIn('must be a zip file with the fileb:// prefix', stderr)180# Should also give a pointer to fileb:// for them.181self.assertIn('fileb://', stderr)182183def test_not_using_fileb_prefix(self):184cmdline = self.prefix185cmdline += ' --layer-name mylayer'186# Note file:// instead of fileb://187cmdline += ' --zip-file file://%s' % self.zip_file188stdout, stderr, rc = self.run_cmd(cmdline, expected_rc=255)189# Ensure we mention fileb:// to give the user an idea of190# where to go next.191self.assertIn('fileb://', stderr)192193194class TestUpdateFunctionCode(BaseLambdaTests):195196prefix = 'lambda update-function-code'197198def test_not_using_fileb_prefix(self):199cmdline = self.prefix + ' --function-name foo'200cmdline += ' --zip-file filename_instead_of_contents.zip'201stdout, stderr, rc = self.run_cmd(cmdline, expected_rc=255)202self.assertIn('must be a zip file with the fileb:// prefix', stderr)203# Should also give a pointer to fileb:// for them.204self.assertIn('fileb://', stderr)205206def test_using_fileb_prefix_succeeds(self):207cmdline = self.prefix208cmdline += ' --function-name myfunction'209cmdline += ' --zip-file fileb://%s' % self.zip_file210result = {211'FunctionName': 'myfunction',212'ZipFile': self.zip_file_contents,213}214self.assert_params_for_cmd(cmdline, result)215216217