Add some basic tests
Also make DebugHook noop when there is no debuginfo set
This commit is contained in:
parent
797a1b339d
commit
354f04f104
|
@ -0,0 +1,179 @@
|
|||
package terraform
|
||||
|
||||
import (
|
||||
"archive/tar"
|
||||
"bytes"
|
||||
"compress/gzip"
|
||||
"io"
|
||||
"io/ioutil"
|
||||
"regexp"
|
||||
"strings"
|
||||
"testing"
|
||||
)
|
||||
|
||||
// debugInfo should be safe when nil
|
||||
func TestDebugInfo_nil(t *testing.T) {
|
||||
var d *debugInfo
|
||||
|
||||
d.SetPhase("none")
|
||||
d.WriteGraph(nil)
|
||||
d.WriteFile("none", nil)
|
||||
d.Close()
|
||||
}
|
||||
|
||||
func TestDebugInfo_basicFile(t *testing.T) {
|
||||
var w bytes.Buffer
|
||||
debug, err := newDebugInfo("test-debug-info", &w)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
debug.SetPhase("test")
|
||||
|
||||
fileData := map[string][]byte{
|
||||
"file1": []byte("file 1 data"),
|
||||
"file2": []byte("file 2 data"),
|
||||
"file3": []byte("file 3 data"),
|
||||
}
|
||||
|
||||
for f, d := range fileData {
|
||||
err = debug.WriteFile(f, d)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
}
|
||||
|
||||
err = debug.Close()
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
gz, err := gzip.NewReader(&w)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
tr := tar.NewReader(gz)
|
||||
|
||||
for {
|
||||
hdr, err := tr.Next()
|
||||
if err == io.EOF {
|
||||
break
|
||||
}
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
// get the filename part of the archived file
|
||||
name := regexp.MustCompile(`\w+$`).FindString(hdr.Name)
|
||||
data := fileData[name]
|
||||
|
||||
delete(fileData, name)
|
||||
|
||||
tarData, err := ioutil.ReadAll(tr)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if !bytes.Equal(data, tarData) {
|
||||
t.Fatalf("got '%s' for file '%s'", tarData, name)
|
||||
}
|
||||
}
|
||||
|
||||
for k := range fileData {
|
||||
t.Fatalf("didn't find file %s", k)
|
||||
}
|
||||
}
|
||||
|
||||
// Test that we get logs and graphs from a walk. We're not looking for anything
|
||||
// specific, since the output is going to change in the near future.
|
||||
func TestDebug_plan(t *testing.T) {
|
||||
var out bytes.Buffer
|
||||
d, err := newDebugInfo("test-debug-info", &out)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
// set the global debug value
|
||||
dbug = d
|
||||
|
||||
// run a basic plan
|
||||
m := testModule(t, "plan-good")
|
||||
p := testProvider("aws")
|
||||
p.DiffFn = testDiffFn
|
||||
ctx := testContext2(t, &ContextOpts{
|
||||
Module: m,
|
||||
Providers: map[string]ResourceProviderFactory{
|
||||
"aws": testProviderFuncFixed(p),
|
||||
},
|
||||
})
|
||||
|
||||
_, err = ctx.Plan()
|
||||
if err != nil {
|
||||
t.Fatalf("err: %s", err)
|
||||
}
|
||||
|
||||
err = CloseDebugInfo()
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
gz, err := gzip.NewReader(&out)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
tr := tar.NewReader(gz)
|
||||
|
||||
files := 0
|
||||
graphs := 0
|
||||
for {
|
||||
hdr, err := tr.Next()
|
||||
if err == io.EOF {
|
||||
break
|
||||
}
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
// record any file that contains data
|
||||
if hdr.Size > 0 {
|
||||
files++
|
||||
|
||||
// and any dot graph with data
|
||||
if strings.HasSuffix(hdr.Name, ".dot") {
|
||||
graphs++
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if files == 0 {
|
||||
t.Fatal("no files with data found")
|
||||
}
|
||||
|
||||
if graphs == 0 {
|
||||
t.Fatal("no no-empty graphs found")
|
||||
}
|
||||
}
|
||||
|
||||
// verify that no hooks panic on nil input
|
||||
func TestDebugHook_nilArgs(t *testing.T) {
|
||||
// make sure debug isn't nil, so the hooks try to execute
|
||||
var w bytes.Buffer
|
||||
var err error
|
||||
dbug, err = newDebugInfo("test-debug-info", &w)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
var h DebugHook
|
||||
h.PostApply(nil, nil, nil)
|
||||
h.PostDiff(nil, nil)
|
||||
h.PostImportState(nil, nil)
|
||||
h.PostProvision(nil, "")
|
||||
h.PostProvisionResource(nil, nil)
|
||||
h.PostRefresh(nil, nil)
|
||||
h.PostStateUpdate(nil)
|
||||
h.PreApply(nil, nil, nil)
|
||||
h.PreDiff(nil, nil)
|
||||
h.PreImportState(nil, "")
|
||||
h.PreProvision(nil, "")
|
||||
h.PreProvisionResource(nil, nil)
|
||||
h.PreRefresh(nil, nil)
|
||||
h.ProvisionOutput(nil, "", "")
|
||||
}
|
Loading…
Reference in New Issue