opentofu/terraform/debug_test.go
Martin Atkins c835ef8ff3 Update tests for the new ProviderResolver interface
Rather than providing an already-resolved map of plugins to core, we now
provide a "provider resolver" which knows how to resolve a set of provider
dependencies, to be determined later, and produce that map.

This requires the context to be instantiated in a different way, so this
very noisy diff is a mostly-mechanical update of all of the existing
places where contexts get created for testing, using some adapted versions
of the pre-existing utilities for passing in mock providers.
2017-06-09 14:03:59 -07:00

173 lines
3.1 KiB
Go

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.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,
ProviderResolver: ResourceProviderResolverFixed(
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)
graphLogs := 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 {
if strings.HasSuffix(hdr.Name, "graph.json") {
graphLogs++
}
}
}
if graphLogs == 0 {
t.Fatal("no json graphs")
}
}
// 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, "", 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, "", "")
}