From 8cd45e1e00bcc4a1c46b03b80470ba6e7ff41d16 Mon Sep 17 00:00:00 2001 From: Avi Deitcher Date: Fri, 13 Nov 2020 02:07:26 +0200 Subject: [PATCH] Update pkg/v1/platform.go Co-authored-by: jonjohnsonjr Signed-off-by: Avi Deitcher --- pkg/v1/match/match_test.go | 35 +++++++++++++++++++++ pkg/v1/platform.go | 17 +++++++++-- pkg/v1/platform_test.go | 62 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 112 insertions(+), 2 deletions(-) create mode 100644 pkg/v1/match/match_test.go create mode 100644 pkg/v1/platform_test.go diff --git a/pkg/v1/match/match_test.go b/pkg/v1/match/match_test.go new file mode 100644 index 000000000..2bae250a5 --- /dev/null +++ b/pkg/v1/match/match_test.go @@ -0,0 +1,35 @@ +// Copyright 2020 Google LLC All Rights Reserved. +// +// 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 match + +import ( + "testing" +) + +func TestName(t *testing.T) { + +} + +func TestAnnotation(t *testing.T) { + +} + +func TestPlatform(t *testing.T) { + +} + +func TestMediaTypes(t *testing.T) { + +} diff --git a/pkg/v1/platform.go b/pkg/v1/platform.go index 4fe21a85d..a022ab0c9 100644 --- a/pkg/v1/platform.go +++ b/pkg/v1/platform.go @@ -14,6 +14,10 @@ package v1 +import ( + "sort" +) + // Platform represents the target os/arch for an image. type Platform struct { Architecture string `json:"architecture"` @@ -26,9 +30,8 @@ type Platform struct { // Equals returns true if another platform is equivalent to this one. It must have all of the fields be the same func (p Platform) Equals(o Platform) bool { - // ignoring the Platform.Features and Platform.OSFeatures for now return p.OS == o.OS && p.Architecture == o.Architecture && p.Variant == o.Variant && p.OSVersion == o.OSVersion && - stringSliceEqual(p.OSFeatures, o.OSFeatures) && stringSliceEqual(p.Features, o.Features) + stringSliceEqualIgnoreOrder(p.OSFeatures, o.OSFeatures) && stringSliceEqualIgnoreOrder(p.Features, o.Features) } // stringSliceEqual compares 2 string slices and returns if their contents are identical. @@ -43,3 +46,13 @@ func stringSliceEqual(a, b []string) bool { } return true } + +// stringSliceEqualIgnoreOrder compares 2 string slices and returns if their contents are identical, ignoring order +func stringSliceEqualIgnoreOrder(a, b []string) bool { + a1, b1 := a[:], b[:] + if a1 != nil && b1 != nil { + sort.Strings(a1) + sort.Strings(b1) + } + return stringSliceEqual(a1, b1) +} diff --git a/pkg/v1/platform_test.go b/pkg/v1/platform_test.go new file mode 100644 index 000000000..4f60c36f3 --- /dev/null +++ b/pkg/v1/platform_test.go @@ -0,0 +1,62 @@ +// Copyright 2020 Google LLC All Rights Reserved. +// +// 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 v1_test + +import ( + "testing" + + v1 "github.com/google/go-containerregistry/pkg/v1" +) + +/* +type Platform struct { + Architecture string `json:"architecture"` + OS string `json:"os"` + OSVersion string `json:"os.version,omitempty"` + OSFeatures []string `json:"os.features,omitempty"` + Variant string `json:"variant,omitempty"` + Features []string `json:"features,omitempty"` +} +*/ +func TestPlatformEquals(t *testing.T) { + tests := []struct { + a v1.Platform + b v1.Platform + equal bool + }{ + {v1.Platform{Architecture: "amd64", OS: "linux"}, v1.Platform{Architecture: "amd64", OS: "linux"}, true}, + {v1.Platform{Architecture: "amd64", OS: "linux"}, v1.Platform{Architecture: "arm64", OS: "linux"}, false}, + {v1.Platform{Architecture: "amd64", OS: "linux"}, v1.Platform{Architecture: "amd64", OS: "darwin"}, false}, + {v1.Platform{Architecture: "amd64", OS: "linux", OSVersion: "5.0"}, v1.Platform{Architecture: "amd64", OS: "linux"}, false}, + {v1.Platform{Architecture: "amd64", OS: "linux", OSVersion: "5.0"}, v1.Platform{Architecture: "amd64", OS: "linux", OSVersion: "3.6"}, false}, + {v1.Platform{Architecture: "amd64", OS: "linux", Variant: "pios"}, v1.Platform{Architecture: "amd64", OS: "linux"}, false}, + {v1.Platform{Architecture: "amd64", OS: "linux", Variant: "pios"}, v1.Platform{Architecture: "amd64", OS: "linux", Variant: "ubuntu"}, false}, + {v1.Platform{Architecture: "amd64", OS: "linux", Variant: "pios"}, v1.Platform{Architecture: "amd64", OS: "linux", Variant: "pios"}, true}, + {v1.Platform{Architecture: "amd64", OS: "linux", OSFeatures: []string{"a", "b"}}, v1.Platform{Architecture: "amd64", OS: "linux"}, false}, + {v1.Platform{Architecture: "amd64", OS: "linux", OSFeatures: []string{"a", "b"}}, v1.Platform{Architecture: "amd64", OS: "linux", OSFeatures: []string{"a", "b"}}, true}, + {v1.Platform{Architecture: "amd64", OS: "linux", OSFeatures: []string{"a", "b"}}, v1.Platform{Architecture: "amd64", OS: "linux", OSFeatures: []string{"ac", "bd"}}, false}, + {v1.Platform{Architecture: "amd64", OS: "linux", OSFeatures: []string{"a", "b"}}, v1.Platform{Architecture: "amd64", OS: "linux", OSFeatures: []string{"b", "a"}}, true}, + + {v1.Platform{Architecture: "amd64", OS: "linux", Features: []string{"a", "b"}}, v1.Platform{Architecture: "amd64", OS: "linux"}, false}, + {v1.Platform{Architecture: "amd64", OS: "linux", Features: []string{"a", "b"}}, v1.Platform{Architecture: "amd64", OS: "linux", Features: []string{"a", "b"}}, true}, + {v1.Platform{Architecture: "amd64", OS: "linux", Features: []string{"a", "b"}}, v1.Platform{Architecture: "amd64", OS: "linux", Features: []string{"ac", "bd"}}, false}, + {v1.Platform{Architecture: "amd64", OS: "linux", Features: []string{"a", "b"}}, v1.Platform{Architecture: "amd64", OS: "linux", Features: []string{"b", "a"}}, true}, + } + for i, tt := range tests { + if equal := tt.a.Equals(tt.b); equal != tt.equal { + t.Errorf("%d: mismatched was %v expected %v; original %#v compared %#v", i, equal, tt.equal, tt.a, tt.b) + } + } +}