remote: lots of tests
This commit is contained in:
parent
2d1f985a93
commit
d16793659c
|
@ -4,6 +4,7 @@ import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"crypto/md5"
|
"crypto/md5"
|
||||||
"encoding/base64"
|
"encoding/base64"
|
||||||
|
"encoding/json"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"net/http"
|
"net/http"
|
||||||
"net/http/httptest"
|
"net/http/httptest"
|
||||||
|
@ -69,7 +70,37 @@ func TestValidConfig(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestValidateConfig(t *testing.T) {
|
func TestValidateConfig(t *testing.T) {
|
||||||
// TODO:
|
defer fixDir(testDir(t))
|
||||||
|
remote, srv := testRemote(t, nil)
|
||||||
|
defer srv.Close()
|
||||||
|
|
||||||
|
// No local state, should validate
|
||||||
|
if err := ValidateConfig(remote); err != nil {
|
||||||
|
t.Fatalf("err: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Local state without remote, error!
|
||||||
|
local := terraform.NewState()
|
||||||
|
testWriteLocal(t, local)
|
||||||
|
if err := ValidateConfig(remote); err == nil {
|
||||||
|
t.Fatalf("local missing remote")
|
||||||
|
}
|
||||||
|
|
||||||
|
// Local with matching remote, should be fine
|
||||||
|
local.Remote = remote
|
||||||
|
testWriteLocal(t, local)
|
||||||
|
if err := ValidateConfig(remote); err != nil {
|
||||||
|
t.Fatalf("err: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Local with conflicting remote, not fine
|
||||||
|
local.Remote = &terraform.RemoteState{
|
||||||
|
Name: "whatchutalkingabout",
|
||||||
|
}
|
||||||
|
testWriteLocal(t, local)
|
||||||
|
if err := ValidateConfig(remote); err == nil {
|
||||||
|
t.Fatalf("conflicting remote")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestRefreshState_Init(t *testing.T) {
|
func TestRefreshState_Init(t *testing.T) {
|
||||||
|
@ -95,20 +126,119 @@ func TestRefreshState_Init(t *testing.T) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestRefreshState_NewVersion(t *testing.T) {
|
||||||
|
defer fixDir(testDir(t))
|
||||||
|
|
||||||
|
rs := terraform.NewState()
|
||||||
|
rs.Serial = 100
|
||||||
|
rs.Version = terraform.StateVersion + 1
|
||||||
|
remote, srv := testRemote(t, rs)
|
||||||
|
defer srv.Close()
|
||||||
|
|
||||||
|
local := terraform.NewState()
|
||||||
|
local.Serial = 99
|
||||||
|
testWriteLocal(t, local)
|
||||||
|
|
||||||
|
_, err := RefreshState(remote)
|
||||||
|
if err == nil {
|
||||||
|
t.Fatalf("New version should fail!")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestRefreshState_Noop(t *testing.T) {
|
func TestRefreshState_Noop(t *testing.T) {
|
||||||
// TODO
|
defer fixDir(testDir(t))
|
||||||
|
|
||||||
|
rs := terraform.NewState()
|
||||||
|
rs.Serial = 100
|
||||||
|
remote, srv := testRemote(t, rs)
|
||||||
|
defer srv.Close()
|
||||||
|
|
||||||
|
local := terraform.NewState()
|
||||||
|
local.Serial = 100
|
||||||
|
testWriteLocal(t, local)
|
||||||
|
|
||||||
|
sc, err := RefreshState(remote)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("err: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if sc != StateChangeNoop {
|
||||||
|
t.Fatalf("bad: %s", sc)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestRefreshState_UpdateLocal(t *testing.T) {
|
func TestRefreshState_UpdateLocal(t *testing.T) {
|
||||||
// TODO
|
defer fixDir(testDir(t))
|
||||||
|
|
||||||
|
rs := terraform.NewState()
|
||||||
|
rs.Serial = 100
|
||||||
|
remote, srv := testRemote(t, rs)
|
||||||
|
defer srv.Close()
|
||||||
|
|
||||||
|
local := terraform.NewState()
|
||||||
|
local.Serial = 99
|
||||||
|
testWriteLocal(t, local)
|
||||||
|
|
||||||
|
sc, err := RefreshState(remote)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("err: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if sc != StateChangeUpdateLocal {
|
||||||
|
t.Fatalf("bad: %s", sc)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Should update
|
||||||
|
local2 := testReadLocal(t)
|
||||||
|
if local2.Serial != 100 {
|
||||||
|
t.Fatalf("Bad: %#v", local2)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestRefreshState_LocalNewer(t *testing.T) {
|
func TestRefreshState_LocalNewer(t *testing.T) {
|
||||||
// TODO
|
defer fixDir(testDir(t))
|
||||||
|
|
||||||
|
rs := terraform.NewState()
|
||||||
|
rs.Serial = 99
|
||||||
|
remote, srv := testRemote(t, rs)
|
||||||
|
defer srv.Close()
|
||||||
|
|
||||||
|
local := terraform.NewState()
|
||||||
|
local.Serial = 100
|
||||||
|
testWriteLocal(t, local)
|
||||||
|
|
||||||
|
sc, err := RefreshState(remote)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("err: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if sc != StateChangeLocalNewer {
|
||||||
|
t.Fatalf("bad: %s", sc)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestRefreshState_Conflict(t *testing.T) {
|
func TestRefreshState_Conflict(t *testing.T) {
|
||||||
// TODO
|
defer fixDir(testDir(t))
|
||||||
|
|
||||||
|
rs := terraform.NewState()
|
||||||
|
rs.Serial = 50
|
||||||
|
rs.RootModule().Outputs["foo"] = "bar"
|
||||||
|
remote, srv := testRemote(t, rs)
|
||||||
|
defer srv.Close()
|
||||||
|
|
||||||
|
local := terraform.NewState()
|
||||||
|
local.Serial = 50
|
||||||
|
local.RootModule().Outputs["foo"] = "baz"
|
||||||
|
testWriteLocal(t, local)
|
||||||
|
|
||||||
|
sc, err := RefreshState(remote)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("err: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if sc != StateChangeConflict {
|
||||||
|
t.Fatalf("bad: %s", sc)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestBlankState(t *testing.T) {
|
func TestBlankState(t *testing.T) {
|
||||||
|
@ -183,7 +313,10 @@ func testRemote(t *testing.T, s *terraform.State) (*terraform.RemoteState, *http
|
||||||
buf := bytes.NewBuffer(nil)
|
buf := bytes.NewBuffer(nil)
|
||||||
|
|
||||||
if s != nil {
|
if s != nil {
|
||||||
terraform.WriteState(s, buf)
|
enc := json.NewEncoder(buf)
|
||||||
|
if err := enc.Encode(s); err != nil {
|
||||||
|
t.Fatalf("err: %v", err)
|
||||||
|
}
|
||||||
md5 := md5.Sum(buf.Bytes())
|
md5 := md5.Sum(buf.Bytes())
|
||||||
b64md5 = base64.StdEncoding.EncodeToString(md5[:16])
|
b64md5 = base64.StdEncoding.EncodeToString(md5[:16])
|
||||||
}
|
}
|
||||||
|
@ -247,3 +380,20 @@ func testReadLocal(t *testing.T) *terraform.State {
|
||||||
}
|
}
|
||||||
return s
|
return s
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// testWriteLocal is used to write the local state
|
||||||
|
func testWriteLocal(t *testing.T, s *terraform.State) {
|
||||||
|
path, err := HiddenStatePath()
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("err: %v", err)
|
||||||
|
}
|
||||||
|
buf := bytes.NewBuffer(nil)
|
||||||
|
enc := json.NewEncoder(buf)
|
||||||
|
if err := enc.Encode(s); err != nil {
|
||||||
|
t.Fatalf("err: %v", err)
|
||||||
|
}
|
||||||
|
err = ioutil.WriteFile(path, buf.Bytes(), 0777)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("err: %v", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue