@@ -3963,3 +3963,125 @@ func objectLockPreCheck(t *testing.T) {
39633963 t .Skip ("s3 backend tests using object lock enabled buckets require setting TF_S3_OBJECT_LOCK_TEST" )
39643964 }
39653965}
3966+
3967+ // TestBoolAttrDefaultEnvVarOk tests the boolAttrDefaultEnvVarOk helper function
3968+ // which reads boolean values from environment variables. This is a regression
3969+ // test for https://github.com/hashicorp/terraform/issues/37601 where setting
3970+ // AWS_USE_FIPS_ENDPOINT=false incorrectly enabled FIPS endpoints.
3971+ func TestBoolAttrDefaultEnvVarOk (t * testing.T ) {
3972+ testCases := map [string ]struct {
3973+ attrValue cty.Value
3974+ envValue string
3975+ wantBool bool
3976+ wantOk bool
3977+ }{
3978+ "attr set true" : {
3979+ attrValue : cty .BoolVal (true ),
3980+ envValue : "" ,
3981+ wantBool : true ,
3982+ wantOk : true ,
3983+ },
3984+ "attr set false" : {
3985+ attrValue : cty .BoolVal (false ),
3986+ envValue : "" ,
3987+ wantBool : false ,
3988+ wantOk : true ,
3989+ },
3990+ "attr null, env true" : {
3991+ attrValue : cty .NullVal (cty .Bool ),
3992+ envValue : "true" ,
3993+ wantBool : true ,
3994+ wantOk : true ,
3995+ },
3996+ "attr null, env TRUE" : {
3997+ attrValue : cty .NullVal (cty .Bool ),
3998+ envValue : "TRUE" ,
3999+ wantBool : true ,
4000+ wantOk : true ,
4001+ },
4002+ "attr null, env True" : {
4003+ attrValue : cty .NullVal (cty .Bool ),
4004+ envValue : "True" ,
4005+ wantBool : true ,
4006+ wantOk : true ,
4007+ },
4008+ "attr null, env false" : {
4009+ attrValue : cty .NullVal (cty .Bool ),
4010+ envValue : "false" ,
4011+ wantBool : false ,
4012+ wantOk : true ,
4013+ },
4014+ "attr null, env FALSE" : {
4015+ attrValue : cty .NullVal (cty .Bool ),
4016+ envValue : "FALSE" ,
4017+ wantBool : false ,
4018+ wantOk : true ,
4019+ },
4020+ "attr null, env False" : {
4021+ attrValue : cty .NullVal (cty .Bool ),
4022+ envValue : "False" ,
4023+ wantBool : false ,
4024+ wantOk : true ,
4025+ },
4026+ "attr null, env empty" : {
4027+ attrValue : cty .NullVal (cty .Bool ),
4028+ envValue : "" ,
4029+ wantBool : false ,
4030+ wantOk : false ,
4031+ },
4032+ "attr null, env invalid" : {
4033+ attrValue : cty .NullVal (cty .Bool ),
4034+ envValue : "invalid" ,
4035+ wantBool : false ,
4036+ wantOk : false ,
4037+ },
4038+ "attr null, env yes" : {
4039+ attrValue : cty .NullVal (cty .Bool ),
4040+ envValue : "yes" ,
4041+ wantBool : false ,
4042+ wantOk : false ,
4043+ },
4044+ "attr null, env 1" : {
4045+ attrValue : cty .NullVal (cty .Bool ),
4046+ envValue : "1" ,
4047+ wantBool : false ,
4048+ wantOk : false ,
4049+ },
4050+ "attr null, env 0" : {
4051+ attrValue : cty .NullVal (cty .Bool ),
4052+ envValue : "0" ,
4053+ wantBool : false ,
4054+ wantOk : false ,
4055+ },
4056+ "attr takes precedence over env" : {
4057+ attrValue : cty .BoolVal (false ),
4058+ envValue : "true" ,
4059+ wantBool : false ,
4060+ wantOk : true ,
4061+ },
4062+ }
4063+
4064+ for name , tc := range testCases {
4065+ t .Run (name , func (t * testing.T ) {
4066+ servicemocks .StashEnv (t )
4067+
4068+ const testEnvVar = "TF_TEST_BOOL_ENV_VAR"
4069+ if tc .envValue != "" {
4070+ os .Setenv (testEnvVar , tc .envValue )
4071+ }
4072+
4073+ obj := cty .ObjectVal (map [string ]cty.Value {
4074+ "test_attr" : tc .attrValue ,
4075+ })
4076+
4077+ gotBool , gotOk := boolAttrDefaultEnvVarOk (obj , "test_attr" , testEnvVar )
4078+
4079+ if gotBool != tc .wantBool {
4080+ t .Errorf ("got bool %v, want %v" , gotBool , tc .wantBool )
4081+ }
4082+ if gotOk != tc .wantOk {
4083+ t .Errorf ("got ok %v, want %v" , gotOk , tc .wantOk )
4084+ }
4085+ })
4086+ }
4087+ }
0 commit comments