Skip to content

Commit

Permalink
Refactor gcp tests to use pulumitest directly (#2508)
Browse files Browse the repository at this point in the history
The GCP upgrade tests were written in the early days of
[pulumitest](https://github.com/pulumi/providertest/tree/main/pulumitest),
so do not make use of some of the library features. This change
refactors the tests to use it directly. This gets rid of some
boilerplate code and allows direct access to the pulumitest options in
tests.

It also attaches the provider directly which means we no longer have to
keep rebuilding the provider ourselves to test it.

Additionally I've refactored TestCloudRunV2StateMigration which is an
upgrade test with a source edit to use the library code instead of the
code copied from the AWS provider.
  • Loading branch information
VenelinMartinov authored Oct 9, 2024
1 parent 63c8ac5 commit 018c00a
Show file tree
Hide file tree
Showing 5 changed files with 84 additions and 274 deletions.
4 changes: 3 additions & 1 deletion provider/go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,8 @@ replace (
github.com/hashicorp/terraform-plugin-sdk/v2 => github.com/pulumi/terraform-plugin-sdk/v2 v2.0.0-20240520223432-0c0bf0d65f10
github.com/hashicorp/terraform-provider-google-beta => ../upstream
github.com/hashicorp/vault => github.com/hashicorp/vault v1.2.0
// Until we propagate this from the bridge, replace this here to fix a panic [pulumi/pulumi-terraform-bridge#2088]
github.com/pulumi/pulumi-terraform-bridge/x/muxer => github.com/pulumi/pulumi-terraform-bridge/x/muxer v0.0.10
)

require (
Expand Down Expand Up @@ -212,7 +214,7 @@ require (
github.com/pulumi/inflector v0.1.1 // indirect
github.com/pulumi/pulumi-java/pkg v0.16.1 // indirect
github.com/pulumi/pulumi-terraform-bridge/x/muxer v0.0.9-0.20240227144008-2da15b3d6f6e // indirect
github.com/pulumi/pulumi-yaml v1.10.0 // indirect
github.com/pulumi/pulumi-yaml v1.10.3 // indirect
github.com/pulumi/schema-tools v0.1.2 // indirect
github.com/pulumi/terraform-diff-reader v0.0.2 // indirect
github.com/rivo/uniseg v0.4.4 // indirect
Expand Down
8 changes: 4 additions & 4 deletions provider/go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -1987,10 +1987,10 @@ github.com/pulumi/pulumi-terraform-bridge/pf v0.44.1 h1:39UPLBqbnvylm2heU/Rxa1+G
github.com/pulumi/pulumi-terraform-bridge/pf v0.44.1/go.mod h1:Zj4XBf+TuV3um7y82X3xk2yQiP+pnQ7YxMc4fq/rVVw=
github.com/pulumi/pulumi-terraform-bridge/v3 v3.91.1 h1:Twh0IKS1pGHP6LHDq1oR0vbHlV52asoUCC7spEJl3Ao=
github.com/pulumi/pulumi-terraform-bridge/v3 v3.91.1/go.mod h1:DvueDDtOIbf7W1Or4oH0o7F990ozp/ROmlm/vgLoe+g=
github.com/pulumi/pulumi-terraform-bridge/x/muxer v0.0.9-0.20240227144008-2da15b3d6f6e h1:yON1jwN6gg4cjnOQF607I3fTiFyIDr9WSsQNXHD6wbM=
github.com/pulumi/pulumi-terraform-bridge/x/muxer v0.0.9-0.20240227144008-2da15b3d6f6e/go.mod h1:AvlZujvfRiEu+60frCGEhaLeGttjHwM/g+47+IdPZXw=
github.com/pulumi/pulumi-yaml v1.10.0 h1:djbgMJCxJBmYMr4kOpAXH5iauxGohYjEuTLfxD3NUUI=
github.com/pulumi/pulumi-yaml v1.10.0/go.mod h1://lTvwHpgJ+WBKeMGiLrd/jinc4dl3eWV5LZ3G8iCfE=
github.com/pulumi/pulumi-terraform-bridge/x/muxer v0.0.10 h1:VAXmHuldKd760ZlMe6khXeJY0ccY3TJF1g1FnWGccaM=
github.com/pulumi/pulumi-terraform-bridge/x/muxer v0.0.10/go.mod h1:+AQS/2h775Chx1a4vxb7cDdyiOsdEw2Q6gD7K5QCIwI=
github.com/pulumi/pulumi-yaml v1.10.3 h1:j5cjPiE32ILmjrWnC1cfZ0MWdqCZ8fg9wlaWk7HOtM4=
github.com/pulumi/pulumi-yaml v1.10.3/go.mod h1:MFMQXkaUP5YQUKVJ6Z/aagZDl2f8hdU9oGaJfTcMf1Y=
github.com/pulumi/pulumi/pkg/v3 v3.133.0 h1:j1rd7ToLZIQc5H0427ISOXSbOIIemZ6B0MXtRhQ38Yg=
github.com/pulumi/pulumi/pkg/v3 v3.133.0/go.mod h1:JtMAnrsFIccO138WcMfPdhO0PioDukKihnZC0xTRLwo=
github.com/pulumi/pulumi/sdk/v3 v3.133.0 h1:o+7dbJZY9BVgAjOF5GYIWgjp/zpKAgWZwD4pPjUMXKQ=
Expand Down
122 changes: 36 additions & 86 deletions provider/provider_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,13 @@ import (
"path/filepath"
"testing"

_ "embed"

"github.com/stretchr/testify/require"

"github.com/pulumi/providertest"
"github.com/pulumi/providertest/optproviderupgrade"
"github.com/pulumi/providertest/providers"
"github.com/pulumi/providertest/pulumitest"
"github.com/pulumi/providertest/pulumitest/assertpreview"
"github.com/pulumi/providertest/pulumitest/opttest"
Expand Down Expand Up @@ -40,96 +43,18 @@ func TestUpgradeCoverage(t *testing.T) {
providertest.ReportUpgradeCoverage(t)
}

type UpgradeTestOpts struct {
baselineVersion string
assertFunc func(*testing.T, auto.PreviewResult)
config map[string]string
additionalProviders map[string]string
}

func WithBaselineVersion(baselineVersion string) func(opts *UpgradeTestOpts) {
return func(opts *UpgradeTestOpts) {
opts.baselineVersion = baselineVersion
}
}

func WithAssertFunc(assertFunc func(*testing.T, auto.PreviewResult)) func(opts *UpgradeTestOpts) {
return func(opts *UpgradeTestOpts) {
opts.assertFunc = assertFunc
}
}

func WithConfig(config map[string]string) func(opts *UpgradeTestOpts) {
return func(opts *UpgradeTestOpts) {
opts.config = config
}
}

func WithAdditionalProvider(provider, version string) func(opts *UpgradeTestOpts) {
return func(opts *UpgradeTestOpts) {
if opts.additionalProviders == nil {
opts.additionalProviders = map[string]string{}
}
opts.additionalProviders[provider] = version
}
}

func testProviderUpgrade(t *testing.T, dir string, opts ...func(*UpgradeTestOpts)) {
options := &UpgradeTestOpts{}
for _, o := range opts {
o(options)
}
testProviderUpgradeWithConfig(t, dir, options.baselineVersion, options.config, options.assertFunc,
options.additionalProviders)
}
//go:embed cmd/pulumi-resource-gcp/schema.json
var schemaBytes []byte

func testProviderUpgradeWithConfig(
t *testing.T, dir, baselineVersion string, config map[string]string,
assertFunction func(*testing.T, auto.PreviewResult), additionalProviders map[string]string,
) {
if testing.Short() {
t.Skipf("Skipping in testing.Short() mode, assuming this is a CI run without GCP creds")
}
cwd, err := os.Getwd()
require.NoError(t, err)
if baselineVersion == "" {
baselineVersion = defaultBaselineVersion
}
opts := []opttest.Option{
opttest.DownloadProviderVersion(providerName, baselineVersion),
opttest.LocalProviderPath(providerName, filepath.Join(cwd, "..", "bin")),
}
for prov, version := range additionalProviders {
opts = append(opts, opttest.DownloadProviderVersion(prov, version))
}
test := pulumitest.NewPulumiTest(t, dir, opts...)
test.SetConfig(t, "gcp:config:project", testProject)
for k, v := range config {
test.SetConfig(t, k, v)
}
// The SetConfig above does not seem to be working here.
t.Setenv("PULUMI_GCP_SKIP_REGION_VALIDATION", "true")
result := providertest.PreviewProviderUpgrade(t, test, providerName, baselineVersion,
optproviderupgrade.DisableAttach())
if assertFunction != nil {
assertFunction(t, result)
} else {
assertpreview.HasNoReplacements(t, result)
}
}

func providerServer(t *testing.T) pulumirpc.ResourceProviderServer {
func providerFactory[T any](T) (pulumirpc.ResourceProviderServer, error) {
ctx := context.Background()
version.Version = "0.0.1"
info := Provider()
p, err := pfbridge.MakeMuxedServer(ctx, info.Name, info,
/*
* We leave the schema blank. This will result in incorrect calls to
* GetSchema, but otherwise does not effect the provider. It reduces the
* time to test start by minutes.
*/
[]byte("{}"),
)(nil)
return pfbridge.MakeMuxedServer(ctx, info.Name, info, schemaBytes)(nil)
}

func providerServer(t *testing.T) pulumirpc.ResourceProviderServer {
p, err := providerFactory(t)
require.NoError(t, err)
return p
}
Expand All @@ -153,3 +78,28 @@ func pulumiTest(t *testing.T, dir string, opts ...opttest.Option) *pulumitest.Pu
test.SetConfig(t, "gcp:config:project", googleProj)
return test
}

func testUpgrade(t *testing.T, dir string, opts ...optproviderupgrade.PreviewProviderUpgradeOpt) auto.PreviewResult {
t.Helper()
if testing.Short() {
t.Skipf("Skipping in testing.Short() mode, assuming this is a CI run without cloud credentials")
return auto.PreviewResult{}
}

// Provider factory allows the tests to run against an in-process provider.
rpFactory := providers.ResourceProviderFactory(providerFactory)
pt := pulumitest.NewPulumiTest(t, dir,
opttest.AttachProvider(providerName, rpFactory))
googleProj := getProject()
pt.SetConfig(t, "gcp:config:project", googleProj)

upgradeOpts := []optproviderupgrade.PreviewProviderUpgradeOpt{
optproviderupgrade.DisableAttach(),
}
upgradeOpts = append(upgradeOpts, opts...)
previewResult := providertest.PreviewProviderUpgrade(t, pt, providerName, defaultBaselineVersion, upgradeOpts...)

assertpreview.HasNoReplacements(t, previewResult)
assertpreview.HasNoDeletes(t, previewResult)
return previewResult
}
Loading

0 comments on commit 018c00a

Please sign in to comment.