Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add more tags tests #2932

Closed
wants to merge 8 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
171 changes: 171 additions & 0 deletions examples/examples_go_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,14 @@
package examples

import (
"encoding/json"
"fmt"
"math/rand"
"path/filepath"
"testing"

"github.com/stretchr/testify/require"

"github.com/pulumi/pulumi/pkg/v3/testing/integration"
)

Expand All @@ -22,3 +27,169 @@ func TestAccWebserverGo(t *testing.T) {

integration.ProgramTest(t, &test)
}

func TestTagsCombinationsGo(t *testing.T) {
type testCase struct {
name string
s1 tagsState
s2 tagsState
}

testCases := []testCase{
{
"maintain a simple tag",
tagsState{ResourceTags: map[string]string{"x": "s"}},
tagsState{ResourceTags: map[string]string{"x": "s"}},
},
{
"add a simple tag",
tagsState{},
tagsState{ResourceTags: map[string]string{"x": "s"}},
},
{
"add an empty tag",
tagsState{},
tagsState{ResourceTags: map[string]string{"x": ""}},
},
{
"replace tags with empty",
tagsState{
DefaultTags: map[string]string{"x": "s"},
ResourceTags: nil,
},
tagsState{
DefaultTags: map[string]string{"x": "", "y": "s"},
ResourceTags: map[string]string{"x": "", "y": ""},
},
},
{
"maintain tags",
tagsState{
DefaultTags: map[string]string{"x": "s", "y": "s"},
ResourceTags: map[string]string{"x": "s", "y": "s"},
},
tagsState{
DefaultTags: map[string]string{"x": "s", "y": "s"},
ResourceTags: map[string]string{"x": "s", "y": "s"},
},
},
}

for _, tc := range testCases {
tc := tc
t.Run(tc.name, func(t *testing.T) {
t.Parallel()
tc.s1.validateTransitionTo(t, tc.s2)
})
}
}

func TestRandomTagsCombinationsGo(t *testing.T) {
tagValues := []string{"", "s"} // empty values are conflated with unknowns in TF internals, must test

tagsValues := []map[string]string{
nil,
{},
}

for _, tag := range tagValues {
m := map[string]string{"x": tag}
tagsValues = append(tagsValues, m)
}

for _, tag1 := range tagValues {
for _, tag2 := range tagValues {
m := map[string]string{
"x": tag1,
"y": tag2,
}
tagsValues = append(tagsValues, m)
}
}

states := []tagsState{}

for _, tags1 := range tagsValues {
for _, tags2 := range tagsValues {
states = append(states, tagsState{
DefaultTags: tags1,
ResourceTags: tags2,
})
}
}

t.Logf("total state space: %v states", len(states))
t.Logf("random-sampling 100 state transitions")

for i := 0; i < 100; i++ {
t.Run(fmt.Sprintf("test-%d", i), func(t *testing.T) {
t.Parallel()
i := rand.Intn(len(states))
j := rand.Intn(len(states))
state1, state2 := states[i], states[j]
state1.validateTransitionTo(t, state2)
})
}
}

type tagsState struct {
DefaultTags map[string]string `json:"defaultTags"`
ResourceTags map[string]string `json:"resourceTags"`
}

func (st tagsState) serialize(t *testing.T) string {
bytes, err := json.Marshal(st)
require.NoError(t, err)
return string(bytes)
}

func (st tagsState) validateTransitionTo(t *testing.T, st2 tagsState) {
t.Logf("state1 = %v", st.serialize(t))
t.Logf("state2 = %v", st2.serialize(t))

integration.ProgramTest(t, &integration.ProgramTestOptions{
Dir: "tags-combinations-go",
ExtraRuntimeValidation: st.validateStateResult(1),
EditDirs: []integration.EditDir{{
Dir: filepath.Join("tags-combinations-go", "step1"),
Additive: true,
ExtraRuntimeValidation: st2.validateStateResult(2),
}},
Config: map[string]string{
"aws:region": getEnvRegion(t),
"state1": st.serialize(t),
"state2": st2.serialize(t),
},
Quick: true,
DestroyOnCleanup: true,
})
}

