From 3f49227b729df73cdff7a13e5654f1d24c8373fe Mon Sep 17 00:00:00 2001 From: James Bardin Date: Sat, 8 Apr 2017 15:15:18 -0400 Subject: [PATCH] add state an context tests Make sure duplicate depends_on entries are pruned from existing states on read. Make sure new state built from configs with multiple references to the same resource only add it once to the Dependencies. --- terraform/context_apply_test.go | 29 ++++++++++ terraform/state_test.go | 56 +++++++++++++++++++ .../test-fixtures/apply-multi-ref/main.tf | 8 +++ 3 files changed, 93 insertions(+) create mode 100644 terraform/test-fixtures/apply-multi-ref/main.tf diff --git a/terraform/context_apply_test.go b/terraform/context_apply_test.go index afe2f85a71..7d5bbf025f 100644 --- a/terraform/context_apply_test.go +++ b/terraform/context_apply_test.go @@ -8100,3 +8100,32 @@ func TestContext2Apply_terraformEnv(t *testing.T) { t.Fatalf("bad: \n%s", actual) } } + +// verify that multiple config references only create a single depends_on entry +func TestContext2Apply_multiRef(t *testing.T) { + m := testModule(t, "apply-multi-ref") + p := testProvider("aws") + p.ApplyFn = testApplyFn + p.DiffFn = testDiffFn + + ctx := testContext2(t, &ContextOpts{ + Module: m, + Providers: map[string]ResourceProviderFactory{ + "aws": testProviderFuncFixed(p), + }, + }) + + if _, err := ctx.Plan(); err != nil { + t.Fatalf("err: %s", err) + } + + state, err := ctx.Apply() + if err != nil { + t.Fatalf("err: %s", err) + } + + deps := state.Modules[0].Resources["aws_instance.other"].Dependencies + if len(deps) > 1 || deps[0] != "aws_instance.create" { + t.Fatalf("expected 1 depends_on entry for aws_instance.create, got %q", deps) + } +} diff --git a/terraform/state_test.go b/terraform/state_test.go index c10ebf133a..324ab79706 100644 --- a/terraform/state_test.go +++ b/terraform/state_test.go @@ -1898,6 +1898,62 @@ func TestReadState_prune(t *testing.T) { } } +func TestReadState_pruneDependencies(t *testing.T) { + state := &State{ + Serial: 9, + Lineage: "5d1ad1a1-4027-4665-a908-dbe6adff11d8", + Remote: &RemoteState{ + Type: "http", + Config: map[string]string{ + "url": "http://my-cool-server.com/", + }, + }, + Modules: []*ModuleState{ + &ModuleState{ + Path: rootModulePath, + Dependencies: []string{ + "aws_instance.bar", + "aws_instance.bar", + }, + Resources: map[string]*ResourceState{ + "foo": &ResourceState{ + Dependencies: []string{ + "aws_instance.baz", + "aws_instance.baz", + }, + Primary: &InstanceState{ + ID: "bar", + }, + }, + }, + }, + }, + } + state.init() + + buf := new(bytes.Buffer) + if err := WriteState(state, buf); err != nil { + t.Fatalf("err: %s", err) + } + + actual, err := ReadState(buf) + if err != nil { + t.Fatalf("err: %s", err) + } + + // make sure the duplicate Dependencies are filtered + modDeps := actual.Modules[0].Dependencies + resourceDeps := actual.Modules[0].Resources["foo"].Dependencies + + if len(modDeps) > 1 || modDeps[0] != "aws_instance.bar" { + t.Fatalf("expected 1 module depends_on entry, got %q", modDeps) + } + + if len(resourceDeps) > 1 || resourceDeps[0] != "aws_instance.baz" { + t.Fatalf("expected 1 resource depends_on entry, got %q", resourceDeps) + } +} + func TestResourceNameSort(t *testing.T) { names := []string{ "a", diff --git a/terraform/test-fixtures/apply-multi-ref/main.tf b/terraform/test-fixtures/apply-multi-ref/main.tf new file mode 100644 index 0000000000..2a6a671521 --- /dev/null +++ b/terraform/test-fixtures/apply-multi-ref/main.tf @@ -0,0 +1,8 @@ +resource "aws_instance" "create" { + bar = "abc" +} + +resource "aws_instance" "other" { + var = "${aws_instance.create.id}" + foo = "${aws_instance.create.bar}" +}