github.com/danrjohnson/terraform@v0.7.0-rc2.0.20160627135212-d0fc1fa086ff/command/remote_pull_test.go (about)

     1  package command
     2  
     3  import (
     4  	"bytes"
     5  	"crypto/md5"
     6  	"encoding/base64"
     7  	"encoding/json"
     8  	"net/http"
     9  	"net/http/httptest"
    10  	"os"
    11  	"path/filepath"
    12  	"testing"
    13  
    14  	"github.com/hashicorp/terraform/terraform"
    15  	"github.com/mitchellh/cli"
    16  )
    17  
    18  func TestRemotePull_noRemote(t *testing.T) {
    19  	tmp, cwd := testCwd(t)
    20  	defer testFixCwd(t, tmp, cwd)
    21  
    22  	ui := new(cli.MockUi)
    23  	c := &RemotePullCommand{
    24  		Meta: Meta{
    25  			ContextOpts: testCtxConfig(testProvider()),
    26  			Ui:          ui,
    27  		},
    28  	}
    29  
    30  	args := []string{}
    31  	if code := c.Run(args); code != 1 {
    32  		t.Fatalf("bad: \n%s", ui.ErrorWriter.String())
    33  	}
    34  }
    35  
    36  func TestRemotePull_local(t *testing.T) {
    37  	tmp, cwd := testCwd(t)
    38  	defer testFixCwd(t, tmp, cwd)
    39  
    40  	s := terraform.NewState()
    41  	s.Serial = 10
    42  	conf, srv := testRemoteState(t, s, 200)
    43  
    44  	s = terraform.NewState()
    45  	s.Serial = 5
    46  	s.Remote = conf
    47  	defer srv.Close()
    48  
    49  	// Store the local state
    50  	statePath := filepath.Join(tmp, DefaultDataDir, DefaultStateFilename)
    51  	if err := os.MkdirAll(filepath.Dir(statePath), 0755); err != nil {
    52  		t.Fatalf("err: %s", err)
    53  	}
    54  	f, err := os.Create(statePath)
    55  	if err != nil {
    56  		t.Fatalf("err: %s", err)
    57  	}
    58  	err = terraform.WriteState(s, f)
    59  	f.Close()
    60  	if err != nil {
    61  		t.Fatalf("err: %s", err)
    62  	}
    63  
    64  	ui := new(cli.MockUi)
    65  	c := &RemotePullCommand{
    66  		Meta: Meta{
    67  			ContextOpts: testCtxConfig(testProvider()),
    68  			Ui:          ui,
    69  		},
    70  	}
    71  	args := []string{}
    72  	if code := c.Run(args); code != 0 {
    73  		t.Fatalf("bad: \n%s", ui.ErrorWriter.String())
    74  	}
    75  }
    76  
    77  // testRemoteState is used to make a test HTTP server to
    78  // return a given state file
    79  func testRemoteState(t *testing.T, s *terraform.State, c int) (*terraform.RemoteState, *httptest.Server) {
    80  	var b64md5 string
    81  	buf := bytes.NewBuffer(nil)
    82  
    83  	cb := func(resp http.ResponseWriter, req *http.Request) {
    84  		if req.Method == "PUT" {
    85  			resp.WriteHeader(c)
    86  			return
    87  		}
    88  		if s == nil {
    89  			resp.WriteHeader(404)
    90  			return
    91  		}
    92  
    93  		resp.Header().Set("Content-MD5", b64md5)
    94  		resp.Write(buf.Bytes())
    95  	}
    96  
    97  	srv := httptest.NewServer(http.HandlerFunc(cb))
    98  	remote := &terraform.RemoteState{
    99  		Type:   "http",
   100  		Config: map[string]string{"address": srv.URL},
   101  	}
   102  
   103  	if s != nil {
   104  		// Set the remote data
   105  		s.Remote = remote
   106  
   107  		enc := json.NewEncoder(buf)
   108  		if err := enc.Encode(s); err != nil {
   109  			t.Fatalf("err: %v", err)
   110  		}
   111  		md5 := md5.Sum(buf.Bytes())
   112  		b64md5 = base64.StdEncoding.EncodeToString(md5[:16])
   113  	}
   114  
   115  	return remote, srv
   116  }