/* Copyright 2017 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 cloud import ( "errors" "testing" "k8s.io/kubernetes/pkg/cloudprovider/providers/gce/cloud/meta" ) func TestEqualResourceID(t *testing.T) { t.Parallel() for _, tc := range []struct { a *ResourceID b *ResourceID }{ { a: &ResourceID{"some-gce-project", "projects", nil}, b: &ResourceID{"some-gce-project", "projects", nil}, }, { a: &ResourceID{"", "networks", meta.GlobalKey("my-net")}, b: &ResourceID{"", "networks", meta.GlobalKey("my-net")}, }, { a: &ResourceID{"some-gce-project", "projects", meta.GlobalKey("us-central1")}, b: &ResourceID{"some-gce-project", "projects", meta.GlobalKey("us-central1")}, }, } { if !tc.a.Equal(tc.b) { t.Errorf("%v.Equal(%v) = false, want true", tc.a, tc.b) } } for _, tc := range []struct { a *ResourceID b *ResourceID }{ { a: &ResourceID{"some-gce-project", "projects", nil}, b: &ResourceID{"some-other-project", "projects", nil}, }, { a: &ResourceID{"some-gce-project", "projects", nil}, b: &ResourceID{"some-gce-project", "projects", meta.GlobalKey("us-central1")}, }, { a: &ResourceID{"some-gce-project", "networks", meta.GlobalKey("us-central1")}, b: &ResourceID{"some-gce-project", "projects", meta.GlobalKey("us-central1")}, }, } { if tc.a.Equal(tc.b) { t.Errorf("%v.Equal(%v) = true, want false", tc.a, tc.b) } } } func TestParseResourceURL(t *testing.T) { t.Parallel() for _, tc := range []struct { in string r *ResourceID }{ { "https://www.googleapis.com/compute/v1/projects/some-gce-project", &ResourceID{"some-gce-project", "projects", nil}, }, { "https://www.googleapis.com/compute/v1/projects/some-gce-project/regions/us-central1", &ResourceID{"some-gce-project", "regions", meta.GlobalKey("us-central1")}, }, { "https://www.googleapis.com/compute/v1/projects/some-gce-project/zones/us-central1-b", &ResourceID{"some-gce-project", "zones", meta.GlobalKey("us-central1-b")}, }, { "https://www.googleapis.com/compute/v1/projects/some-gce-project/global/operations/operation-1513289952196-56054460af5a0-b1dae0c3-9bbf9dbf", &ResourceID{"some-gce-project", "operations", meta.GlobalKey("operation-1513289952196-56054460af5a0-b1dae0c3-9bbf9dbf")}, }, { "https://www.googleapis.com/compute/alpha/projects/some-gce-project/regions/us-central1/addresses/my-address", &ResourceID{"some-gce-project", "addresses", meta.RegionalKey("my-address", "us-central1")}, }, { "https://www.googleapis.com/compute/v1/projects/some-gce-project/zones/us-central1-c/instances/instance-1", &ResourceID{"some-gce-project", "instances", meta.ZonalKey("instance-1", "us-central1-c")}, }, { "http://localhost:3990/compute/beta/projects/some-gce-project/global/operations/operation-1513289952196-56054460af5a0-b1dae0c3-9bbf9dbf", &ResourceID{"some-gce-project", "operations", meta.GlobalKey("operation-1513289952196-56054460af5a0-b1dae0c3-9bbf9dbf")}, }, { "http://localhost:3990/compute/alpha/projects/some-gce-project/regions/dev-central1/addresses/my-address", &ResourceID{"some-gce-project", "addresses", meta.RegionalKey("my-address", "dev-central1")}, }, { "http://localhost:3990/compute/v1/projects/some-gce-project/zones/dev-central1-std/instances/instance-1", &ResourceID{"some-gce-project", "instances", meta.ZonalKey("instance-1", "dev-central1-std")}, }, { "projects/some-gce-project", &ResourceID{"some-gce-project", "projects", nil}, }, { "projects/some-gce-project/regions/us-central1", &ResourceID{"some-gce-project", "regions", meta.GlobalKey("us-central1")}, }, { "projects/some-gce-project/zones/us-central1-b", &ResourceID{"some-gce-project", "zones", meta.GlobalKey("us-central1-b")}, }, { "projects/some-gce-project/global/operations/operation-1513289952196-56054460af5a0-b1dae0c3-9bbf9dbf", &ResourceID{"some-gce-project", "operations", meta.GlobalKey("operation-1513289952196-56054460af5a0-b1dae0c3-9bbf9dbf")}, }, { "projects/some-gce-project/regions/us-central1/addresses/my-address", &ResourceID{"some-gce-project", "addresses", meta.RegionalKey("my-address", "us-central1")}, }, { "projects/some-gce-project/zones/us-central1-c/instances/instance-1", &ResourceID{"some-gce-project", "instances", meta.ZonalKey("instance-1", "us-central1-c")}, }, { "global/networks/my-network", &ResourceID{"", "networks", meta.GlobalKey("my-network")}, }, { "regions/us-central1/subnetworks/my-subnet", &ResourceID{"", "subnetworks", meta.RegionalKey("my-subnet", "us-central1")}, }, { "zones/us-central1-c/instances/instance-1", &ResourceID{"", "instances", meta.ZonalKey("instance-1", "us-central1-c")}, }, } { r, err := ParseResourceURL(tc.in) if err != nil { t.Errorf("ParseResourceURL(%q) = %+v, %v; want _, nil", tc.in, r, err) continue } if !r.Equal(tc.r) { t.Errorf("ParseResourceURL(%q) = %+v, nil; want %+v, nil", tc.in, r, tc.r) } } // Malformed URLs. for _, tc := range []string{ "", "/", "/a", "/a/b", "/a/b/c", "/a/b/c/d", "/a/b/c/d/e", "/a/b/c/d/e/f", "https://www.googleapis.com/compute/v1/projects/some-gce-project/global", "projects/some-gce-project/global", "projects/some-gce-project/global/foo", "projects/some-gce-project/global/foo/bar/baz", "projects/some-gce-project/regions/us-central1/res", "projects/some-gce-project/zones/us-central1-c/res", "projects/some-gce-project/zones/us-central1-c/res/name/extra", } { r, err := ParseResourceURL(tc) if err == nil { t.Errorf("ParseResourceURL(%q) = %+v, %v, want _, error", tc, r, err) } } } type A struct { A, B, C string } type B struct { A, B, D string } type E struct{} func (*E) MarshalJSON() ([]byte, error) { return nil, errors.New("injected error") } func TestCopyVisJSON(t *testing.T) { t.Parallel() var b B srcA := &A{"aa", "bb", "cc"} err := copyViaJSON(&b, srcA) if err != nil { t.Errorf(`copyViaJSON(&b, %+v) = %v, want nil`, srcA, err) } else { expectedB := B{"aa", "bb", ""} if b != expectedB { t.Errorf("b == %+v, want %+v", b, expectedB) } } var a A srcB := &B{"aaa", "bbb", "ccc"} err = copyViaJSON(&a, srcB) if err != nil { t.Errorf(`copyViaJSON(&a, %+v) = %v, want nil`, srcB, err) } else { expectedA := A{"aaa", "bbb", ""} if a != expectedA { t.Errorf("a == %+v, want %+v", a, expectedA) } } if err := copyViaJSON(&a, &E{}); err == nil { t.Errorf("copyViaJSON(&a, &E{}) = nil, want error") } } func TestSelfLink(t *testing.T) { t.Parallel() for _, tc := range []struct { ver meta.Version project string resource string key *meta.Key want string }{ { meta.VersionAlpha, "proj1", "addresses", meta.RegionalKey("key1", "us-central1"), "https://www.googleapis.com/compute/alpha/projects/proj1/regions/us-central1/addresses/key1", }, { meta.VersionBeta, "proj3", "disks", meta.ZonalKey("key2", "us-central1-b"), "https://www.googleapis.com/compute/beta/projects/proj3/zones/us-central1-b/disks/key2", }, { meta.VersionGA, "proj4", "urlMaps", meta.GlobalKey("key3"), "https://www.googleapis.com/compute/v1/projects/proj4/global/urlMaps/key3", }, { meta.VersionGA, "proj4", "projects", nil, "https://www.googleapis.com/compute/v1/projects/proj4", }, { meta.VersionGA, "proj4", "regions", meta.GlobalKey("us-central1"), "https://www.googleapis.com/compute/v1/projects/proj4/regions/us-central1", }, { meta.VersionGA, "proj4", "zones", meta.GlobalKey("us-central1-a"), "https://www.googleapis.com/compute/v1/projects/proj4/zones/us-central1-a", }, } { if link := SelfLink(tc.ver, tc.project, tc.resource, tc.key); link != tc.want { t.Errorf("SelfLink(%v, %q, %q, %v) = %v, want %q", tc.ver, tc.project, tc.resource, tc.key, link, tc.want) } } }