func TestSetDefaulServiceTargetPort(t *testing.T) { in := &versioned.Service{Spec: versioned.ServiceSpec{Ports: []versioned.ServicePort{{Port: 1234}}}} obj := roundTrip(t, runtime.Object(in)) out := obj.(*versioned.Service) if out.Spec.Ports[0].TargetPort != util.NewIntOrStringFromInt(1234) { t.Errorf("Expected TargetPort to be defaulted, got %v", out.Spec.Ports[0].TargetPort) } in = &versioned.Service{Spec: versioned.ServiceSpec{Ports: []versioned.ServicePort{{Port: 1234, TargetPort: util.NewIntOrStringFromInt(5678)}}}} obj = roundTrip(t, runtime.Object(in)) out = obj.(*versioned.Service) if out.Spec.Ports[0].TargetPort != util.NewIntOrStringFromInt(5678) { t.Errorf("Expected TargetPort to be unchanged, got %v", out.Spec.Ports[0].TargetPort) } }
func TestSetDefaultPodSpecHostNetwork(t *testing.T) { portNum := 8080 s := versioned.PodSpec{} s.HostNetwork = true s.Containers = []versioned.Container{ { Ports: []versioned.ContainerPort{ { ContainerPort: portNum, }, }, }, } pod := &versioned.Pod{ Spec: s, } obj2 := roundTrip(t, runtime.Object(pod)) pod2 := obj2.(*versioned.Pod) s2 := pod2.Spec hostPortNum := s2.Containers[0].Ports[0].HostPort if hostPortNum != portNum { t.Errorf("Expected container port to be defaulted, was made %d instead of %d", hostPortNum, portNum) } }
func TestDefaultRequestIsNotSetForReplicationController(t *testing.T) { s := versioned.PodSpec{} s.Containers = []versioned.Container{ { Resources: versioned.ResourceRequirements{ Limits: versioned.ResourceList{ versioned.ResourceCPU: resource.MustParse("100m"), }, }, }, } rc := &versioned.ReplicationController{ Spec: versioned.ReplicationControllerSpec{ Replicas: newInt(3), Template: &versioned.PodTemplateSpec{ ObjectMeta: versioned.ObjectMeta{ Labels: map[string]string{ "foo": "bar", }, }, Spec: s, }, }, } output := roundTrip(t, runtime.Object(rc)) rc2 := output.(*versioned.ReplicationController) defaultRequest := rc2.Spec.Template.Spec.Containers[0].Resources.Requests requestValue := defaultRequest[versioned.ResourceCPU] if requestValue.String() != "0" { t.Errorf("Expected 0 request value, got: %s", requestValue.String()) } }
func TestSetDefaultObjectFieldSelectorAPIVersion(t *testing.T) { s := versioned.PodSpec{ Containers: []versioned.Container{ { Env: []versioned.EnvVar{ { ValueFrom: &versioned.EnvVarSource{ FieldRef: &versioned.ObjectFieldSelector{}, }, }, }, }, }, } pod := &versioned.Pod{ Spec: s, } obj2 := roundTrip(t, runtime.Object(pod)) pod2 := obj2.(*versioned.Pod) s2 := pod2.Spec apiVersion := s2.Containers[0].Env[0].ValueFrom.FieldRef.APIVersion if apiVersion != "v1" { t.Errorf("Expected default APIVersion v1, got: %v", apiVersion) } }
func TestEncode_Ptr(t *testing.T) { grace := int64(30) pod := &api.Pod{ ObjectMeta: api.ObjectMeta{ Labels: map[string]string{"name": "foo"}, }, Spec: api.PodSpec{ RestartPolicy: api.RestartPolicyAlways, DNSPolicy: api.DNSClusterFirst, TerminationGracePeriodSeconds: &grace, }, } obj := runtime.Object(pod) data, err := testapi.Default.Codec().Encode(obj) obj2, err2 := testapi.Default.Codec().Decode(data) if err != nil || err2 != nil { t.Fatalf("Failure: '%v' '%v'", err, err2) } if _, ok := obj2.(*api.Pod); !ok { t.Fatalf("Got wrong type") } if !api.Semantic.DeepEqual(obj2, pod) { t.Errorf("Expected:\n %#v,\n Got:\n %#v", pod, obj2) } }
func TestSetDefaultNamespace(t *testing.T) { s := &versioned.Namespace{} obj2 := roundTrip(t, runtime.Object(s)) s2 := obj2.(*versioned.Namespace) if s2.Status.Phase != versioned.NamespaceActive { t.Errorf("Expected phase %v, got %v", versioned.NamespaceActive, s2.Status.Phase) } }
func TestSetDefaultDaemonSet(t *testing.T) { tests := []struct { ds *DaemonSet expectLabelsChange bool }{ { ds: &DaemonSet{ Spec: DaemonSetSpec{ Template: &v1.PodTemplateSpec{ ObjectMeta: v1.ObjectMeta{ Labels: map[string]string{ "foo": "bar", }, }, }, }, }, expectLabelsChange: true, }, { ds: &DaemonSet{ ObjectMeta: v1.ObjectMeta{ Labels: map[string]string{ "bar": "foo", }, }, Spec: DaemonSetSpec{ Template: &v1.PodTemplateSpec{ ObjectMeta: v1.ObjectMeta{ Labels: map[string]string{ "foo": "bar", }, }, }, }, }, expectLabelsChange: false, }, } for _, test := range tests { ds := test.ds obj2 := roundTrip(t, runtime.Object(ds)) ds2, ok := obj2.(*DaemonSet) if !ok { t.Errorf("unexpected object: %v", ds2) t.FailNow() } if test.expectLabelsChange != reflect.DeepEqual(ds2.Labels, ds2.Spec.Template.Labels) { if test.expectLabelsChange { t.Errorf("expected: %v, got: %v", ds2.Spec.Template.Labels, ds2.Labels) } else { t.Errorf("unexpected equality: %v", ds.Labels) } } } }
func TestSetDefaultPersistentVolumeClaim(t *testing.T) { pvc := &versioned.PersistentVolumeClaim{} obj2 := roundTrip(t, runtime.Object(pvc)) pvc2 := obj2.(*versioned.PersistentVolumeClaim) if pvc2.Status.Phase != versioned.ClaimPending { t.Errorf("Expected claim phase %v, got %v", versioned.ClaimPending, pvc2.Status.Phase) } }
func TestSetDefaultSecret(t *testing.T) { s := &versioned.Secret{} obj2 := roundTrip(t, runtime.Object(s)) s2 := obj2.(*versioned.Secret) if s2.Type != versioned.SecretTypeOpaque { t.Errorf("Expected secret type %v, got %v", versioned.SecretTypeOpaque, s2.Type) } }
func TestSetDefaultServicePort(t *testing.T) { // Unchanged if set. in := &versioned.Service{Spec: versioned.ServiceSpec{ Ports: []versioned.ServicePort{ {Protocol: "UDP", Port: 9376, TargetPort: util.NewIntOrStringFromString("p")}, {Protocol: "UDP", Port: 8675, TargetPort: util.NewIntOrStringFromInt(309)}, }, }} out := roundTrip(t, runtime.Object(in)).(*versioned.Service) if out.Spec.Ports[0].Protocol != versioned.ProtocolUDP { t.Errorf("Expected protocol %s, got %s", versioned.ProtocolUDP, out.Spec.Ports[0].Protocol) } if out.Spec.Ports[0].TargetPort != util.NewIntOrStringFromString("p") { t.Errorf("Expected port %v, got %v", in.Spec.Ports[0].Port, out.Spec.Ports[0].TargetPort) } if out.Spec.Ports[1].Protocol != versioned.ProtocolUDP { t.Errorf("Expected protocol %s, got %s", versioned.ProtocolUDP, out.Spec.Ports[1].Protocol) } if out.Spec.Ports[1].TargetPort != util.NewIntOrStringFromInt(309) { t.Errorf("Expected port %v, got %v", in.Spec.Ports[1].Port, out.Spec.Ports[1].TargetPort) } // Defaulted. in = &versioned.Service{Spec: versioned.ServiceSpec{ Ports: []versioned.ServicePort{ {Protocol: "", Port: 9376, TargetPort: util.NewIntOrStringFromString("")}, {Protocol: "", Port: 8675, TargetPort: util.NewIntOrStringFromInt(0)}, }, }} out = roundTrip(t, runtime.Object(in)).(*versioned.Service) if out.Spec.Ports[0].Protocol != versioned.ProtocolTCP { t.Errorf("Expected protocol %s, got %s", versioned.ProtocolTCP, out.Spec.Ports[0].Protocol) } if out.Spec.Ports[0].TargetPort != util.NewIntOrStringFromInt(in.Spec.Ports[0].Port) { t.Errorf("Expected port %v, got %v", in.Spec.Ports[0].Port, out.Spec.Ports[0].TargetPort) } if out.Spec.Ports[1].Protocol != versioned.ProtocolTCP { t.Errorf("Expected protocol %s, got %s", versioned.ProtocolTCP, out.Spec.Ports[1].Protocol) } if out.Spec.Ports[1].TargetPort != util.NewIntOrStringFromInt(in.Spec.Ports[1].Port) { t.Errorf("Expected port %v, got %v", in.Spec.Ports[1].Port, out.Spec.Ports[1].TargetPort) } }
func TestSetDefaultService(t *testing.T) { svc := &versioned.Service{} obj2 := roundTrip(t, runtime.Object(svc)) svc2 := obj2.(*versioned.Service) if svc2.Spec.SessionAffinity != versioned.ServiceAffinityNone { t.Errorf("Expected default session affinity type:%s, got: %s", versioned.ServiceAffinityNone, svc2.Spec.SessionAffinity) } if svc2.Spec.Type != versioned.ServiceTypeClusterIP { t.Errorf("Expected default type:%s, got: %s", versioned.ServiceTypeClusterIP, svc2.Spec.Type) } }
func TestSetDefaultPersistentVolume(t *testing.T) { pv := &versioned.PersistentVolume{} obj2 := roundTrip(t, runtime.Object(pv)) pv2 := obj2.(*versioned.PersistentVolume) if pv2.Status.Phase != versioned.VolumePending { t.Errorf("Expected volume phase %v, got %v", versioned.VolumePending, pv2.Status.Phase) } if pv2.Spec.PersistentVolumeReclaimPolicy != versioned.PersistentVolumeReclaimRetain { t.Errorf("Expected pv reclaim policy %v, got %v", versioned.PersistentVolumeReclaimRetain, pv2.Spec.PersistentVolumeReclaimPolicy) } }
func TestSetDefaultNodeExternalID(t *testing.T) { name := "node0" n := &versioned.Node{} n.Name = name obj2 := roundTrip(t, runtime.Object(n)) n2 := obj2.(*versioned.Node) if n2.Spec.ExternalID != name { t.Errorf("Expected default External ID: %s, got: %s", name, n2.Spec.ExternalID) } if n2.Spec.ProviderID != "" { t.Errorf("Expected empty default Cloud Provider ID, got: %s", n2.Spec.ProviderID) } }
func TestSetDefaultRequestsPod(t *testing.T) { // verify we default if limits are specified s := versioned.PodSpec{} s.Containers = []versioned.Container{ { Resources: versioned.ResourceRequirements{ Limits: versioned.ResourceList{ versioned.ResourceCPU: resource.MustParse("100m"), }, }, }, } pod := &versioned.Pod{ Spec: s, } output := roundTrip(t, runtime.Object(pod)) pod2 := output.(*versioned.Pod) defaultRequest := pod2.Spec.Containers[0].Resources.Requests requestValue := defaultRequest[versioned.ResourceCPU] if requestValue.String() != "100m" { t.Errorf("Expected request cpu: %s, got: %s", "100m", requestValue.String()) } // verify we do nothing if no limits are specified s = versioned.PodSpec{} s.Containers = []versioned.Container{{}} pod = &versioned.Pod{ Spec: s, } output = roundTrip(t, runtime.Object(pod)) pod2 = output.(*versioned.Pod) defaultRequest = pod2.Spec.Containers[0].Resources.Requests requestValue = defaultRequest[versioned.ResourceCPU] if requestValue.String() != "0" { t.Errorf("Expected 0 request value, got: %s", requestValue.String()) } }
func TestSetDefaultLimitRangeItem(t *testing.T) { limitRange := &versioned.LimitRange{ ObjectMeta: versioned.ObjectMeta{ Name: "test-defaults", }, Spec: versioned.LimitRangeSpec{ Limits: []versioned.LimitRangeItem{{ Type: versioned.LimitTypeContainer, Max: versioned.ResourceList{ versioned.ResourceCPU: resource.MustParse("100m"), }, Min: versioned.ResourceList{ versioned.ResourceMemory: resource.MustParse("100Mi"), }, Default: versioned.ResourceList{}, DefaultRequest: versioned.ResourceList{}, }}, }, } output := roundTrip(t, runtime.Object(limitRange)) limitRange2 := output.(*versioned.LimitRange) defaultLimit := limitRange2.Spec.Limits[0].Default defaultRequest := limitRange2.Spec.Limits[0].DefaultRequest // verify that default cpu was set to the max defaultValue := defaultLimit[versioned.ResourceCPU] if defaultValue.String() != "100m" { t.Errorf("Expected default cpu: %s, got: %s", "100m", defaultValue.String()) } // verify that default request was set to the limit requestValue := defaultRequest[versioned.ResourceCPU] if requestValue.String() != "100m" { t.Errorf("Expected request cpu: %s, got: %s", "100m", requestValue.String()) } // verify that if a min is provided, it will be the default if no limit is specified requestMinValue := defaultRequest[versioned.ResourceMemory] if requestMinValue.String() != "100Mi" { t.Errorf("Expected request memory: %s, got: %s", "100Mi", requestMinValue.String()) } }
func TestEncode(t *testing.T) { scheme := runtime.NewScheme() scheme.AddKnownTypeWithName("", "Simple", &InternalSimple{}) scheme.AddKnownTypeWithName("externalVersion", "Simple", &ExternalSimple{}) codec := runtime.CodecFor(scheme, "externalVersion") test := &InternalSimple{ TestString: "I'm the same", } obj := runtime.Object(test) data, err := codec.Encode(obj) obj2, err2 := codec.Decode(data) if err != nil || err2 != nil { t.Fatalf("Failure: '%v' '%v'", err, err2) } if _, ok := obj2.(*InternalSimple); !ok { t.Fatalf("Got wrong type") } if !reflect.DeepEqual(obj2, test) { t.Errorf("Expected:\n %#v,\n Got:\n %#v", &test, obj2) } }
func TestSetDefaulEndpointsProtocol(t *testing.T) { in := &versioned.Endpoints{Subsets: []versioned.EndpointSubset{ {Ports: []versioned.EndpointPort{{}, {Protocol: "UDP"}, {}}}, }} obj := roundTrip(t, runtime.Object(in)) out := obj.(*versioned.Endpoints) for i := range out.Subsets { for j := range out.Subsets[i].Ports { if in.Subsets[i].Ports[j].Protocol == "" { if out.Subsets[i].Ports[j].Protocol != versioned.ProtocolTCP { t.Errorf("Expected protocol %s, got %s", versioned.ProtocolTCP, out.Subsets[i].Ports[j].Protocol) } } else { if out.Subsets[i].Ports[j].Protocol != in.Subsets[i].Ports[j].Protocol { t.Errorf("Expected protocol %s, got %s", in.Subsets[i].Ports[j].Protocol, out.Subsets[i].Ports[j].Protocol) } } } } }
func TestSetDefaultJob(t *testing.T) { expected := &Job{ Spec: JobSpec{ Selector: &PodSelector{ MatchLabels: map[string]string{"job": "selector"}, }, Completions: newInt(1), Parallelism: newInt(1), }, } tests := []*Job{ // selector set explicitly, completions and parallelism - default { Spec: JobSpec{ Selector: &PodSelector{ MatchLabels: map[string]string{"job": "selector"}, }, }, }, // selector from template labels, completions and parallelism - default { Spec: JobSpec{ Template: v1.PodTemplateSpec{ ObjectMeta: v1.ObjectMeta{ Labels: map[string]string{"job": "selector"}, }, }, }, }, // selector from template labels, completions set explicitly, parallelism - default { Spec: JobSpec{ Completions: newInt(1), Template: v1.PodTemplateSpec{ ObjectMeta: v1.ObjectMeta{ Labels: map[string]string{"job": "selector"}, }, }, }, }, // selector from template labels, completions - default, parallelism set explicitly { Spec: JobSpec{ Parallelism: newInt(1), Template: v1.PodTemplateSpec{ ObjectMeta: v1.ObjectMeta{ Labels: map[string]string{"job": "selector"}, }, }, }, }, } for _, original := range tests { obj2 := roundTrip(t, runtime.Object(original)) got, ok := obj2.(*Job) if !ok { t.Errorf("unexpected object: %v", got) t.FailNow() } if *got.Spec.Completions != *expected.Spec.Completions { t.Errorf("got different completions than expected: %d %d", *got.Spec.Completions, *expected.Spec.Completions) } if *got.Spec.Parallelism != *expected.Spec.Parallelism { t.Errorf("got different parallelism than expected: %d %d", *got.Spec.Parallelism, *expected.Spec.Parallelism) } if !reflect.DeepEqual(got.Spec.Selector, expected.Spec.Selector) { t.Errorf("got different selectors %#v %#v", got.Spec.Selector, expected.Spec.Selector) } } }
func TestSetDefaultDeployment(t *testing.T) { defaultIntOrString := util.NewIntOrStringFromInt(1) differentIntOrString := util.NewIntOrStringFromInt(5) deploymentLabelKey := "deployment.kubernetes.io/podTemplateHash" tests := []struct { original *Deployment expected *Deployment }{ { original: &Deployment{}, expected: &Deployment{ Spec: DeploymentSpec{ Replicas: newInt(1), Strategy: DeploymentStrategy{ Type: RollingUpdateDeploymentStrategyType, RollingUpdate: &RollingUpdateDeployment{ MaxSurge: &defaultIntOrString, MaxUnavailable: &defaultIntOrString, }, }, UniqueLabelKey: newString(deploymentLabelKey), }, }, }, { original: &Deployment{ Spec: DeploymentSpec{ Replicas: newInt(5), Strategy: DeploymentStrategy{ RollingUpdate: &RollingUpdateDeployment{ MaxSurge: &differentIntOrString, }, }, }, }, expected: &Deployment{ Spec: DeploymentSpec{ Replicas: newInt(5), Strategy: DeploymentStrategy{ Type: RollingUpdateDeploymentStrategyType, RollingUpdate: &RollingUpdateDeployment{ MaxSurge: &differentIntOrString, MaxUnavailable: &defaultIntOrString, }, }, UniqueLabelKey: newString(deploymentLabelKey), }, }, }, { original: &Deployment{ Spec: DeploymentSpec{ Replicas: newInt(5), Strategy: DeploymentStrategy{ Type: RecreateDeploymentStrategyType, }, }, }, expected: &Deployment{ Spec: DeploymentSpec{ Replicas: newInt(5), Strategy: DeploymentStrategy{ Type: RecreateDeploymentStrategyType, }, UniqueLabelKey: newString(deploymentLabelKey), }, }, }, { original: &Deployment{ Spec: DeploymentSpec{ Replicas: newInt(5), Strategy: DeploymentStrategy{ Type: RecreateDeploymentStrategyType, }, UniqueLabelKey: newString("customDeploymentKey"), }, }, expected: &Deployment{ Spec: DeploymentSpec{ Replicas: newInt(5), Strategy: DeploymentStrategy{ Type: RecreateDeploymentStrategyType, }, UniqueLabelKey: newString("customDeploymentKey"), }, }, }, } for _, test := range tests { original := test.original expected := test.expected obj2 := roundTrip(t, runtime.Object(original)) got, ok := obj2.(*Deployment) if !ok { t.Errorf("unexpected object: %v", got) t.FailNow() } if !reflect.DeepEqual(got.Spec, expected.Spec) { t.Errorf("got different than expected: %v, %v", got, expected) } } }
func TestSetDefaultReplicationController(t *testing.T) { tests := []struct { rc *versioned.ReplicationController expectLabels bool expectSelector bool }{ { rc: &versioned.ReplicationController{ Spec: versioned.ReplicationControllerSpec{ Template: &versioned.PodTemplateSpec{ ObjectMeta: versioned.ObjectMeta{ Labels: map[string]string{ "foo": "bar", }, }, }, }, }, expectLabels: true, expectSelector: true, }, { rc: &versioned.ReplicationController{ ObjectMeta: versioned.ObjectMeta{ Labels: map[string]string{ "bar": "foo", }, }, Spec: versioned.ReplicationControllerSpec{ Template: &versioned.PodTemplateSpec{ ObjectMeta: versioned.ObjectMeta{ Labels: map[string]string{ "foo": "bar", }, }, }, }, }, expectLabels: false, expectSelector: true, }, { rc: &versioned.ReplicationController{ ObjectMeta: versioned.ObjectMeta{ Labels: map[string]string{ "bar": "foo", }, }, Spec: versioned.ReplicationControllerSpec{ Selector: map[string]string{ "some": "other", }, Template: &versioned.PodTemplateSpec{ ObjectMeta: versioned.ObjectMeta{ Labels: map[string]string{ "foo": "bar", }, }, }, }, }, expectLabels: false, expectSelector: false, }, { rc: &versioned.ReplicationController{ Spec: versioned.ReplicationControllerSpec{ Selector: map[string]string{ "some": "other", }, Template: &versioned.PodTemplateSpec{ ObjectMeta: versioned.ObjectMeta{ Labels: map[string]string{ "foo": "bar", }, }, }, }, }, expectLabels: true, expectSelector: false, }, } for _, test := range tests { rc := test.rc obj2 := roundTrip(t, runtime.Object(rc)) rc2, ok := obj2.(*versioned.ReplicationController) if !ok { t.Errorf("unexpected object: %v", rc2) t.FailNow() } if test.expectSelector != reflect.DeepEqual(rc2.Spec.Selector, rc2.Spec.Template.Labels) { if test.expectSelector { t.Errorf("expected: %v, got: %v", rc2.Spec.Template.Labels, rc2.Spec.Selector) } else { t.Errorf("unexpected equality: %v", rc.Spec.Selector) } } if test.expectLabels != reflect.DeepEqual(rc2.Labels, rc2.Spec.Template.Labels) { if test.expectLabels { t.Errorf("expected: %v, got: %v", rc2.Spec.Template.Labels, rc2.Labels) } else { t.Errorf("unexpected equality: %v", rc.Labels) } } } }
func TestScheme(t *testing.T) { scheme := runtime.NewScheme() scheme.AddKnownTypeWithName("", "Simple", &InternalSimple{}) scheme.AddKnownTypeWithName("externalVersion", "Simple", &ExternalSimple{}) // test that scheme is an ObjectTyper var _ runtime.ObjectTyper = scheme internalToExternalCalls := 0 externalToInternalCalls := 0 // Register functions to verify that scope.Meta() gets set correctly. err := scheme.AddConversionFuncs( func(in *InternalSimple, out *ExternalSimple, scope conversion.Scope) error { if e, a := "", scope.Meta().SrcVersion; e != a { t.Errorf("Expected '%v', got '%v'", e, a) } if e, a := "externalVersion", scope.Meta().DestVersion; e != a { t.Errorf("Expected '%v', got '%v'", e, a) } scope.Convert(&in.TypeMeta, &out.TypeMeta, 0) scope.Convert(&in.TestString, &out.TestString, 0) internalToExternalCalls++ return nil }, func(in *ExternalSimple, out *InternalSimple, scope conversion.Scope) error { if e, a := "externalVersion", scope.Meta().SrcVersion; e != a { t.Errorf("Expected '%v', got '%v'", e, a) } if e, a := "", scope.Meta().DestVersion; e != a { t.Errorf("Expected '%v', got '%v'", e, a) } scope.Convert(&in.TypeMeta, &out.TypeMeta, 0) scope.Convert(&in.TestString, &out.TestString, 0) externalToInternalCalls++ return nil }, ) if err != nil { t.Errorf("unexpected error: %v", err) } simple := &InternalSimple{ TestString: "foo", } // Test Encode, Decode, DecodeInto, and DecodeToVersion obj := runtime.Object(simple) data, err := scheme.EncodeToVersion(obj, "externalVersion") obj2, err2 := scheme.Decode(data) obj3 := &InternalSimple{} err3 := scheme.DecodeInto(data, obj3) obj4, err4 := scheme.DecodeToVersion(data, "externalVersion") if err != nil || err2 != nil || err3 != nil || err4 != nil { t.Fatalf("Failure: '%v' '%v' '%v' '%v'", err, err2, err3, err4) } if _, ok := obj2.(*InternalSimple); !ok { t.Fatalf("Got wrong type") } if e, a := simple, obj2; !reflect.DeepEqual(e, a) { t.Errorf("Expected:\n %#v,\n Got:\n %#v", e, a) } if e, a := simple, obj3; !reflect.DeepEqual(e, a) { t.Errorf("Expected:\n %#v,\n Got:\n %#v", e, a) } if _, ok := obj4.(*ExternalSimple); !ok { t.Fatalf("Got wrong type") } // Test Convert external := &ExternalSimple{} err = scheme.Convert(simple, external) if err != nil { t.Errorf("Unexpected error: %v", err) } if e, a := simple.TestString, external.TestString; e != a { t.Errorf("Expected %v, got %v", e, a) } // Encode and Convert should each have caused an increment. if e, a := 2, internalToExternalCalls; e != a { t.Errorf("Expected %v, got %v", e, a) } // Decode and DecodeInto should each have caused an increment. if e, a := 2, externalToInternalCalls; e != a { t.Errorf("Expected %v, got %v", e, a) } }
// TODO: This should be done on types that are not part of our API func TestBeforeUpdate(t *testing.T) { testCases := []struct { name string tweakSvc func(oldSvc, newSvc *api.Service) // given basic valid services, each test case can customize them expectErr bool }{ { name: "no change", tweakSvc: func(oldSvc, newSvc *api.Service) { // nothing }, expectErr: false, }, { name: "change port", tweakSvc: func(oldSvc, newSvc *api.Service) { newSvc.Spec.Ports[0].Port++ }, expectErr: false, }, { name: "bad namespace", tweakSvc: func(oldSvc, newSvc *api.Service) { newSvc.Namespace = "#$%%invalid" }, expectErr: true, }, { name: "change name", tweakSvc: func(oldSvc, newSvc *api.Service) { newSvc.Name += "2" }, expectErr: true, }, { name: "change ClusterIP", tweakSvc: func(oldSvc, newSvc *api.Service) { oldSvc.Spec.ClusterIP = "1.2.3.4" newSvc.Spec.ClusterIP = "4.3.2.1" }, expectErr: true, }, { name: "change selectpor", tweakSvc: func(oldSvc, newSvc *api.Service) { newSvc.Spec.Selector = map[string]string{"newkey": "newvalue"} }, expectErr: false, }, } for _, tc := range testCases { oldSvc := makeValidService() newSvc := makeValidService() tc.tweakSvc(&oldSvc, &newSvc) ctx := api.NewDefaultContext() err := BeforeUpdate(Services, ctx, runtime.Object(&oldSvc), runtime.Object(&newSvc)) if tc.expectErr && err == nil { t.Errorf("unexpected non-error for %q", tc.name) } if !tc.expectErr && err != nil { t.Errorf("unexpected error for %q: %v", tc.name, err) } } }
func TestSetDefaultReplicationControllerReplicas(t *testing.T) { tests := []struct { rc versioned.ReplicationController expectReplicas int }{ { rc: versioned.ReplicationController{ Spec: versioned.ReplicationControllerSpec{ Template: &versioned.PodTemplateSpec{ ObjectMeta: versioned.ObjectMeta{ Labels: map[string]string{ "foo": "bar", }, }, }, }, }, expectReplicas: 1, }, { rc: versioned.ReplicationController{ Spec: versioned.ReplicationControllerSpec{ Replicas: newInt(0), Template: &versioned.PodTemplateSpec{ ObjectMeta: versioned.ObjectMeta{ Labels: map[string]string{ "foo": "bar", }, }, }, }, }, expectReplicas: 0, }, { rc: versioned.ReplicationController{ Spec: versioned.ReplicationControllerSpec{ Replicas: newInt(3), Template: &versioned.PodTemplateSpec{ ObjectMeta: versioned.ObjectMeta{ Labels: map[string]string{ "foo": "bar", }, }, }, }, }, expectReplicas: 3, }, } for _, test := range tests { rc := &test.rc obj2 := roundTrip(t, runtime.Object(rc)) rc2, ok := obj2.(*versioned.ReplicationController) if !ok { t.Errorf("unexpected object: %v", rc2) t.FailNow() } if rc2.Spec.Replicas == nil { t.Errorf("unexpected nil Replicas") } else if test.expectReplicas != *rc2.Spec.Replicas { t.Errorf("expected: %d replicas, got: %d", test.expectReplicas, *rc2.Spec.Replicas) } } }