github.com/jonasi/terraform@v0.6.10-0.20160125170522-e865c342cc1f/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 }