github.com/myhau/pulumi/pkg/v3@v3.70.2-0.20221116134521-f2775972e587/engine/lifecycletest/step_generator_test.go (about) 1 package lifecycletest 2 3 import ( 4 "testing" 5 6 "github.com/blang/semver" 7 . "github.com/pulumi/pulumi/pkg/v3/engine" 8 "github.com/pulumi/pulumi/pkg/v3/resource/deploy/deploytest" 9 "github.com/pulumi/pulumi/sdk/v3/go/common/resource" 10 "github.com/pulumi/pulumi/sdk/v3/go/common/resource/plugin" 11 "github.com/stretchr/testify/assert" 12 "github.com/stretchr/testify/require" 13 ) 14 15 // TestDuplicateURN tests that duplicate URNs are disallowed. 16 func TestDuplicateURN(t *testing.T) { 17 t.Parallel() 18 19 loaders := []*deploytest.ProviderLoader{ 20 deploytest.NewProviderLoader("pkgA", semver.MustParse("1.0.0"), func() (plugin.Provider, error) { 21 return &deploytest.Provider{}, nil 22 }), 23 } 24 25 program := deploytest.NewLanguageRuntime(func(_ plugin.RunInfo, monitor *deploytest.ResourceMonitor) error { 26 _, _, _, err := monitor.RegisterResource("pkgA:m:typA", "resA", true) 27 require.NoError(t, err) 28 29 _, _, _, err = monitor.RegisterResource("pkgA:m:typA", "resA", true) 30 assert.Error(t, err) 31 32 // Reads use the same URN namespace as register so make sure this also errors 33 _, _, err = monitor.ReadResource("pkgA:m:typA", "resA", "id", "", resource.PropertyMap{}, "", "") 34 assert.Error(t, err) 35 36 return nil 37 }) 38 host := deploytest.NewPluginHost(nil, nil, program, loaders...) 39 40 p := &TestPlan{ 41 Options: UpdateOptions{Host: host}, 42 } 43 44 project := p.GetProject() 45 _, res := TestOp(Update).Run(project, p.GetTarget(t, nil), p.Options, false, p.BackendClient, nil) 46 assert.NotNil(t, res) 47 } 48 49 // TestDuplicateAlias tests that multiple new resources may not claim to be aliases for the same old resource. 50 func TestDuplicateAlias(t *testing.T) { 51 t.Parallel() 52 53 loaders := []*deploytest.ProviderLoader{ 54 deploytest.NewProviderLoader("pkgA", semver.MustParse("1.0.0"), func() (plugin.Provider, error) { 55 return &deploytest.Provider{}, nil 56 }), 57 } 58 59 program := func(monitor *deploytest.ResourceMonitor) error { 60 _, _, _, err := monitor.RegisterResource("pkgA:m:typA", "resA", true) 61 assert.NoError(t, err) 62 return nil 63 } 64 65 runtime := deploytest.NewLanguageRuntime(func(_ plugin.RunInfo, monitor *deploytest.ResourceMonitor) error { 66 return program(monitor) 67 }) 68 host := deploytest.NewPluginHost(nil, nil, runtime, loaders...) 69 70 p := &TestPlan{ 71 Options: UpdateOptions{Host: host}, 72 } 73 resURN := p.NewURN("pkgA:m:typA", "resA", "") 74 75 project := p.GetProject() 76 snap, res := TestOp(Update).Run(project, p.GetTarget(t, nil), p.Options, false, p.BackendClient, nil) 77 assert.Nil(t, res) 78 79 program = func(monitor *deploytest.ResourceMonitor) error { 80 _, _, _, err := monitor.RegisterResource("pkgA:m:typA", "resB", true, deploytest.ResourceOptions{ 81 AliasURNs: []resource.URN{resURN}, 82 }) 83 require.NoError(t, err) 84 85 _, _, _, err = monitor.RegisterResource("pkgA:m:typA", "resC", true, deploytest.ResourceOptions{ 86 AliasURNs: []resource.URN{resURN}, 87 }) 88 assert.Error(t, err) 89 return nil 90 } 91 92 _, res = TestOp(Update).Run(project, p.GetTarget(t, snap), p.Options, false, p.BackendClient, nil) 93 assert.NotNil(t, res) 94 }