Switch to black box testing of KustTarget and Resource

This commit is contained in:
Jeffrey Regan
2019-02-11 15:23:26 -08:00
parent 74d3e92b55
commit 48717f3f30
24 changed files with 136 additions and 67 deletions

View File

@@ -108,7 +108,7 @@ func (o *Options) RunBuild(
return err return err
} }
defer ldr.Cleanup() defer ldr.Cleanup()
kt, err := target.NewKustTarget(ldr, fSys, rf, ptf) kt, err := target.NewKustTarget(ldr, rf, ptf)
if err != nil { if err != nil {
return err return err
} }

View File

@@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
package resource package resource_test
import ( import (
"reflect" "reflect"
@@ -22,6 +22,7 @@ import (
"sigs.k8s.io/kustomize/pkg/internal/loadertest" "sigs.k8s.io/kustomize/pkg/internal/loadertest"
"sigs.k8s.io/kustomize/pkg/patch" "sigs.k8s.io/kustomize/pkg/patch"
. "sigs.k8s.io/kustomize/pkg/resource"
) )
func TestSliceFromPatches(t *testing.T) { func TestSliceFromPatches(t *testing.T) {

View File

@@ -38,7 +38,7 @@ func (r *Resource) String() string {
if err != nil { if err != nil {
return "<" + err.Error() + ">" return "<" + err.Error() + ">"
} }
return strings.TrimSpace(string(bs)) return strings.TrimSpace(string(bs)) + r.options.String()
} }
// DeepCopy returns a new copy of resource // DeepCopy returns a new copy of resource

View File

@@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
package resource package resource_test
import ( import (
"testing" "testing"
@@ -22,6 +22,7 @@ import (
"sigs.k8s.io/kustomize/k8sdeps/kunstruct" "sigs.k8s.io/kustomize/k8sdeps/kunstruct"
"sigs.k8s.io/kustomize/pkg/gvk" "sigs.k8s.io/kustomize/pkg/gvk"
"sigs.k8s.io/kustomize/pkg/resid" "sigs.k8s.io/kustomize/pkg/resid"
. "sigs.k8s.io/kustomize/pkg/resource"
) )
var factory = NewFactory( var factory = NewFactory(
@@ -37,7 +38,9 @@ var testConfigMap = factory.FromMap(
}, },
}) })
const testConfigMapString = `{"apiVersion":"v1","kind":"ConfigMap","metadata":{"name":"winnie","namespace":"hundred-acre-wood"}}` const genArgOptions = "{nsfx:false,beh:unspecified}"
const configMapAsString = `{"apiVersion":"v1","kind":"ConfigMap","metadata":{"name":"winnie","namespace":"hundred-acre-wood"}}`
var testDeployment = factory.FromMap( var testDeployment = factory.FromMap(
map[string]interface{}{ map[string]interface{}{
@@ -48,7 +51,7 @@ var testDeployment = factory.FromMap(
}, },
}) })
const testDeploymentString = `{"apiVersion":"apps/v1","kind":"Deployment","metadata":{"name":"pooh"}}` const deploymentAsString = `{"apiVersion":"apps/v1","kind":"Deployment","metadata":{"name":"pooh"}}`
func TestResourceString(t *testing.T) { func TestResourceString(t *testing.T) {
tests := []struct { tests := []struct {
@@ -57,11 +60,11 @@ func TestResourceString(t *testing.T) {
}{ }{
{ {
in: testConfigMap, in: testConfigMap,
s: testConfigMapString, s: configMapAsString + genArgOptions,
}, },
{ {
in: testDeployment, in: testDeployment,
s: testDeploymentString, s: deploymentAsString + genArgOptions,
}, },
} }
for _, test := range tests { for _, test := range tests {

View File

@@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
package target package target_test
import ( import (
"testing" "testing"

View File

@@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
package target package target_test
import ( import (
"testing" "testing"

View File

@@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
package target package target_test
import ( import (
"testing" "testing"

View File

@@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
package target package target_test
import ( import (
"testing" "testing"

View File

@@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
package target package target_test
import ( import (
"testing" "testing"

View File

@@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
package target package target_test
import ( import (
"testing" "testing"

View File

@@ -11,7 +11,7 @@ See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
package target package target_test
import ( import (
"testing" "testing"

View File

@@ -26,7 +26,6 @@ import (
"github.com/ghodss/yaml" "github.com/ghodss/yaml"
"github.com/pkg/errors" "github.com/pkg/errors"
"sigs.k8s.io/kustomize/pkg/constants" "sigs.k8s.io/kustomize/pkg/constants"
"sigs.k8s.io/kustomize/pkg/fs"
"sigs.k8s.io/kustomize/pkg/ifc" "sigs.k8s.io/kustomize/pkg/ifc"
"sigs.k8s.io/kustomize/pkg/ifc/transformer" "sigs.k8s.io/kustomize/pkg/ifc/transformer"
interror "sigs.k8s.io/kustomize/pkg/internal/error" interror "sigs.k8s.io/kustomize/pkg/internal/error"
@@ -42,7 +41,6 @@ import (
type KustTarget struct { type KustTarget struct {
kustomization *types.Kustomization kustomization *types.Kustomization
ldr ifc.Loader ldr ifc.Loader
fSys fs.FileSystem
rFactory *resmap.Factory rFactory *resmap.Factory
tFactory transformer.Factory tFactory transformer.Factory
} }
@@ -50,7 +48,6 @@ type KustTarget struct {
// NewKustTarget returns a new instance of KustTarget primed with a Loader. // NewKustTarget returns a new instance of KustTarget primed with a Loader.
func NewKustTarget( func NewKustTarget(
ldr ifc.Loader, ldr ifc.Loader,
fSys fs.FileSystem,
rFactory *resmap.Factory, rFactory *resmap.Factory,
tFactory transformer.Factory) (*KustTarget, error) { tFactory transformer.Factory) (*KustTarget, error) {
content, err := loadKustFile(ldr) content, err := loadKustFile(ldr)
@@ -70,7 +67,6 @@ func NewKustTarget(
return &KustTarget{ return &KustTarget{
kustomization: &k, kustomization: &k,
ldr: ldr, ldr: ldr,
fSys: fSys,
rFactory: rFactory, rFactory: rFactory,
tFactory: tFactory, tFactory: tFactory,
}, nil }, nil
@@ -123,7 +119,7 @@ func unmarshal(y []byte, o interface{}) error {
// MakeCustomizedResMap creates a ResMap per kustomization instructions. // MakeCustomizedResMap creates a ResMap per kustomization instructions.
// The Resources in the returned ResMap are fully customized. // The Resources in the returned ResMap are fully customized.
func (kt *KustTarget) MakeCustomizedResMap() (resmap.ResMap, error) { func (kt *KustTarget) MakeCustomizedResMap() (resmap.ResMap, error) {
ra, err := kt.accumulateTarget() ra, err := kt.AccumulateTarget()
if err != nil { if err != nil {
return nil, err return nil, err
} }
@@ -147,11 +143,11 @@ func (kt *KustTarget) shouldAddHashSuffixesToGeneratedResources() bool {
!kt.kustomization.GeneratorOptions.DisableNameSuffixHash !kt.kustomization.GeneratorOptions.DisableNameSuffixHash
} }
// accumulateTarget returns a new ResAccumulator, // AccumulateTarget returns a new ResAccumulator,
// holding customized resources and the data/rules used // holding customized resources and the data/rules used
// to do so. The name back references and vars are // to do so. The name back references and vars are
// not yet fixed. // not yet fixed.
func (kt *KustTarget) accumulateTarget() ( func (kt *KustTarget) AccumulateTarget() (
ra *ResAccumulator, err error) { ra *ResAccumulator, err error) {
// TODO(monopole): Get rid of the KustomizationErrors accumulator. // TODO(monopole): Get rid of the KustomizationErrors accumulator.
// It's not consistently used, and complicates tests. // It's not consistently used, and complicates tests.
@@ -249,15 +245,15 @@ func (kt *KustTarget) accumulateBases() (
continue continue
} }
subKt, err := NewKustTarget( subKt, err := NewKustTarget(
ldr, kt.fSys, kt.rFactory, kt.tFactory) ldr, kt.rFactory, kt.tFactory)
if err != nil { if err != nil {
errs.Append(errors.Wrap(err, "couldn't make target for "+path)) errs.Append(errors.Wrap(err, "couldn't make target for "+path))
ldr.Cleanup() ldr.Cleanup()
continue continue
} }
subRa, err := subKt.accumulateTarget() subRa, err := subKt.AccumulateTarget()
if err != nil { if err != nil {
errs.Append(errors.Wrap(err, "accumulateTarget")) errs.Append(errors.Wrap(err, "AccumulateTarget"))
ldr.Cleanup() ldr.Cleanup()
continue continue
} }

View File

@@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
package target package target_test
import ( import (
"encoding/base64" "encoding/base64"
@@ -23,18 +23,18 @@ import (
"strings" "strings"
"testing" "testing"
"sigs.k8s.io/kustomize/pkg/fs"
"sigs.k8s.io/kustomize/pkg/gvk" "sigs.k8s.io/kustomize/pkg/gvk"
"sigs.k8s.io/kustomize/pkg/ifc" "sigs.k8s.io/kustomize/pkg/ifc"
"sigs.k8s.io/kustomize/pkg/internal/loadertest" "sigs.k8s.io/kustomize/pkg/internal/loadertest"
"sigs.k8s.io/kustomize/pkg/resid" "sigs.k8s.io/kustomize/pkg/resid"
"sigs.k8s.io/kustomize/pkg/resmap" "sigs.k8s.io/kustomize/pkg/resmap"
"sigs.k8s.io/kustomize/pkg/resource" "sigs.k8s.io/kustomize/pkg/resource"
. "sigs.k8s.io/kustomize/pkg/target"
"sigs.k8s.io/kustomize/pkg/types" "sigs.k8s.io/kustomize/pkg/types"
) )
const ( const (
kustomizationContent1 = ` kustomizationContent = `
apiVersion: kustomize.config.k8s.io/v1beta1 apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization kind: Kustomization
namePrefix: foo- namePrefix: foo-
@@ -47,6 +47,8 @@ commonAnnotations:
resources: resources:
- deployment.yaml - deployment.yaml
- namespace.yaml - namespace.yaml
generatorOptions:
disableNameSuffixHash: false
configMapGenerator: configMapGenerator:
- name: literalConfigMap - name: literalConfigMap
literals: literals:
@@ -83,9 +85,9 @@ metadata:
]` ]`
) )
func TestResources1(t *testing.T) { func TestResources(t *testing.T) {
th := NewKustTestHarness(t, "/whatever") th := NewKustTestHarness(t, "/whatever")
th.writeK("/whatever/", kustomizationContent1) th.writeK("/whatever/", kustomizationContent)
th.writeF("/whatever/deployment.yaml", deploymentContent) th.writeF("/whatever/deployment.yaml", deploymentContent)
th.writeF("/whatever/namespace.yaml", namespaceContent) th.writeF("/whatever/namespace.yaml", namespaceContent)
th.writeF("/whatever/jsonpatch.json", jsonpatchContent) th.writeF("/whatever/jsonpatch.json", jsonpatchContent)
@@ -146,7 +148,9 @@ func TestResources1(t *testing.T) {
"DB_USERNAME": "admin", "DB_USERNAME": "admin",
"DB_PASSWORD": "somepw", "DB_PASSWORD": "somepw",
}, },
}, &types.GeneratorArgs{}, nil), },
&types.GeneratorArgs{},
&types.GeneratorOptions{}),
resid.NewResIdWithPrefixSuffixNamespace( resid.NewResIdWithPrefixSuffixNamespace(
gvk.Gvk{Version: "v1", Kind: "Secret"}, gvk.Gvk{Version: "v1", Kind: "Secret"},
"secret", "foo-", "-bar", "ns1"): th.fromMapAndOption( "secret", "foo-", "-bar", "ns1"): th.fromMapAndOption(
@@ -168,7 +172,9 @@ func TestResources1(t *testing.T) {
"DB_USERNAME": base64.StdEncoding.EncodeToString([]byte("admin")), "DB_USERNAME": base64.StdEncoding.EncodeToString([]byte("admin")),
"DB_PASSWORD": base64.StdEncoding.EncodeToString([]byte("somepw")), "DB_PASSWORD": base64.StdEncoding.EncodeToString([]byte("somepw")),
}, },
}, &types.GeneratorArgs{}, nil), },
&types.GeneratorArgs{},
&types.GeneratorOptions{}),
resid.NewResIdWithPrefixSuffixNamespace( resid.NewResIdWithPrefixSuffixNamespace(
gvk.Gvk{Version: "v1", Kind: "Namespace"}, gvk.Gvk{Version: "v1", Kind: "Namespace"},
"ns1", "foo-", "-bar", ""): th.fromMap( "ns1", "foo-", "-bar", ""): th.fromMap(
@@ -198,8 +204,7 @@ func TestResources1(t *testing.T) {
} }
func TestKustomizationNotFound(t *testing.T) { func TestKustomizationNotFound(t *testing.T) {
_, err := NewKustTarget( _, err := NewKustTarget(loadertest.NewFakeLoader("/foo"), nil, nil)
loadertest.NewFakeLoader("/foo"), fs.MakeFakeFS(), nil, nil)
if err == nil { if err == nil {
t.Fatalf("expected an error") t.Fatalf("expected an error")
} }
@@ -211,7 +216,7 @@ func TestKustomizationNotFound(t *testing.T) {
func TestResourceNotFound(t *testing.T) { func TestResourceNotFound(t *testing.T) {
th := NewKustTestHarness(t, "/whatever") th := NewKustTestHarness(t, "/whatever")
th.writeK("/whatever", kustomizationContent1) th.writeK("/whatever", kustomizationContent)
_, err := th.makeKustTarget().MakeCustomizedResMap() _, err := th.makeKustTarget().MakeCustomizedResMap()
if err == nil { if err == nil {
t.Fatalf("Didn't get the expected error for an unknown resource") t.Fatalf("Didn't get the expected error for an unknown resource")
@@ -232,13 +237,12 @@ func findSecret(m resmap.ResMap) *resource.Resource {
func TestDisableNameSuffixHash(t *testing.T) { func TestDisableNameSuffixHash(t *testing.T) {
th := NewKustTestHarness(t, "/whatever") th := NewKustTestHarness(t, "/whatever")
th.writeK("/whatever/", kustomizationContent1) th.writeK("/whatever/", kustomizationContent)
th.writeF("/whatever/deployment.yaml", deploymentContent) th.writeF("/whatever/deployment.yaml", deploymentContent)
th.writeF("/whatever/namespace.yaml", namespaceContent) th.writeF("/whatever/namespace.yaml", namespaceContent)
th.writeF("/whatever/jsonpatch.json", jsonpatchContent) th.writeF("/whatever/jsonpatch.json", jsonpatchContent)
kt := th.makeKustTarget() m, err := th.makeKustTarget().MakeCustomizedResMap()
m, err := kt.MakeCustomizedResMap()
if err != nil { if err != nil {
t.Fatalf("unexpected Resources error %v", err) t.Fatalf("unexpected Resources error %v", err)
} }
@@ -250,9 +254,11 @@ func TestDisableNameSuffixHash(t *testing.T) {
t.Errorf("unexpected secret resource name: %s", secret.GetName()) t.Errorf("unexpected secret resource name: %s", secret.GetName())
} }
kt.kustomization.GeneratorOptions = &types.GeneratorOptions{ th.writeK("/whatever/",
DisableNameSuffixHash: true} strings.Replace(kustomizationContent,
m, err = kt.MakeCustomizedResMap() "disableNameSuffixHash: false",
"disableNameSuffixHash: true", -1))
m, err = th.makeKustTarget().MakeCustomizedResMap()
if err != nil { if err != nil {
t.Fatalf("unexpected Resources error %v", err) t.Fatalf("unexpected Resources error %v", err)
} }
@@ -338,11 +344,11 @@ vars:
name: heron name: heron
apiVersion: v300 apiVersion: v300
`) `)
ra, err := th.makeKustTarget().accumulateTarget() ra, err := th.makeKustTarget().AccumulateTarget()
if err != nil { if err != nil {
t.Fatalf("Err: %v", err) t.Fatalf("Err: %v", err)
} }
vars := ra.varSet.Set() vars := ra.Vars()
if len(vars) != 2 { if len(vars) != 2 {
t.Fatalf("unexpected size %d", len(vars)) t.Fatalf("unexpected size %d", len(vars))
} }
@@ -388,11 +394,11 @@ vars:
bases: bases:
- ../o1 - ../o1
`) `)
ra, err := th.makeKustTarget().accumulateTarget() ra, err := th.makeKustTarget().AccumulateTarget()
if err != nil { if err != nil {
t.Fatalf("Err: %v", err) t.Fatalf("Err: %v", err)
} }
vars := ra.varSet.Set() vars := ra.Vars()
if len(vars) != 4 { if len(vars) != 4 {
for i, v := range vars { for i, v := range vars {
fmt.Printf("%v: %v\n", i, v) fmt.Printf("%v: %v\n", i, v)
@@ -441,7 +447,7 @@ vars:
bases: bases:
- ../o1 - ../o1
`) `)
_, err := th.makeKustTarget().accumulateTarget() _, err := th.makeKustTarget().AccumulateTarget()
if err == nil { if err == nil {
t.Fatalf("expected var collision") t.Fatalf("expected var collision")
} }

View File

@@ -14,24 +14,24 @@ See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
package target package target_test
// A collection of utilities used in target tests. // A collection of utilities used in target tests.
import ( import (
"fmt" "fmt"
"path/filepath" "path/filepath"
"sigs.k8s.io/kustomize/pkg/transformers/config/defaultconfig"
"strings" "strings"
"testing" "testing"
"sigs.k8s.io/kustomize/k8sdeps/kunstruct" "sigs.k8s.io/kustomize/k8sdeps/kunstruct"
"sigs.k8s.io/kustomize/k8sdeps/transformer" "sigs.k8s.io/kustomize/k8sdeps/transformer"
"sigs.k8s.io/kustomize/pkg/constants" "sigs.k8s.io/kustomize/pkg/constants"
"sigs.k8s.io/kustomize/pkg/fs"
"sigs.k8s.io/kustomize/pkg/internal/loadertest" "sigs.k8s.io/kustomize/pkg/internal/loadertest"
"sigs.k8s.io/kustomize/pkg/resmap" "sigs.k8s.io/kustomize/pkg/resmap"
"sigs.k8s.io/kustomize/pkg/resource" "sigs.k8s.io/kustomize/pkg/resource"
. "sigs.k8s.io/kustomize/pkg/target"
"sigs.k8s.io/kustomize/pkg/transformers/config/defaultconfig"
"sigs.k8s.io/kustomize/pkg/types" "sigs.k8s.io/kustomize/pkg/types"
) )
@@ -50,17 +50,8 @@ func NewKustTestHarness(t *testing.T, path string) *KustTestHarness {
} }
func (th *KustTestHarness) makeKustTarget() *KustTarget { func (th *KustTestHarness) makeKustTarget() *KustTarget {
// Warning: the following filesystem - a fake - must be rooted at /.
// This fs root is used as the working directory for the shell spawned by
// the secretgenerator, and has nothing to do with the filesystem used
// to load relative paths from the fake filesystem.
// This trick only works for secret generator commands that don't actually
// try to read the file system, because these tests don't write to the
// real "/" directory. See use of exec package in the secretfactory.
fakeFs := fs.MakeFakeFS()
fakeFs.Mkdir("/")
kt, err := NewKustTarget( kt, err := NewKustTarget(
th.ldr, fakeFs, th.rf, transformer.NewFactoryImpl()) th.ldr, th.rf, transformer.NewFactoryImpl())
if err != nil { if err != nil {
th.t.Fatalf("Unexpected construction error %v", err) th.t.Fatalf("Unexpected construction error %v", err)
} }

View File

@@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
package target package target_test
import ( import (
"strings" "strings"

View File

@@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
package target package target_test
import ( import (
"testing" "testing"

View File

@@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
package target package target_test
import ( import (
"testing" "testing"

View File

@@ -55,6 +55,11 @@ func (ra *ResAccumulator) ResMap() resmap.ResMap {
return result return result
} }
// Vars returns a copy of underlying vars.
func (ra *ResAccumulator) Vars() []types.Var {
return ra.varSet.Set()
}
func (ra *ResAccumulator) MergeResourcesWithErrorOnIdCollision( func (ra *ResAccumulator) MergeResourcesWithErrorOnIdCollision(
resources resmap.ResMap) (err error) { resources resmap.ResMap) (err error) {
ra.resMap, err = resmap.MergeWithErrorOnIdCollision( ra.resMap, err = resmap.MergeWithErrorOnIdCollision(

View File

@@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
package target package target_test
import ( import (
"strings" "strings"
@@ -25,6 +25,7 @@ import (
"sigs.k8s.io/kustomize/pkg/resid" "sigs.k8s.io/kustomize/pkg/resid"
"sigs.k8s.io/kustomize/pkg/resmap" "sigs.k8s.io/kustomize/pkg/resmap"
"sigs.k8s.io/kustomize/pkg/resource" "sigs.k8s.io/kustomize/pkg/resource"
. "sigs.k8s.io/kustomize/pkg/target"
"sigs.k8s.io/kustomize/pkg/transformers/config" "sigs.k8s.io/kustomize/pkg/transformers/config"
"sigs.k8s.io/kustomize/pkg/types" "sigs.k8s.io/kustomize/pkg/types"
) )

View File

@@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
package target package target_test
import ( import (
"strings" "strings"

View File

@@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
package target package target_test
import ( import (
"testing" "testing"

View File

@@ -16,6 +16,11 @@ limitations under the License.
package types package types
import (
"strconv"
"strings"
)
// GenArgs contains both generator args and options // GenArgs contains both generator args and options
type GenArgs struct { type GenArgs struct {
args *GeneratorArgs args *GeneratorArgs
@@ -30,6 +35,18 @@ func NewGenArgs(args *GeneratorArgs, opts *GeneratorOptions) *GenArgs {
} }
} }
func (g *GenArgs) String() string {
if g == nil {
return "{nilGenArgs}"
}
return "{" +
strings.Join([]string{
"nsfx:" + strconv.FormatBool(g.NeedsHashSuffix()),
"beh:" + g.Behavior().String()},
",") +
"}"
}
// NeedHashSuffix returns true if the hash suffix is needed. // NeedHashSuffix returns true if the hash suffix is needed.
// It is needed when the two conditions are both met // It is needed when the two conditions are both met
// 1) GenArgs is not nil // 1) GenArgs is not nil

47
pkg/types/genargs_test.go Normal file
View File

@@ -0,0 +1,47 @@
/*
Copyright 2018 The Kubernetes Authors.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package types_test
import (
"testing"
. "sigs.k8s.io/kustomize/pkg/types"
)
func TestGenArgs_String(t *testing.T) {
tests := []struct {
ga *GenArgs
expected string
}{
{
ga: nil,
expected: "{nilGenArgs}",
},
{
ga: &GenArgs{},
expected: "{nsfx:false,beh:unspecified}",
},
{
ga: NewGenArgs(
&GeneratorArgs{Behavior: "merge"},
&GeneratorOptions{DisableNameSuffixHash: false}),
expected: "{nsfx:true,beh:merge}",
},
}
for _, test := range tests {
if test.ga.String() != test.expected {
t.Fatalf("Expected '%s', got '%s'", test.expected, test.ga.String())
}
}
}

View File

@@ -75,9 +75,11 @@ type VarSet struct {
set []Var set []Var
} }
// Set returns the var set. // Set returns a copy of the var set.
func (vs *VarSet) Set() []Var { func (vs *VarSet) Set() []Var {
return vs.set s := make([]Var, len(vs.set))
copy(s, vs.set)
return s
} }
// MergeSet absorbs other vars with error on name collision. // MergeSet absorbs other vars with error on name collision.