github.com/graywolf-at-work-2/terraform-vendor@v1.4.5/internal/backend/remote-state/cos/backend_test.go (about) 1 package cos 2 3 import ( 4 "crypto/md5" 5 "fmt" 6 "os" 7 "testing" 8 "time" 9 10 "github.com/hashicorp/terraform/internal/backend" 11 "github.com/hashicorp/terraform/internal/states/remote" 12 ) 13 14 const ( 15 defaultPrefix = "" 16 defaultKey = "terraform.tfstate" 17 ) 18 19 // Testing Thanks to GCS 20 21 func TestStateFile(t *testing.T) { 22 t.Parallel() 23 24 cases := []struct { 25 prefix string 26 stateName string 27 key string 28 wantStateFile string 29 wantLockFile string 30 }{ 31 {"", "default", "default.tfstate", "default.tfstate", "default.tfstate.tflock"}, 32 {"", "default", "test.tfstate", "test.tfstate", "test.tfstate.tflock"}, 33 {"", "dev", "test.tfstate", "dev/test.tfstate", "dev/test.tfstate.tflock"}, 34 {"terraform/test", "default", "default.tfstate", "terraform/test/default.tfstate", "terraform/test/default.tfstate.tflock"}, 35 {"terraform/test", "default", "test.tfstate", "terraform/test/test.tfstate", "terraform/test/test.tfstate.tflock"}, 36 {"terraform/test", "dev", "test.tfstate", "terraform/test/dev/test.tfstate", "terraform/test/dev/test.tfstate.tflock"}, 37 } 38 39 for _, c := range cases { 40 t.Run(fmt.Sprintf("%s %s %s", c.prefix, c.key, c.stateName), func(t *testing.T) { 41 b := &Backend{ 42 prefix: c.prefix, 43 key: c.key, 44 } 45 if got, want := b.stateFile(c.stateName), c.wantStateFile; got != want { 46 t.Errorf("wrong state file name\ngot: %s\nwant: %s", got, want) 47 } 48 if got, want := b.lockFile(c.stateName), c.wantLockFile; got != want { 49 t.Errorf("wrong lock file name\ngot: %s\nwant: %s", got, want) 50 } 51 }) 52 } 53 } 54 55 func TestRemoteClient(t *testing.T) { 56 t.Parallel() 57 58 bucket := bucketName(t) 59 60 be := setupBackend(t, bucket, defaultPrefix, defaultKey, false) 61 defer teardownBackend(t, be) 62 63 ss, err := be.StateMgr(backend.DefaultStateName) 64 if err != nil { 65 t.Fatalf("unexpected error: %s", err) 66 } 67 68 rs, ok := ss.(*remote.State) 69 if !ok { 70 t.Fatalf("wrong state manager type\ngot: %T\nwant: %T", ss, rs) 71 } 72 73 remote.TestClient(t, rs.Client) 74 } 75 76 func TestRemoteClientWithPrefix(t *testing.T) { 77 t.Parallel() 78 79 prefix := "prefix/test" 80 bucket := bucketName(t) 81 82 be := setupBackend(t, bucket, prefix, defaultKey, false) 83 defer teardownBackend(t, be) 84 85 ss, err := be.StateMgr(backend.DefaultStateName) 86 if err != nil { 87 t.Fatalf("unexpected error: %s", err) 88 } 89 90 rs, ok := ss.(*remote.State) 91 if !ok { 92 t.Fatalf("wrong state manager type\ngot: %T\nwant: %T", ss, rs) 93 } 94 95 remote.TestClient(t, rs.Client) 96 } 97 98 func TestRemoteClientWithEncryption(t *testing.T) { 99 t.Parallel() 100 101 bucket := bucketName(t) 102 103 be := setupBackend(t, bucket, defaultPrefix, defaultKey, true) 104 defer teardownBackend(t, be) 105 106 ss, err := be.StateMgr(backend.DefaultStateName) 107 if err != nil { 108 t.Fatalf("unexpected error: %s", err) 109 } 110 111 rs, ok := ss.(*remote.State) 112 if !ok { 113 t.Fatalf("wrong state manager type\ngot: %T\nwant: %T", ss, rs) 114 } 115 116 remote.TestClient(t, rs.Client) 117 } 118 119 func TestRemoteLocks(t *testing.T) { 120 t.Parallel() 121 122 bucket := bucketName(t) 123 124 be := setupBackend(t, bucket, defaultPrefix, defaultKey, false) 125 defer teardownBackend(t, be) 126 127 remoteClient := func() (remote.Client, error) { 128 ss, err := be.StateMgr(backend.DefaultStateName) 129 if err != nil { 130 return nil, err 131 } 132 133 rs, ok := ss.(*remote.State) 134 if !ok { 135 return nil, fmt.Errorf("be.StateMgr(): got a %T, want a *remote.State", ss) 136 } 137 138 return rs.Client, nil 139 } 140 141 c0, err := remoteClient() 142 if err != nil { 143 t.Fatalf("unexpected error: %s", err) 144 } 145 146 c1, err := remoteClient() 147 if err != nil { 148 t.Fatalf("unexpected error: %s", err) 149 } 150 151 remote.TestRemoteLocks(t, c0, c1) 152 } 153 154 func TestBackend(t *testing.T) { 155 t.Parallel() 156 157 bucket := bucketName(t) 158 159 be0 := setupBackend(t, bucket, defaultPrefix, defaultKey, false) 160 defer teardownBackend(t, be0) 161 162 be1 := setupBackend(t, bucket, defaultPrefix, defaultKey, false) 163 defer teardownBackend(t, be1) 164 165 backend.TestBackendStates(t, be0) 166 backend.TestBackendStateLocks(t, be0, be1) 167 backend.TestBackendStateForceUnlock(t, be0, be1) 168 } 169 170 func TestBackendWithPrefix(t *testing.T) { 171 t.Parallel() 172 173 prefix := "prefix/test" 174 bucket := bucketName(t) 175 176 be0 := setupBackend(t, bucket, prefix, defaultKey, false) 177 defer teardownBackend(t, be0) 178 179 be1 := setupBackend(t, bucket, prefix+"/", defaultKey, false) 180 defer teardownBackend(t, be1) 181 182 backend.TestBackendStates(t, be0) 183 backend.TestBackendStateLocks(t, be0, be1) 184 } 185 186 func TestBackendWithEncryption(t *testing.T) { 187 t.Parallel() 188 189 bucket := bucketName(t) 190 191 be0 := setupBackend(t, bucket, defaultPrefix, defaultKey, true) 192 defer teardownBackend(t, be0) 193 194 be1 := setupBackend(t, bucket, defaultPrefix, defaultKey, true) 195 defer teardownBackend(t, be1) 196 197 backend.TestBackendStates(t, be0) 198 backend.TestBackendStateLocks(t, be0, be1) 199 } 200 201 func setupBackend(t *testing.T, bucket, prefix, key string, encrypt bool) backend.Backend { 202 t.Helper() 203 204 skip := os.Getenv("TF_COS_APPID") == "" 205 if skip { 206 t.Skip("This test require setting TF_COS_APPID environment variables") 207 } 208 209 if os.Getenv(PROVIDER_REGION) == "" { 210 os.Setenv(PROVIDER_REGION, "ap-guangzhou") 211 } 212 213 appId := os.Getenv("TF_COS_APPID") 214 region := os.Getenv(PROVIDER_REGION) 215 216 config := map[string]interface{}{ 217 "region": region, 218 "bucket": bucket + appId, 219 "prefix": prefix, 220 "key": key, 221 } 222 223 b := backend.TestBackendConfig(t, New(), backend.TestWrapConfig(config)) 224 be := b.(*Backend) 225 226 c, err := be.client("tencentcloud") 227 if err != nil { 228 t.Fatalf("unexpected error: %s", err) 229 } 230 231 err = c.putBucket() 232 if err != nil { 233 t.Fatalf("unexpected error: %s", err) 234 } 235 236 return b 237 } 238 239 func teardownBackend(t *testing.T, b backend.Backend) { 240 t.Helper() 241 242 c, err := b.(*Backend).client("tencentcloud") 243 if err != nil { 244 t.Fatalf("unexpected error: %s", err) 245 } 246 247 err = c.deleteBucket(true) 248 if err != nil { 249 t.Fatalf("unexpected error: %s", err) 250 } 251 } 252 253 func bucketName(t *testing.T) string { 254 unique := fmt.Sprintf("%s-%x", t.Name(), time.Now().UnixNano()) 255 return fmt.Sprintf("terraform-test-%s-%s", fmt.Sprintf("%x", md5.Sum([]byte(unique)))[:10], "") 256 }