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  }