blob: 5882c6ef56fdc7e513e88fbaeed413fc45007cba [file] [log] [blame] [edit]
/*
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 merge_test
import (
"testing"
"sigs.k8s.io/structured-merge-diff/v4/fieldpath"
. "sigs.k8s.io/structured-merge-diff/v4/internal/fixture"
"sigs.k8s.io/structured-merge-diff/v4/typed"
)
var setFieldsParser = func() Parser {
parser, err := typed.NewParser(`types:
- name: sets
map:
fields:
- name: list
type:
list:
elementType:
scalar: string
elementRelationship: associative`)
if err != nil {
panic(err)
}
return SameVersionParser{T: parser.Type("sets")}
}()
func TestUpdateSet(t *testing.T) {
tests := map[string]TestCase{
"apply_twice": {
Ops: []Operation{
Apply{
Manager: "default",
APIVersion: "v1",
Object: `
list:
- a
- c
`,
},
Apply{
Manager: "default",
APIVersion: "v1",
Object: `
list:
- a
- b
- c
- d
`,
},
},
Object: `
list:
- a
- b
- c
- d
`,
APIVersion: "v1",
Managed: fieldpath.ManagedFields{
"default": fieldpath.NewVersionedSet(
_NS(
_P("list", _V("a")),
_P("list", _V("b")),
_P("list", _V("c")),
_P("list", _V("d")),
),
"v1",
false,
),
},
},
"apply_update_apply_no_overlap": {
Ops: []Operation{
Apply{
Manager: "default",
APIVersion: "v1",
Object: `
list:
- a
- c
`,
},
Update{
Manager: "controller",
APIVersion: "v1",
Object: `
list:
- a
- b
- c
- d
`,
},
Apply{
Manager: "default",
APIVersion: "v1",
Object: `
list:
- a
- aprime
- c
- cprime
`,
},
},
Object: `
list:
- a
- aprime
- b
- c
- cprime
- d
`,
APIVersion: "v1",
Managed: fieldpath.ManagedFields{
"default": fieldpath.NewVersionedSet(
_NS(
_P("list", _V("a")),
_P("list", _V("aprime")),
_P("list", _V("c")),
_P("list", _V("cprime")),
),
"v1",
false,
),
"controller": fieldpath.NewVersionedSet(
_NS(
_P("list", _V("b")),
_P("list", _V("d")),
),
"v1",
false,
),
},
},
"apply_update_apply_no_overlap_and_different_version": {
Ops: []Operation{
Apply{
Manager: "default",
APIVersion: "v1",
Object: `
list:
- a
- c
`,
},
Update{
Manager: "controller",
APIVersion: "v2",
Object: `
list:
- a
- b
- c
- d
`,
},
Apply{
Manager: "default",
APIVersion: "v1",
Object: `
list:
- a
- aprime
- c
- cprime
`,
},
},
Object: `
list:
- a
- aprime
- b
- c
- cprime
- d
`,
APIVersion: "v1",
Managed: fieldpath.ManagedFields{
"default": fieldpath.NewVersionedSet(
_NS(
_P("list", _V("a")),
_P("list", _V("aprime")),
_P("list", _V("c")),
_P("list", _V("cprime")),
),
"v1",
false,
),
"controller": fieldpath.NewVersionedSet(
_NS(
_P("list", _V("b")),
_P("list", _V("d")),
),
"v2",
false,
),
},
},
"apply_update_apply_with_overlap": {
Ops: []Operation{
Apply{
Manager: "default",
APIVersion: "v1",
Object: `
list:
- a
- c
`,
},
Update{
Manager: "controller",
APIVersion: "v1",
Object: `
list:
- a
- b
- c
- d
`,
},
Apply{
Manager: "default",
APIVersion: "v1",
Object: `
list:
- a
- b
- c
`,
},
},
Object: `
list:
- a
- b
- c
- d
`,
APIVersion: "v1",
Managed: fieldpath.ManagedFields{
"default": fieldpath.NewVersionedSet(
_NS(
_P("list", _V("a")),
_P("list", _V("b")),
_P("list", _V("c")),
),
"v1",
false,
),
"controller": fieldpath.NewVersionedSet(
_NS(
_P("list", _V("b")),
_P("list", _V("d")),
),
"v1",
false,
),
},
},
"apply_update_apply_with_overlap_and_different_version": {
Ops: []Operation{
Apply{
Manager: "default",
APIVersion: "v1",
Object: `
list:
- a
- c
`,
},
Update{
Manager: "controller",
APIVersion: "v2",
Object: `
list:
- a
- b
- c
- d
`,
},
Apply{
Manager: "default",
APIVersion: "v1",
Object: `
list:
- a
- b
- c
`,
},
},
Object: `
list:
- a
- b
- c
- d
`,
APIVersion: "v1",
Managed: fieldpath.ManagedFields{
"default": fieldpath.NewVersionedSet(
_NS(
_P("list", _V("a")),
_P("list", _V("b")),
_P("list", _V("c")),
),
"v1",
false,
),
"controller": fieldpath.NewVersionedSet(
_NS(
_P("list", _V("b")),
_P("list", _V("d")),
),
"v2",
false,
),
},
},
"apply_twice_reorder": {
Ops: []Operation{
Apply{
Manager: "default",
APIVersion: "v1",
Object: `
list:
- a
- b
- c
- d
`,
},
Apply{
Manager: "default",
APIVersion: "v1",
Object: `
list:
- a
- d
- c
- b
`,
},
},
Object: `
list:
- a
- d
- c
- b
`,
APIVersion: "v1",
Managed: fieldpath.ManagedFields{
"default": fieldpath.NewVersionedSet(
_NS(
_P("list", _V("a")),
_P("list", _V("b")),
_P("list", _V("c")),
_P("list", _V("d")),
),
"v1",
false,
),
},
},
"apply_update_apply_reorder": {
Ops: []Operation{
Apply{
Manager: "default",
APIVersion: "v1",
Object: `
list:
- a
- b
- c
- d
`,
},
Update{
Manager: "controller",
APIVersion: "v1",
Object: `
list:
- a
- d
- c
- b
`,
},
Apply{
Manager: "default",
APIVersion: "v1",
Object: `
list:
- a
- b
- c
- d
`,
},
},
Object: `
list:
- a
- b
- c
- d
`,
APIVersion: "v1",
Managed: fieldpath.ManagedFields{
"default": fieldpath.NewVersionedSet(
_NS(
_P("list", _V("a")),
_P("list", _V("b")),
_P("list", _V("c")),
_P("list", _V("d")),
),
"v1",
false,
),
},
},
"apply_update_apply_reorder_across_versions": {
Ops: []Operation{
Apply{
Manager: "default",
APIVersion: "v1",
Object: `
list:
- a
- b
- c
- d
`,
},
Update{
Manager: "controller",
APIVersion: "v1",
Object: `
list:
- a
- d
- c
- b
`,
},
Apply{
Manager: "default",
APIVersion: "v2",
Object: `
list:
- a
- b
- c
- d
`,
},
},
Object: `
list:
- a
- b
- c
- d
`,
APIVersion: "v1",
Managed: fieldpath.ManagedFields{
"default": fieldpath.NewVersionedSet(
_NS(
_P("list", _V("a")),
_P("list", _V("b")),
_P("list", _V("c")),
_P("list", _V("d")),
),
"v2",
false,
),
},
},
"apply_twice_remove": {
Ops: []Operation{
Apply{
Manager: "default",
APIVersion: "v1",
Object: `
list:
- a
- b
- c
- d
`,
},
Apply{
Manager: "default",
APIVersion: "v1",
Object: `
list:
- a
- c
`,
},
},
Object: `
list:
- a
- c
`,
APIVersion: "v1",
Managed: fieldpath.ManagedFields{
"default": fieldpath.NewVersionedSet(
_NS(
_P("list", _V("a")),
_P("list", _V("c")),
),
"v1",
false,
),
},
},
"apply_twice_remove_across_versions": {
Ops: []Operation{
Apply{
Manager: "default",
APIVersion: "v1",
Object: `
list:
- a
- b
- c
- d
`,
},
Apply{
Manager: "default",
APIVersion: "v2",
Object: `
list:
- a
- c
- e
`,
},
},
Object: `
list:
- a
- c
- e
`,
APIVersion: "v1",
Managed: fieldpath.ManagedFields{
"default": fieldpath.NewVersionedSet(
_NS(
_P("list", _V("a")),
_P("list", _V("c")),
_P("list", _V("e")),
),
"v2",
false,
),
},
},
}
for name, test := range tests {
t.Run(name, func(t *testing.T) {
if err := test.Test(setFieldsParser); err != nil {
t.Fatal(err)
}
})
}
}