Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
aws
GitHub Repository: aws/aws-cli
Path: blob/develop/tests/unit/customizations/test_codecommit.py
1567 views
1
# Copyright 2015 Amazon.com, Inc. or its affiliates. All Rights Reserved.
2
#
3
# Licensed under the Apache License, Version 2.0 (the "License"). You
4
# may not use this file except in compliance with the License. A copy of
5
# the License is located at
6
#
7
# http://aws.amazon.com/apache2.0/
8
#
9
# or in the "license" file accompanying this file. This file is
10
# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
11
# ANY KIND, either express or implied. See the License for the specific
12
# language governing permissions and limitations under the License.
13
14
import awscli
15
16
from argparse import Namespace
17
from botocore.session import Session
18
from botocore.credentials import Credentials
19
from awscli.customizations.codecommit import CodeCommitGetCommand
20
from awscli.customizations.codecommit import CodeCommitCommand
21
from awscli.testutils import mock, unittest, StringIOWithFileNo
22
from awscli.compat import StringIO
23
24
from botocore.auth import SigV4Auth
25
from botocore.awsrequest import AWSRequest
26
27
28
class TestCodeCommitCredentialHelper(unittest.TestCase):
29
30
PROTOCOL_HOST_PATH = ('protocol=https\n'
31
'host=git-codecommit.us-east-1.amazonaws.com\n'
32
'path=/v1/repos/myrepo')
33
34
PROTOCOL_HOST_PATH_TRAILING_NEWLINE = ('protocol=https\n'
35
'host=git-codecommit.us-east-1.amazonaws.com\n'
36
'path=/v1/repos/myrepo\n')
37
38
PROTOCOL_HOST_PATH_BLANK_LINE = ('protocol=https\n'
39
'host=git-codecommit.us-east-1.amazonaws.com\n'
40
'path=/v1/repos/myrepo\n\n')
41
42
FIPS_PROTOCOL_HOST_PATH = ('protocol=https\n'
43
'host=git-codecommit-fips.us-east-1.amazonaws.com\n'
44
'path=/v1/repos/myrepo')
45
46
VPC_1_PROTOCOL_HOST_PATH = ('protocol=https\n'
47
'host=vpce-0b47ea360adebf88a-jkl88hez.git-codecommit.us-east-1.vpce.amazonaws.com\n'
48
'path=/v1/repos/myrepo')
49
50
VPC_2_PROTOCOL_HOST_PATH = ('protocol=https\n'
51
'host=vpce-0b47ea360adebf88a-jkl88hez-us-east-1a.git-codecommit.us-east-1.vpce.amazonaws.com\n'
52
'path=/v1/repos/myrepo')
53
54
FIPS_VPC_1_PROTOCOL_HOST_PATH = ('protocol=https\n'
55
'host=vpce-0b47ea360adebf88a-jkl88hez.git-codecommit-fips.us-east-1.vpce.amazonaws.com\n'
56
'path=/v1/repos/myrepo')
57
58
FIPS_VPC_2_PROTOCOL_HOST_PATH = ('protocol=https\n'
59
'host=vpce-0b47ea360adebf88a-jkl88hez-us-west-2b.git-codecommit-fips.us-east-1.vpce.amazonaws.com\n'
60
'path=/v1/repos/myrepo')
61
62
NO_REGION_PROTOCOL_HOST_PATH = ('protocol=https\n'
63
'host=git-codecommit.amazonaws.com\n'
64
'path=/v1/repos/myrepo')
65
66
NON_AWS_PROTOCOL_HOST_PATH = ('protocol=https\n'
67
'host=mydomain.com\n'
68
'path=/v1/repos/myrepo')
69
70
MOCK_STDOUT_CLASS = StringIOWithFileNo
71
72
def setUp(self):
73
self.credentials = Credentials('access', 'secret')
74
self.args = Namespace()
75
self.args.ignore_host_check = False
76
self.globals = Namespace()
77
self.globals.region = 'us-east-1'
78
self.globals.verify_ssl = False
79
self.session = mock.MagicMock()
80
self.session.get_config_variable.return_value = 'us-east-1'
81
self.session.get_credentials.return_value = self.credentials
82
83
@mock.patch('sys.stdout', new_callable=MOCK_STDOUT_CLASS)
84
@mock.patch('sys.stdin', StringIO(PROTOCOL_HOST_PATH))
85
def test_generate_credentials(self, stdout_mock):
86
self.get_command = CodeCommitGetCommand(self.session)
87
self.get_command._run_main(self.args, self.globals)
88
output = stdout_mock.getvalue().strip()
89
self.assertRegex(
90
output, 'username={0}\npassword=.+'.format('access'))
91
92
@mock.patch('sys.stdout', new_callable=MOCK_STDOUT_CLASS)
93
@mock.patch('sys.stdin', StringIO(PROTOCOL_HOST_PATH_TRAILING_NEWLINE))
94
def test_generate_credentials_trailing_newline(self, stdout_mock):
95
self.get_command = CodeCommitGetCommand(self.session)
96
self.get_command._run_main(self.args, self.globals)
97
output = stdout_mock.getvalue().strip()
98
self.assertRegex(
99
output, 'username={0}\npassword=.+'.format('access'))
100
101
@mock.patch('sys.stdout', new_callable=MOCK_STDOUT_CLASS)
102
@mock.patch('sys.stdin', StringIO(PROTOCOL_HOST_PATH_BLANK_LINE))
103
def test_generate_credentials_blank_line(self, stdout_mock):
104
self.get_command = CodeCommitGetCommand(self.session)
105
self.get_command._run_main(self.args, self.globals)
106
output = stdout_mock.getvalue().strip()
107
self.assertRegex(
108
output, 'username={0}\npassword=.+'.format('access'))
109
110
@mock.patch('sys.stdout', new_callable=MOCK_STDOUT_CLASS)
111
@mock.patch('sys.stdin', StringIO(FIPS_PROTOCOL_HOST_PATH))
112
def test_generate_credentials_fips_reads_region_from_url(self, stdout_mock):
113
self.globals.region = None
114
self.session.get_config_variable.return_value = None
115
self.get_command = CodeCommitGetCommand(self.session)
116
self.get_command._run_main(self.args, self.globals)
117
output = stdout_mock.getvalue().strip()
118
self.assertRegex(
119
output, 'username={0}\npassword=.+'.format('access'))
120
121
@mock.patch('sys.stdout', new_callable=MOCK_STDOUT_CLASS)
122
@mock.patch('sys.stdin', StringIO(VPC_1_PROTOCOL_HOST_PATH))
123
def test_generate_credentials_vpc_reads_region_from_url(self, stdout_mock):
124
self.globals.region = None
125
self.session.get_config_variable.return_value = None
126
self.get_command = CodeCommitGetCommand(self.session)
127
self.get_command._run_main(self.args, self.globals)
128
output = stdout_mock.getvalue().strip()
129
self.assertRegex(
130
output, 'username={0}\npassword=.+'.format('access'))
131
132
@mock.patch('sys.stdout', new_callable=MOCK_STDOUT_CLASS)
133
@mock.patch('sys.stdin', StringIO(VPC_2_PROTOCOL_HOST_PATH))
134
def test_generate_credentials_vpc_2_reads_region_from_url(self, stdout_mock):
135
self.globals.region = None
136
self.session.get_config_variable.return_value = None
137
self.get_command = CodeCommitGetCommand(self.session)
138
self.get_command._run_main(self.args, self.globals)
139
output = stdout_mock.getvalue().strip()
140
self.assertRegex(
141
output, 'username={0}\npassword=.+'.format('access'))
142
143
@mock.patch('sys.stdout', new_callable=MOCK_STDOUT_CLASS)
144
@mock.patch('sys.stdin', StringIO(FIPS_VPC_1_PROTOCOL_HOST_PATH))
145
def test_generate_credentials_fips_vpc_1_reads_region_from_url(self, stdout_mock):
146
self.globals.region = None
147
self.session.get_config_variable.return_value = None
148
self.get_command = CodeCommitGetCommand(self.session)
149
self.get_command._run_main(self.args, self.globals)
150
output = stdout_mock.getvalue().strip()
151
self.assertRegex(
152
output, 'username={0}\npassword=.+'.format('access'))
153
154
@mock.patch('sys.stdout', new_callable=MOCK_STDOUT_CLASS)
155
@mock.patch('sys.stdin', StringIO(FIPS_VPC_2_PROTOCOL_HOST_PATH))
156
def test_generate_credentials_fips_vpc_2_reads_region_from_url(self, stdout_mock):
157
self.globals.region = None
158
self.session.get_config_variable.return_value = None
159
self.get_command = CodeCommitGetCommand(self.session)
160
self.get_command._run_main(self.args, self.globals)
161
output = stdout_mock.getvalue().strip()
162
self.assertRegex(
163
output, 'username={0}\npassword=.+'.format('access'))
164
165
@mock.patch('sys.stdout', new_callable=MOCK_STDOUT_CLASS)
166
@mock.patch('sys.stdin', StringIO(NO_REGION_PROTOCOL_HOST_PATH))
167
def test_generate_credentials_reads_region_from_session(self, stdout_mock):
168
self.get_command = CodeCommitGetCommand(self.session)
169
self.get_command._run_main(self.args, self.globals)
170
output = stdout_mock.getvalue().strip()
171
self.assertRegex(
172
output, 'username={0}\npassword=.+'.format('access'))
173
174
@mock.patch('sys.stdout', new_callable=MOCK_STDOUT_CLASS)
175
@mock.patch('sys.stdin', StringIO(NON_AWS_PROTOCOL_HOST_PATH))
176
def test_does_nothing_for_non_amazon_domain(self, stdout_mock):
177
self.get_command = CodeCommitGetCommand(self.session)
178
self.get_command._run_main(self.args, self.globals)
179
output = stdout_mock.getvalue().strip()
180
self.assertEqual('', output)
181
182
def test_raises_value_error_when_not_provided_any_subcommands(self):
183
self.get_command = CodeCommitCommand(self.session)
184
with self.assertRaises(ValueError):
185
self.get_command._run_main(self.args, self.globals)
186
187
@mock.patch('sys.stdout', new_callable=MOCK_STDOUT_CLASS)
188
@mock.patch('sys.stdin', StringIO(PROTOCOL_HOST_PATH))
189
def test_generate_session_credentials(self, stdout_mock):
190
self.credentials = Credentials('access', 'secret', 'token')
191
self.session.get_credentials.return_value = self.credentials
192
self.get_command = CodeCommitGetCommand(self.session)
193
self.get_command._run_main(self.args, self.globals)
194
output = stdout_mock.getvalue().strip()
195
self.assertRegex(
196
output,
197
'username={0}%{1}\npassword=.+'.format('access', 'token'))
198
199
@mock.patch('sys.stdout', MOCK_STDOUT_CLASS())
200
@mock.patch('sys.stdin', StringIO(PROTOCOL_HOST_PATH))
201
@mock.patch('botocore.auth.SigV4Auth.string_to_sign')
202
@mock.patch('botocore.auth.SigV4Auth.signature')
203
def test_generate_credentials_creates_a_valid_request(self, signature,
204
string_to_sign):
205
self.credentials = Credentials('access', 'secret')
206
self.session.get_credentials.return_value = self.credentials
207
self.get_command = CodeCommitGetCommand(self.session)
208
self.get_command._run_main(self.args, self.globals)
209
aws_request = signature.call_args[0][1]
210
self.assertEqual('GIT', aws_request.method)
211
self.assertEqual(
212
'https://git-codecommit.us-east-1.amazonaws.com//v1/repos/myrepo',
213
aws_request.url)
214
self.assertEqual(
215
('GIT\n//v1/repos/myrepo\n\n'
216
'host:git-codecommit.us-east-1.amazonaws.com\n\n'
217
'host\n'),
218
string_to_sign.call_args[0][1])
219
220
if __name__ == "__main__":
221
unittest.main()
222
223