github.com/jgadling/terraform@v0.3.8-0.20150227214559-abd68c2c87bc/command/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 TestPull_noRemote(t *testing.T) { 19 tmp, cwd := testCwd(t) 20 defer testFixCwd(t, tmp, cwd) 21 22 ui := new(cli.MockUi) 23 c := &PullCommand{ 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 TestPull_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 := &PullCommand{ 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 if s != nil { 84 enc := json.NewEncoder(buf) 85 if err := enc.Encode(s); err != nil { 86 t.Fatalf("err: %v", err) 87 } 88 md5 := md5.Sum(buf.Bytes()) 89 b64md5 = base64.StdEncoding.EncodeToString(md5[:16]) 90 } 91 92 cb := func(resp http.ResponseWriter, req *http.Request) { 93 if req.Method == "PUT" { 94 resp.WriteHeader(c) 95 return 96 } 97 if s == nil { 98 resp.WriteHeader(404) 99 return 100 } 101 resp.Header().Set("Content-MD5", b64md5) 102 resp.Write(buf.Bytes()) 103 } 104 srv := httptest.NewServer(http.HandlerFunc(cb)) 105 remote := &terraform.RemoteState{ 106 Type: "http", 107 Config: map[string]string{"address": srv.URL}, 108 } 109 return remote, srv 110 }