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  }