mirror of
https://github.com/opentofu/opentofu.git
synced 2024-12-30 10:47:14 -06:00
785cc7b78a
This turns the new graphs on by default and puts the old graphs behind a flag `-Xlegacy-graph`. This effectively inverts the current 0.7.x behavior with the new graphs. We've incubated most of these for a few weeks now. We've found issues and we've fixed them and we've been using these graphs internally for awhile without any major issue. Its time to default them on and get them part of a beta.
184 lines
3.3 KiB
Go
184 lines
3.3 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.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")
|
|
}
|
|
|
|
/*
|
|
TODO: once @jbardin finishes the dot refactor, uncomment this. This
|
|
won't pass since the new graph doesn't implement the dot nodes.
|
|
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, "", "")
|
|
}
|