@@ -691,6 +691,48 @@ def test_envvars_not_found(self):
691
691
creds = provider .load ()
692
692
self .assertIsNone (creds )
693
693
694
+ def test_envvars_empty_string (self ):
695
+ environ = {
696
+ 'AWS_ACCESS_KEY_ID' : '' ,
697
+ 'AWS_SECRET_ACCESS_KEY' : '' ,
698
+ 'AWS_SECURITY_TOKEN' : '' ,
699
+ }
700
+ provider = credentials .EnvProvider (environ )
701
+ creds = provider .load ()
702
+ self .assertIsNone (creds )
703
+
704
+ def test_expiry_omitted_if_envvar_empty (self ):
705
+ environ = {
706
+ 'AWS_ACCESS_KEY_ID' : 'foo' ,
707
+ 'AWS_SECRET_ACCESS_KEY' : 'bar' ,
708
+ 'AWS_SESSION_TOKEN' : 'baz' ,
709
+ 'AWS_CREDENTIAL_EXPIRATION' : '' ,
710
+ }
711
+ provider = credentials .EnvProvider (environ )
712
+ creds = provider .load ()
713
+ # Because we treat empty env vars the same as not being provided,
714
+ # we should return static credentials and not a refreshable
715
+ # credential.
716
+ self .assertNotIsInstance (creds , credentials .RefreshableCredentials )
717
+ self .assertEqual (creds .access_key , 'foo' )
718
+ self .assertEqual (creds .secret_key , 'bar' )
719
+ self .assertEqual (creds .token , 'baz' )
720
+
721
+ def test_error_when_expiry_required_but_empty (self ):
722
+ expiry_time = datetime .now (tzlocal ()) - timedelta (hours = 1 )
723
+ environ = {
724
+ 'AWS_ACCESS_KEY_ID' : 'foo' ,
725
+ 'AWS_SECRET_ACCESS_KEY' : 'bar' ,
726
+ 'AWS_CREDENTIAL_EXPIRATION' : expiry_time .isoformat (),
727
+ }
728
+ provider = credentials .EnvProvider (environ )
729
+ creds = provider .load ()
730
+
731
+ del environ ['AWS_CREDENTIAL_EXPIRATION' ]
732
+
733
+ with self .assertRaises (botocore .exceptions .PartialCredentialsError ):
734
+ creds .get_frozen_credentials ()
735
+
694
736
def test_can_override_env_var_mapping (self ):
695
737
# We can change the env var provider to
696
738
# use our specified env var names.
@@ -765,6 +807,18 @@ def test_partial_creds_is_an_error(self):
765
807
with self .assertRaises (botocore .exceptions .PartialCredentialsError ):
766
808
provider .load ()
767
809
810
+ def test_partial_creds_is_an_error_empty_string (self ):
811
+ # If the user provides an access key, they must also
812
+ # provide a secret key. Not doing so will generate an
813
+ # error.
814
+ environ = {
815
+ 'AWS_ACCESS_KEY_ID' : 'foo' ,
816
+ 'AWS_SECRET_ACCESS_KEY' : '' ,
817
+ }
818
+ provider = credentials .EnvProvider (environ )
819
+ with self .assertRaises (botocore .exceptions .PartialCredentialsError ):
820
+ provider .load ()
821
+
768
822
def test_missing_access_key_id_raises_error (self ):
769
823
expiry_time = datetime .now (tzlocal ()) - timedelta (hours = 1 )
770
824
environ = {
@@ -1823,7 +1877,7 @@ def test_external_id_provided(self):
1823
1877
RoleArn = 'myrole' , ExternalId = 'myid' , RoleSessionName = mock .ANY )
1824
1878
1825
1879
def test_assume_role_with_duration (self ):
1826
- self .fake_config ['profiles' ]['development' ]['duration_seconds' ] = 7200
1880
+ self .fake_config ['profiles' ]['development' ]['duration_seconds' ] = 7200
1827
1881
response = {
1828
1882
'Credentials' : {
1829
1883
'AccessKeyId' : 'foo' ,
@@ -1842,7 +1896,7 @@ def test_assume_role_with_duration(self):
1842
1896
1843
1897
client = client_creator .return_value
1844
1898
client .assume_role .assert_called_with (
1845
- RoleArn = 'myrole' , RoleSessionName = mock .ANY ,
1899
+ RoleArn = 'myrole' , RoleSessionName = mock .ANY ,
1846
1900
DurationSeconds = 7200 )
1847
1901
1848
1902
def test_assume_role_with_bad_duration (self ):
0 commit comments