pulumi/pkg/resource/plugin/rpc_test.go
pat@pulumi.com f3cb37ef95 Do not expose unknowns to resource providers.
Before these changes, we were inconsistent in our treatment of unknown
property values across the resource provider RPC interface. `Check` and
`Diff` were retaining unknown properties in inputs and outputs;
`Create`, `Update`, and `Delete` were not. This interacted badly with
recent changes to `Check` to return all provider inputs--i.e. not just
defaults--from that method: if an unknown input was provided, it would
be present in the returned inputs, which would eventually confuse the
differ by giving the appearance of changes where none were present.

These changes remove unknowns from the provider interface entirely:
unknown property values are never passed to a provider, and a provider
must never return an unknown property value.

This is the primary piece of the fix for pulumi/pulumi-terraform#93.
2018-01-09 12:21:47 -08:00

111 lines
3.7 KiB
Go

// Copyright 2016-2017, Pulumi Corporation. All rights reserved.
package plugin
import (
"fmt"
"testing"
"github.com/stretchr/testify/assert"
"github.com/pulumi/pulumi/pkg/resource"
)
func TestAssetSerialize(t *testing.T) {
// Ensure that asset and archive serialization round trips.
text := "a test asset"
asset, err := resource.NewTextAsset(text)
assert.Nil(t, err)
assert.Equal(t, text, asset.Text)
assert.Equal(t, "e34c74529110661faae4e121e57165ff4cb4dbdde1ef9770098aa3695e6b6704", asset.Hash)
assetProps, err := MarshalPropertyValue(resource.NewAssetProperty(asset), MarshalOptions{})
assert.Nil(t, err)
fmt.Printf("%v\n", assetProps)
assetValue, err := UnmarshalPropertyValue(assetProps, MarshalOptions{})
assert.Nil(t, err)
assert.True(t, assetValue.IsAsset())
assetDes := assetValue.AssetValue()
assert.True(t, assetDes.IsText())
assert.Equal(t, text, assetDes.Text)
assert.Equal(t, "e34c74529110661faae4e121e57165ff4cb4dbdde1ef9770098aa3695e6b6704", assetDes.Hash)
arch, err := resource.NewAssetArchive(map[string]interface{}{"foo": asset})
assert.Nil(t, err)
assert.Equal(t, "d8ce0142b3b10300c7c76487fad770f794c1e84e1b0c73a4b2e1503d4fbac093", arch.Hash)
archProps, err := MarshalPropertyValue(resource.NewArchiveProperty(arch), MarshalOptions{})
assert.Nil(t, err)
archValue, err := UnmarshalPropertyValue(archProps, MarshalOptions{})
assert.Nil(t, err)
assert.True(t, archValue.IsArchive())
archDes := archValue.ArchiveValue()
assert.True(t, archDes.IsAssets())
assert.Equal(t, 1, len(archDes.Assets))
assert.True(t, archDes.Assets["foo"].(*resource.Asset).IsText())
assert.Equal(t, text, archDes.Assets["foo"].(*resource.Asset).Text)
assert.Equal(t, "d8ce0142b3b10300c7c76487fad770f794c1e84e1b0c73a4b2e1503d4fbac093", archDes.Hash)
}
func TestComputedSerialize(t *testing.T) {
// Ensure that computed properties survive round trips.
opts := MarshalOptions{KeepUnknowns: true}
{
cprop, err := MarshalPropertyValue(
resource.NewComputedProperty(
resource.Computed{Element: resource.NewStringProperty("")}), opts)
assert.Nil(t, err)
cpropU, err := UnmarshalPropertyValue(cprop, opts)
assert.Nil(t, err)
assert.True(t, cpropU.IsComputed())
assert.True(t, cpropU.ComputedValue().Element.IsString())
}
{
cprop, err := MarshalPropertyValue(
resource.NewComputedProperty(
resource.Computed{Element: resource.NewNumberProperty(0)}), opts)
assert.Nil(t, err)
cpropU, err := UnmarshalPropertyValue(cprop, opts)
assert.Nil(t, err)
assert.True(t, cpropU.IsComputed())
assert.True(t, cpropU.ComputedValue().Element.IsNumber())
}
}
func TestComputedSkip(t *testing.T) {
// Ensure that computed properties are skipped when KeepUnknowns == false.
opts := MarshalOptions{KeepUnknowns: false}
{
cprop, err := MarshalPropertyValue(
resource.NewComputedProperty(
resource.Computed{Element: resource.NewStringProperty("")}), opts)
assert.Nil(t, err)
assert.Nil(t, cprop)
}
{
cprop, err := MarshalPropertyValue(
resource.NewComputedProperty(
resource.Computed{Element: resource.NewNumberProperty(0)}), opts)
assert.Nil(t, err)
assert.Nil(t, cprop)
}
}
func TestComputedReject(t *testing.T) {
// Ensure that computed properties produce errors when RejectUnknowns == true.
opts := MarshalOptions{RejectUnknowns: true}
{
cprop, err := MarshalPropertyValue(
resource.NewComputedProperty(
resource.Computed{Element: resource.NewStringProperty("")}), opts)
assert.NotNil(t, err)
assert.Nil(t, cprop)
}
{
cprop, err := MarshalPropertyValue(
resource.NewComputedProperty(
resource.Computed{Element: resource.NewStringProperty("")}), MarshalOptions{KeepUnknowns: true})
assert.Nil(t, err)
cpropU, err := UnmarshalPropertyValue(cprop, opts)
assert.NotNil(t, err)
assert.Nil(t, cpropU)
}
}