func (st tagsState) expectedTags() map[string]string {
r := map[string]string{}
for k, v := range st.DefaultTags {
r[k] = v
}
for k, v := range st.ResourceTags {
r[k] = v
}
return r
}

func (st tagsState) validateStateResult(phase int) func(
t *testing.T,
stack integration.RuntimeValidationStackInfo,
) {
return func(t *testing.T, stack integration.RuntimeValidationStackInfo) {
for k, v := range stack.Outputs {
actualTagsJSON := v.(string)
var actualTags map[string]string
err := json.Unmarshal([]byte(actualTagsJSON), &actualTags)
require.NoError(t, err)
t.Logf("phase: %d", phase)
t.Logf("state: %v", st.serialize(t))
require.Equalf(t, st.expectedTags(), actualTags, "key=%s", k)
t.Logf("key=%s tags are as expected: %v", k, actualTagsJSON)
}
}
}
8 changes: 4 additions & 4 deletions examples/go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,10 @@ go 1.21.0
require (
github.com/aws/aws-sdk-go v1.45.24
github.com/pulumi/pulumi-aws/provider/v6 v6.0.0-00010101000000-000000000000
github.com/pulumi/pulumi-terraform-bridge/pf v0.18.2
github.com/pulumi/pulumi-terraform-bridge/pf v0.18.4-0.20231031145559-a6951e8fe01f
github.com/pulumi/pulumi-terraform-bridge/testing v0.0.2-0.20230927165309-e3fd9503f2d3
github.com/pulumi/pulumi/pkg/v3 v3.90.1
github.com/pulumi/pulumi/sdk/v3 v3.90.1
github.com/pulumi/pulumi/pkg/v3 v3.91.1
github.com/pulumi/pulumi/sdk/v3 v3.91.1
github.com/stretchr/testify v1.8.4
google.golang.org/protobuf v1.31.0
gopkg.in/yaml.v2 v2.4.0
Expand Down Expand Up @@ -258,7 +258,7 @@ require (
github.com/pkg/term v1.1.0 // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect
github.com/pulumi/esc v0.5.6 // indirect
github.com/pulumi/pulumi-terraform-bridge/v3 v3.63.1 // indirect
github.com/pulumi/pulumi-terraform-bridge/v3 v3.63.3-0.20231031145559-a6951e8fe01f // indirect
github.com/pulumi/pulumi-terraform-bridge/x/muxer v0.0.7-0.20230801203955-5d215c892096 // indirect
github.com/pulumi/terraform-diff-reader v0.0.2 // indirect
github.com/rivo/uniseg v0.4.4 // indirect
Expand Down
16 changes: 8 additions & 8 deletions examples/go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -2322,18 +2322,18 @@ github.com/pulumi/esc v0.5.6 h1:4WV3X7OEVcChIwbSG+JxhZDdmq/q7lFPaSjHRYlPwmI=
github.com/pulumi/esc v0.5.6/go.mod h1:wpwNfVS5fV7Kd51j4dJ6FWYlKfxdqyppgp0gtkzqH04=
github.com/pulumi/providertest v0.0.2 h1:XtnO603irWnSgfIbz6OK8hffIJ0GIrKRl3tYMJwI1H8=
github.com/pulumi/providertest v0.0.2/go.mod h1:kZYBA14iemv3X4G4xsBKaa72zVbn//IyL5HTYKpLuy0=
github.com/pulumi/pulumi-terraform-bridge/pf v0.18.2 h1:lSm5nbZETkeVNJQTcGOmuHCSXPhDj72dFC2Wan08Wpg=
github.com/pulumi/pulumi-terraform-bridge/pf v0.18.2/go.mod h1:4ii0lFkIQMhCZg5du0xEtAB36Kk0WuLtDVO/ntTxRIs=
github.com/pulumi/pulumi-terraform-bridge/pf v0.18.4-0.20231031145559-a6951e8fe01f h1:WUczZ/fIBhzjitXqX97x676as5GAAbaRCfAFkooBRzw=
github.com/pulumi/pulumi-terraform-bridge/pf v0.18.4-0.20231031145559-a6951e8fe01f/go.mod h1:apif6z4X21j859e6+gKmw4WoaalaF8TyKMVSa8kgjAI=
github.com/pulumi/pulumi-terraform-bridge/testing v0.0.2-0.20230927165309-e3fd9503f2d3 h1:bBWWeAtSPPYpKYlPZr2h0BiYgWQpHRIk0HO/MQmB+jc=
github.com/pulumi/pulumi-terraform-bridge/testing v0.0.2-0.20230927165309-e3fd9503f2d3/go.mod h1:vAQ7DeddebQ7FHdRaSG6ijuS28FS9PC4j8Y9wUuue0c=
github.com/pulumi/pulumi-terraform-bridge/v3 v3.63.1 h1:hBgediyT2LdS5yfD5AMiCmBJ/TYP94Xxv6a4TcAfV0g=
github.com/pulumi/pulumi-terraform-bridge/v3 v3.63.1/go.mod h1:6YVbDo019OeHkQWo9MnUbBy6cCgCQeoXZDjmR9SYmUA=
github.com/pulumi/pulumi-terraform-bridge/v3 v3.63.3-0.20231031145559-a6951e8fe01f h1:JH23wbM75FS7tF16XysQ54fMEFixJSRZ07OJSbvLxAA=
github.com/pulumi/pulumi-terraform-bridge/v3 v3.63.3-0.20231031145559-a6951e8fe01f/go.mod h1:ye7JUFqTNbBh6ohcr1KpyXNv+kYFYvZAIqXqts4Ialc=
github.com/pulumi/pulumi-terraform-bridge/x/muxer v0.0.7-0.20230801203955-5d215c892096 h1:1nzT9XuyTHdcWJboYNMPPdW0B0mQdXYg8Az5tF96MXY=
github.com/pulumi/pulumi-terraform-bridge/x/muxer v0.0.7-0.20230801203955-5d215c892096/go.mod h1:1pLAP9kryYta3Xrw99oh7BmxY6PYb+z2m7ENNCJMIRQ=
github.com/pulumi/pulumi/pkg/v3 v3.90.1 h1:RFC/eqTbDfIvfeVQL8WaPmyQr1KzZhAGIIDGr9jj9y8=
github.com/pulumi/pulumi/pkg/v3 v3.90.1/go.mod h1:J+WbfN30g3FfQifpLjQPI0UhPsC9ASEePLK8Nix06A8=
github.com/pulumi/pulumi/sdk/v3 v3.90.1 h1:iT4t57N92WGhEQtg+KVDEmYzgfEyri39eihQzcNmtrM=
github.com/pulumi/pulumi/sdk/v3 v3.90.1/go.mod h1:zYaQQibB2pYKy/uG4c4YkX7lQIBpZ0KsuMaq/3HsIBQ=
github.com/pulumi/pulumi/pkg/v3 v3.91.1 h1:xHnyEwJO9we2zCiM9gHTkJxjZ6a6yi5vYCwWHCYRj9Y=
github.com/pulumi/pulumi/pkg/v3 v3.91.1/go.mod h1:dzBQDJyCOEhtBVN5INA5/i9yG9DZlsStl/mAkrhs9II=
github.com/pulumi/pulumi/sdk/v3 v3.91.1 h1:6I9GMmHv23X+G6hoduU1XE6hBWSNtB+zcb1MX17YvlA=
github.com/pulumi/pulumi/sdk/v3 v3.91.1/go.mod h1:zYaQQibB2pYKy/uG4c4YkX7lQIBpZ0KsuMaq/3HsIBQ=
github.com/pulumi/terraform-diff-reader v0.0.2 h1:kTE4nEXU3/SYXESvAIem+wyHMI3abqkI3OhJ0G04LLI=
github.com/pulumi/terraform-diff-reader v0.0.2/go.mod h1:sZ9FUzGO+yM41hsQHs/yIcj/Y993qMdBxBU5mpDmAfQ=
github.com/pulumi/terraform-plugin-sdk/v2 v2.0.0-20230912190043-e6d96b3b8f7e h1:blSirnXqvm8JXLxwxelsBroUNRhOHakDO7cgJUYTdpQ=
Expand Down
3 changes: 3 additions & 0 deletions examples/tags-combinations-go/Pulumi.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
name: tags-combinations-go
description: Testing provider capability to tag resources correctly
runtime: go
65 changes: 65 additions & 0 deletions examples/tags-combinations-go/go.mod
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
module github.com/pulumi/pulumi-aws/examples/tags-combinations-go

go 1.21

require (
github.com/pulumi/pulumi-aws/sdk/v6 v6.6.1
github.com/pulumi/pulumi/sdk/v3 v3.50.1
)

require (
github.com/Microsoft/go-winio v0.5.2 // indirect
github.com/ProtonMail/go-crypto v0.0.0-20210428141323-04723f9f07d7 // indirect
github.com/acomagu/bufpipe v1.0.3 // indirect
github.com/aead/chacha20 v0.0.0-20180709150244-8b13a72661da // indirect
github.com/blang/semver v3.5.1+incompatible // indirect
github.com/cheggaaa/pb v1.0.18 // indirect
github.com/djherbis/times v1.2.0 // indirect
github.com/emirpasic/gods v1.12.0 // indirect
github.com/go-git/gcfg v1.5.0 // indirect
github.com/go-git/go-billy/v5 v5.3.1 // indirect
github.com/go-git/go-git/v5 v5.4.2 // indirect
github.com/gofrs/uuid v3.3.0+incompatible // indirect
github.com/gogo/protobuf v1.3.2 // indirect
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b // indirect
github.com/golang/protobuf v1.4.2 // indirect
github.com/grpc-ecosystem/grpc-opentracing v0.0.0-20180507213350-8e809c8a8645 // indirect
github.com/hashicorp/errwrap v1.0.0 // indirect
github.com/hashicorp/go-multierror v1.0.0 // indirect
github.com/imdario/mergo v0.3.12 // indirect
github.com/inconshreveable/mousetrap v1.0.0 // indirect
github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect
github.com/kevinburke/ssh_config v0.0.0-20201106050909-4977a11b4351 // indirect
github.com/mattn/go-runewidth v0.0.8 // indirect
github.com/mitchellh/go-homedir v1.1.0 // indirect
github.com/mitchellh/go-ps v1.0.0 // indirect
github.com/opentracing/basictracer-go v1.0.0 // indirect
github.com/opentracing/opentracing-go v1.1.0 // indirect
github.com/pkg/errors v0.9.1 // indirect
github.com/pkg/term v1.1.0 // indirect
github.com/rivo/uniseg v0.2.0 // indirect
github.com/rogpeppe/go-internal v1.8.1 // indirect
github.com/sabhiram/go-gitignore v0.0.0-20180611051255-d3107576ba94 // indirect
github.com/santhosh-tekuri/jsonschema/v5 v5.0.0 // indirect
github.com/sergi/go-diff v1.1.0 // indirect
github.com/spf13/cobra v1.4.0 // indirect
github.com/spf13/pflag v1.0.5 // indirect
github.com/texttheater/golang-levenshtein v0.0.0-20191208221605-eb6844b05fc6 // indirect
github.com/tweekmonster/luser v0.0.0-20161003172636-3fa38070dbd7 // indirect
github.com/uber/jaeger-client-go v2.22.1+incompatible // indirect
github.com/uber/jaeger-lib v2.2.0+incompatible // indirect
github.com/xanzy/ssh-agent v0.3.2 // indirect
go.uber.org/atomic v1.6.0 // indirect
golang.org/x/crypto v0.0.0-20220824171710-5757bc0c5503 // indirect
golang.org/x/net v0.7.0 // indirect
golang.org/x/sys v0.5.0 // indirect
golang.org/x/term v0.5.0 // indirect
golang.org/x/text v0.7.0 // indirect
google.golang.org/genproto v0.0.0-20200608115520-7c474a2e3482 // indirect
google.golang.org/grpc v1.29.1 // indirect
google.golang.org/protobuf v1.24.0 // indirect
gopkg.in/warnings.v0 v0.1.2 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
lukechampine.com/frand v1.4.2 // indirect
sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0 // indirect
)
Loading