Test new types.Var.DeepEqual method.

This commit is contained in:
Jerome Brette
2019-07-06 09:18:54 -05:00
parent abc419b5f9
commit b7405f3872
3 changed files with 26 additions and 17 deletions

View File

@@ -6,6 +6,7 @@ package target_test
import ( import (
"encoding/base64" "encoding/base64"
"fmt" "fmt"
"reflect"
"strings" "strings"
"testing" "testing"
@@ -333,7 +334,12 @@ vars:
t.Fatalf("unexpected size %d", len(vars)) t.Fatalf("unexpected size %d", len(vars))
} }
for i := range vars[:2] { for i := range vars[:2] {
if !vars[i].DeepEqual(someVars[i]) { // We have to enforce the Defaulting call in someVars[i]
// to protect from a potential call of vars[i].ObjRef.GVK()
// during AccumulateTarget
vars[i].Defaulting()
someVars[i].Defaulting()
if !reflect.DeepEqual(vars[i], someVars[i]) {
t.Fatalf("unexpected var[%d]:\n %v\n %v", i, vars[i], someVars[i]) t.Fatalf("unexpected var[%d]:\n %v\n %v", i, vars[i], someVars[i])
} }
} }
@@ -386,7 +392,9 @@ resources:
t.Fatalf("expected 4 vars, got %d", len(vars)) t.Fatalf("expected 4 vars, got %d", len(vars))
} }
for i := range vars { for i := range vars {
if !vars[i].DeepEqual(someVars[i]) { vars[i].Defaulting()
someVars[i].Defaulting()
if !reflect.DeepEqual(vars[i], someVars[i]) {
t.Fatalf("unexpected var[%d]:\n %v\n %v", i, vars[i], someVars[i]) t.Fatalf("unexpected var[%d]:\n %v\n %v", i, vars[i], someVars[i])
} }
} }

View File

@@ -66,22 +66,21 @@ type FieldSelector struct {
} }
// defaulting sets reference to field used by default. // defaulting sets reference to field used by default.
func (v *Var) defaulting() { func (v *Var) Defaulting() {
if v.FieldRef.FieldPath == "" { if v.FieldRef.FieldPath == "" {
v.FieldRef.FieldPath = defaultFieldPath v.FieldRef.FieldPath = defaultFieldPath
} }
v.ObjRef.GVK()
} }
// VarEquals returns true if var a and b are Equals. // DeepEqual returns true if var a and b are Equals.
// Note 1: The objects are unchanged by the VarEqual
// Note 2: Should be normalize be FieldPath before doing
// the DeepEqual. spec.a[b] is supposed to be the same
// as spec.a.b
func (v Var) DeepEqual(other Var) bool { func (v Var) DeepEqual(other Var) bool {
v.ObjRef.GVK() v.Defaulting()
if v.FieldRef.FieldPath == "" { other.Defaulting()
v.FieldRef.FieldPath = "metadata.name"
}
other.ObjRef.GVK()
if other.FieldRef.FieldPath == "" {
other.FieldRef.FieldPath = "metadata.name"
}
return reflect.DeepEqual(v, other) return reflect.DeepEqual(v, other)
} }
@@ -144,7 +143,7 @@ func (vs *VarSet) Merge(v Var) error {
return fmt.Errorf( return fmt.Errorf(
"var '%s' already encountered", v.Name) "var '%s' already encountered", v.Name)
} }
v.defaulting() v.Defaulting()
vs.set[v.Name] = v vs.set[v.Name] = v
return nil return nil
} }
@@ -152,7 +151,9 @@ func (vs *VarSet) Merge(v Var) error {
// AbsorbSet absorbs other vars with error on (name,value) collision. // AbsorbSet absorbs other vars with error on (name,value) collision.
func (vs *VarSet) AbsorbSet(incoming VarSet) error { func (vs *VarSet) AbsorbSet(incoming VarSet) error {
for _, v := range incoming.set { for _, v := range incoming.set {
vs.Absorb(v) if err := vs.Absorb(v); err != nil {
return err
}
} }
return nil return nil
} }
@@ -174,12 +175,12 @@ func (vs *VarSet) Absorb(v Var) error {
conflicting := vs.Get(v.Name) conflicting := vs.Get(v.Name)
if conflicting == nil { if conflicting == nil {
// no conflict. The var is valid. // no conflict. The var is valid.
v.defaulting() v.Defaulting()
vs.set[v.Name] = v vs.set[v.Name] = v
return nil return nil
} }
if !v.DeepEqual(*conflicting) { if !reflect.DeepEqual(v, *conflicting) {
// two vars with the same name are pointing at two // two vars with the same name are pointing at two
// different resources. // different resources.
return fmt.Errorf( return fmt.Errorf(

View File

@@ -81,7 +81,7 @@ func TestDefaulting(t *testing.T) {
Name: "my-secret", Name: "my-secret",
}, },
} }
v.defaulting() v.Defaulting()
if v.FieldRef.FieldPath != defaultFieldPath { if v.FieldRef.FieldPath != defaultFieldPath {
t.Fatalf("expected %s, got %v", t.Fatalf("expected %s, got %v",
defaultFieldPath, v.FieldRef.FieldPath) defaultFieldPath, v.FieldRef.FieldPath)