github.com/opentofu/opentofu@v1.7.1/internal/backend/remote-state/http/backend_test.go (about) 1 // Copyright (c) The OpenTofu Authors 2 // SPDX-License-Identifier: MPL-2.0 3 // Copyright (c) 2023 HashiCorp, Inc. 4 // SPDX-License-Identifier: MPL-2.0 5 6 package http 7 8 import ( 9 "testing" 10 "time" 11 12 "github.com/opentofu/opentofu/internal/configs" 13 "github.com/opentofu/opentofu/internal/encryption" 14 "github.com/zclconf/go-cty/cty" 15 16 "github.com/opentofu/opentofu/internal/backend" 17 ) 18 19 func TestBackend_impl(t *testing.T) { 20 var _ backend.Backend = new(Backend) 21 } 22 23 func TestHTTPClientFactory(t *testing.T) { 24 // defaults 25 26 conf := map[string]cty.Value{ 27 "address": cty.StringVal("http://127.0.0.1:8888/foo"), 28 } 29 b := backend.TestBackendConfig(t, New(encryption.StateEncryptionDisabled()), configs.SynthBody("synth", conf)).(*Backend) 30 client := b.client 31 32 if client == nil { 33 t.Fatal("Unexpected failure, address") 34 } 35 if client.URL.String() != "http://127.0.0.1:8888/foo" { 36 t.Fatalf("Expected address \"%s\", got \"%s\"", conf["address"], client.URL.String()) 37 } 38 if client.UpdateMethod != "POST" { 39 t.Fatalf("Expected update_method \"%s\", got \"%s\"", "POST", client.UpdateMethod) 40 } 41 if client.LockURL != nil || client.LockMethod != "LOCK" { 42 t.Fatal("Unexpected lock_address or lock_method") 43 } 44 if client.UnlockURL != nil || client.UnlockMethod != "UNLOCK" { 45 t.Fatal("Unexpected unlock_address or unlock_method") 46 } 47 if client.Username != "" || client.Password != "" { 48 t.Fatal("Unexpected username or password") 49 } 50 51 if client.Headers != nil { 52 t.Fatal("Unexpected headers") 53 } 54 55 // custom 56 conf = map[string]cty.Value{ 57 "address": cty.StringVal("http://127.0.0.1:8888/foo"), 58 "update_method": cty.StringVal("BLAH"), 59 "lock_address": cty.StringVal("http://127.0.0.1:8888/bar"), 60 "lock_method": cty.StringVal("BLIP"), 61 "unlock_address": cty.StringVal("http://127.0.0.1:8888/baz"), 62 "unlock_method": cty.StringVal("BLOOP"), 63 "username": cty.StringVal("user"), 64 "password": cty.StringVal("pass"), 65 "retry_max": cty.StringVal("999"), 66 "retry_wait_min": cty.StringVal("15"), 67 "retry_wait_max": cty.StringVal("150"), 68 "headers": cty.MapVal(map[string]cty.Value{ 69 "user-defined": cty.StringVal("test"), 70 }), 71 } 72 73 b = backend.TestBackendConfig(t, New(encryption.StateEncryptionDisabled()), configs.SynthBody("synth", conf)).(*Backend) 74 client = b.client 75 76 if client == nil { 77 t.Fatal("Unexpected failure, update_method") 78 } 79 if client.UpdateMethod != "BLAH" { 80 t.Fatalf("Expected update_method \"%s\", got \"%s\"", "BLAH", client.UpdateMethod) 81 } 82 if client.LockURL.String() != conf["lock_address"].AsString() || client.LockMethod != "BLIP" { 83 t.Fatalf("Unexpected lock_address \"%s\" vs \"%s\" or lock_method \"%s\" vs \"%s\"", client.LockURL.String(), 84 conf["lock_address"].AsString(), client.LockMethod, conf["lock_method"]) 85 } 86 if client.UnlockURL.String() != conf["unlock_address"].AsString() || client.UnlockMethod != "BLOOP" { 87 t.Fatalf("Unexpected unlock_address \"%s\" vs \"%s\" or unlock_method \"%s\" vs \"%s\"", client.UnlockURL.String(), 88 conf["unlock_address"].AsString(), client.UnlockMethod, conf["unlock_method"]) 89 } 90 if client.Username != "user" || client.Password != "pass" { 91 t.Fatalf("Unexpected username \"%s\" vs \"%s\" or password \"%s\" vs \"%s\"", client.Username, conf["username"], 92 client.Password, conf["password"]) 93 } 94 if client.Client.RetryMax != 999 { 95 t.Fatalf("Expected retry_max \"%d\", got \"%d\"", 999, client.Client.RetryMax) 96 } 97 if client.Client.RetryWaitMin != 15*time.Second { 98 t.Fatalf("Expected retry_wait_min \"%s\", got \"%s\"", 15*time.Second, client.Client.RetryWaitMin) 99 } 100 if client.Client.RetryWaitMax != 150*time.Second { 101 t.Fatalf("Expected retry_wait_max \"%s\", got \"%s\"", 150*time.Second, client.Client.RetryWaitMax) 102 } 103 104 if len(client.Headers) != 1 || client.Headers["user-defined"] != "test" { 105 t.Fatalf("Expected headers \"user-defined\" to be \"test\", got \"%s\"", client.Headers) 106 } 107 } 108 109 func TestHTTPClientFactoryWithEnv(t *testing.T) { 110 // env 111 conf := map[string]string{ 112 "address": "http://127.0.0.1:8888/foo", 113 "update_method": "BLAH", 114 "lock_address": "http://127.0.0.1:8888/bar", 115 "lock_method": "BLIP", 116 "unlock_address": "http://127.0.0.1:8888/baz", 117 "unlock_method": "BLOOP", 118 "username": "user", 119 "password": "pass", 120 "retry_max": "999", 121 "retry_wait_min": "15", 122 "retry_wait_max": "150", 123 } 124 125 t.Setenv("TF_HTTP_ADDRESS", conf["address"]) 126 t.Setenv("TF_HTTP_UPDATE_METHOD", conf["update_method"]) 127 t.Setenv("TF_HTTP_LOCK_ADDRESS", conf["lock_address"]) 128 t.Setenv("TF_HTTP_UNLOCK_ADDRESS", conf["unlock_address"]) 129 t.Setenv("TF_HTTP_LOCK_METHOD", conf["lock_method"]) 130 t.Setenv("TF_HTTP_UNLOCK_METHOD", conf["unlock_method"]) 131 t.Setenv("TF_HTTP_USERNAME", conf["username"]) 132 t.Setenv("TF_HTTP_PASSWORD", conf["password"]) 133 t.Setenv("TF_HTTP_RETRY_MAX", conf["retry_max"]) 134 t.Setenv("TF_HTTP_RETRY_WAIT_MIN", conf["retry_wait_min"]) 135 t.Setenv("TF_HTTP_RETRY_WAIT_MAX", conf["retry_wait_max"]) 136 137 b := backend.TestBackendConfig(t, New(encryption.StateEncryptionDisabled()), nil).(*Backend) 138 client := b.client 139 140 if client == nil { 141 t.Fatal("Unexpected failure, EnvDefaultFunc") 142 } 143 if client.UpdateMethod != "BLAH" { 144 t.Fatalf("Expected update_method \"%s\", got \"%s\"", "BLAH", client.UpdateMethod) 145 } 146 if client.LockURL.String() != conf["lock_address"] || client.LockMethod != "BLIP" { 147 t.Fatalf("Unexpected lock_address \"%s\" vs \"%s\" or lock_method \"%s\" vs \"%s\"", client.LockURL.String(), 148 conf["lock_address"], client.LockMethod, conf["lock_method"]) 149 } 150 if client.UnlockURL.String() != conf["unlock_address"] || client.UnlockMethod != "BLOOP" { 151 t.Fatalf("Unexpected unlock_address \"%s\" vs \"%s\" or unlock_method \"%s\" vs \"%s\"", client.UnlockURL.String(), 152 conf["unlock_address"], client.UnlockMethod, conf["unlock_method"]) 153 } 154 if client.Username != "user" || client.Password != "pass" { 155 t.Fatalf("Unexpected username \"%s\" vs \"%s\" or password \"%s\" vs \"%s\"", client.Username, conf["username"], 156 client.Password, conf["password"]) 157 } 158 if client.Client.RetryMax != 999 { 159 t.Fatalf("Expected retry_max \"%d\", got \"%d\"", 999, client.Client.RetryMax) 160 } 161 if client.Client.RetryWaitMin != 15*time.Second { 162 t.Fatalf("Expected retry_wait_min \"%s\", got \"%s\"", 15*time.Second, client.Client.RetryWaitMin) 163 } 164 if client.Client.RetryWaitMax != 150*time.Second { 165 t.Fatalf("Expected retry_wait_max \"%s\", got \"%s\"", 150*time.Second, client.Client.RetryWaitMax) 166 } 167 }