github.com/ns1/terraform@v0.7.10-0.20161109153551-8949419bef40/terraform/debug_test.go (about) 1 package terraform 2 3 import ( 4 "archive/tar" 5 "bytes" 6 "compress/gzip" 7 "io" 8 "io/ioutil" 9 "regexp" 10 "strings" 11 "testing" 12 ) 13 14 // debugInfo should be safe when nil 15 func TestDebugInfo_nil(t *testing.T) { 16 var d *debugInfo 17 18 d.SetPhase("none") 19 d.WriteGraph(nil) 20 d.WriteFile("none", nil) 21 d.Close() 22 } 23 24 func TestDebugInfo_basicFile(t *testing.T) { 25 var w bytes.Buffer 26 debug, err := newDebugInfo("test-debug-info", &w) 27 if err != nil { 28 t.Fatal(err) 29 } 30 debug.SetPhase("test") 31 32 fileData := map[string][]byte{ 33 "file1": []byte("file 1 data"), 34 "file2": []byte("file 2 data"), 35 "file3": []byte("file 3 data"), 36 } 37 38 for f, d := range fileData { 39 err = debug.WriteFile(f, d) 40 if err != nil { 41 t.Fatal(err) 42 } 43 } 44 45 err = debug.Close() 46 if err != nil { 47 t.Fatal(err) 48 } 49 50 gz, err := gzip.NewReader(&w) 51 if err != nil { 52 t.Fatal(err) 53 } 54 tr := tar.NewReader(gz) 55 56 for { 57 hdr, err := tr.Next() 58 if err == io.EOF { 59 break 60 } 61 if err != nil { 62 t.Fatal(err) 63 } 64 65 // get the filename part of the archived file 66 name := regexp.MustCompile(`\w+$`).FindString(hdr.Name) 67 data := fileData[name] 68 69 delete(fileData, name) 70 71 tarData, err := ioutil.ReadAll(tr) 72 if err != nil { 73 t.Fatal(err) 74 } 75 if !bytes.Equal(data, tarData) { 76 t.Fatalf("got '%s' for file '%s'", tarData, name) 77 } 78 } 79 80 for k := range fileData { 81 t.Fatalf("didn't find file %s", k) 82 } 83 } 84 85 // Test that we get logs and graphs from a walk. We're not looking for anything 86 // specific, since the output is going to change in the near future. 87 func TestDebug_plan(t *testing.T) { 88 var out bytes.Buffer 89 d, err := newDebugInfo("test-debug-info", &out) 90 if err != nil { 91 t.Fatal(err) 92 } 93 // set the global debug value 94 dbug = d 95 96 // run a basic plan 97 m := testModule(t, "plan-good") 98 p := testProvider("aws") 99 p.DiffFn = testDiffFn 100 ctx := testContext2(t, &ContextOpts{ 101 Module: m, 102 Providers: map[string]ResourceProviderFactory{ 103 "aws": testProviderFuncFixed(p), 104 }, 105 }) 106 107 _, err = ctx.Plan() 108 if err != nil { 109 t.Fatalf("err: %s", err) 110 } 111 112 err = CloseDebugInfo() 113 if err != nil { 114 t.Fatal(err) 115 } 116 117 gz, err := gzip.NewReader(&out) 118 if err != nil { 119 t.Fatal(err) 120 } 121 tr := tar.NewReader(gz) 122 123 files := 0 124 graphs := 0 125 for { 126 hdr, err := tr.Next() 127 if err == io.EOF { 128 break 129 } 130 if err != nil { 131 t.Fatal(err) 132 } 133 134 // record any file that contains data 135 if hdr.Size > 0 { 136 files++ 137 138 // and any dot graph with data 139 if strings.HasSuffix(hdr.Name, ".dot") { 140 graphs++ 141 } 142 } 143 } 144 145 if files == 0 { 146 t.Fatal("no files with data found") 147 } 148 149 if graphs == 0 { 150 t.Fatal("no no-empty graphs found") 151 } 152 } 153 154 // verify that no hooks panic on nil input 155 func TestDebugHook_nilArgs(t *testing.T) { 156 // make sure debug isn't nil, so the hooks try to execute 157 var w bytes.Buffer 158 var err error 159 dbug, err = newDebugInfo("test-debug-info", &w) 160 if err != nil { 161 t.Fatal(err) 162 } 163 164 var h DebugHook 165 h.PostApply(nil, nil, nil) 166 h.PostDiff(nil, nil) 167 h.PostImportState(nil, nil) 168 h.PostProvision(nil, "") 169 h.PostProvisionResource(nil, nil) 170 h.PostRefresh(nil, nil) 171 h.PostStateUpdate(nil) 172 h.PreApply(nil, nil, nil) 173 h.PreDiff(nil, nil) 174 h.PreImportState(nil, "") 175 h.PreProvision(nil, "") 176 h.PreProvisionResource(nil, nil) 177 h.PreRefresh(nil, nil) 178 h.ProvisionOutput(nil, "", "") 179 }