2015-09-01 05:28:08 +00:00
/ *
Copyright 2015 The Kubernetes Authors 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 thirdpartyresourcedata
import (
"encoding/json"
"reflect"
"testing"
2015-09-03 00:13:38 +00:00
"time"
2015-09-01 05:28:08 +00:00
"k8s.io/kubernetes/pkg/api"
2015-12-21 05:36:03 +00:00
"k8s.io/kubernetes/pkg/api/testapi"
2015-09-09 21:59:11 +00:00
"k8s.io/kubernetes/pkg/api/unversioned"
2015-09-18 05:54:15 +00:00
"k8s.io/kubernetes/pkg/api/v1"
2015-10-09 22:04:41 +00:00
"k8s.io/kubernetes/pkg/apis/extensions"
2015-09-18 05:54:15 +00:00
"k8s.io/kubernetes/pkg/runtime"
2015-09-01 05:28:08 +00:00
)
type Foo struct {
2015-09-09 21:59:11 +00:00
unversioned . TypeMeta ` json:",inline" `
api . ObjectMeta ` json:"metadata,omitempty" description:"standard object metadata" `
2015-09-01 05:28:08 +00:00
SomeField string ` json:"someField" `
OtherField int ` json:"otherField" `
}
type FooList struct {
2015-09-09 21:59:11 +00:00
unversioned . TypeMeta ` json:",inline" `
unversioned . ListMeta ` json:"metadata,omitempty" description:"standard list metadata; see http://releases.k8s.io/HEAD/docs/devel/api-conventions.md#metadata" `
2015-09-01 05:28:08 +00:00
items [ ] Foo ` json:"items" `
}
func TestCodec ( t * testing . T ) {
tests := [ ] struct {
obj * Foo
expectErr bool
name string
} {
{
obj : & Foo { ObjectMeta : api . ObjectMeta { Name : "bar" } } ,
expectErr : true ,
name : "missing kind" ,
} ,
{
2015-09-09 21:59:11 +00:00
obj : & Foo { ObjectMeta : api . ObjectMeta { Name : "bar" } , TypeMeta : unversioned . TypeMeta { Kind : "Foo" } } ,
2015-09-01 05:28:08 +00:00
name : "basic" ,
} ,
{
2015-09-09 21:59:11 +00:00
obj : & Foo { ObjectMeta : api . ObjectMeta { Name : "bar" , ResourceVersion : "baz" } , TypeMeta : unversioned . TypeMeta { Kind : "Foo" } } ,
2015-09-01 05:28:08 +00:00
name : "resource version" ,
} ,
2015-09-03 00:13:38 +00:00
{
obj : & Foo {
ObjectMeta : api . ObjectMeta {
Name : "bar" ,
2015-09-17 22:21:55 +00:00
CreationTimestamp : unversioned . Time { time . Unix ( 100 , 0 ) } ,
2015-09-03 00:13:38 +00:00
} ,
2015-09-09 21:59:11 +00:00
TypeMeta : unversioned . TypeMeta { Kind : "Foo" } ,
2015-09-03 00:13:38 +00:00
} ,
name : "creation time" ,
} ,
2015-09-01 05:28:08 +00:00
{
obj : & Foo {
ObjectMeta : api . ObjectMeta {
Name : "bar" ,
ResourceVersion : "baz" ,
Labels : map [ string ] string { "foo" : "bar" , "baz" : "blah" } ,
} ,
2015-09-09 21:59:11 +00:00
TypeMeta : unversioned . TypeMeta { Kind : "Foo" } ,
2015-09-01 05:28:08 +00:00
} ,
name : "labels" ,
} ,
}
for _ , test := range tests {
2015-12-21 05:36:03 +00:00
codec := & thirdPartyResourceDataCodec { kind : "Foo" , delegate : testapi . Extensions . Codec ( ) }
2015-09-01 05:28:08 +00:00
data , err := json . Marshal ( test . obj )
if err != nil {
t . Errorf ( "[%s] unexpected error: %v" , test . name , err )
continue
}
2015-12-21 05:36:03 +00:00
obj , err := runtime . Decode ( codec , data )
2015-09-01 05:28:08 +00:00
if err != nil && ! test . expectErr {
t . Errorf ( "[%s] unexpected error: %v" , test . name , err )
continue
}
if test . expectErr {
if err == nil {
t . Errorf ( "[%s] unexpected non-error" , test . name )
}
continue
}
2015-10-09 22:49:10 +00:00
rsrcObj , ok := obj . ( * extensions . ThirdPartyResourceData )
2015-09-01 05:28:08 +00:00
if ! ok {
t . Errorf ( "[%s] unexpected object: %v" , test . name , obj )
continue
}
if ! reflect . DeepEqual ( rsrcObj . ObjectMeta , test . obj . ObjectMeta ) {
t . Errorf ( "[%s]\nexpected\n%v\nsaw\n%v\n" , test . name , rsrcObj . ObjectMeta , test . obj . ObjectMeta )
}
var output Foo
if err := json . Unmarshal ( rsrcObj . Data , & output ) ; err != nil {
t . Errorf ( "[%s] unexpected error: %v" , test . name , err )
continue
}
if ! reflect . DeepEqual ( & output , test . obj ) {
t . Errorf ( "[%s]\nexpected\n%v\nsaw\n%v\n" , test . name , test . obj , & output )
}
2015-12-21 05:36:03 +00:00
data , err = runtime . Encode ( codec , rsrcObj )
2015-09-01 05:28:08 +00:00
if err != nil {
t . Errorf ( "[%s] unexpected error: %v" , test . name , err )
}
var output2 Foo
if err := json . Unmarshal ( data , & output2 ) ; err != nil {
t . Errorf ( "[%s] unexpected error: %v" , test . name , err )
continue
}
if ! reflect . DeepEqual ( & output2 , test . obj ) {
t . Errorf ( "[%s]\nexpected\n%v\nsaw\n%v\n" , test . name , test . obj , & output2 )
}
}
}
2015-09-18 05:54:15 +00:00
func TestCreater ( t * testing . T ) {
2015-09-29 21:36:47 +00:00
creater := NewObjectCreator ( "creater group" , "creater version" , api . Scheme )
2015-09-18 05:54:15 +00:00
tests := [ ] struct {
name string
2015-12-08 19:40:23 +00:00
kind unversioned . GroupVersionKind
2015-09-18 05:54:15 +00:00
expectedObj runtime . Object
expectErr bool
} {
{
name : "valid ThirdPartyResourceData creation" ,
2015-12-08 19:40:23 +00:00
kind : unversioned . GroupVersionKind { Group : "creater group" , Version : "creater version" , Kind : "ThirdPartyResourceData" } ,
2015-10-09 22:49:10 +00:00
expectedObj : & extensions . ThirdPartyResourceData { } ,
2015-09-18 05:54:15 +00:00
expectErr : false ,
} ,
{
name : "invalid ThirdPartyResourceData creation" ,
2015-12-08 19:40:23 +00:00
kind : unversioned . GroupVersionKind { Version : "invalid version" , Kind : "ThirdPartyResourceData" } ,
2015-09-18 05:54:15 +00:00
expectedObj : nil ,
expectErr : true ,
} ,
{
name : "valid ListOptions creation" ,
2015-12-08 19:40:23 +00:00
kind : unversioned . GroupVersionKind { Version : "v1" , Kind : "ListOptions" } ,
2015-09-18 05:54:15 +00:00
expectedObj : & v1 . ListOptions { } ,
expectErr : false ,
} ,
}
for _ , test := range tests {
2015-12-08 19:40:23 +00:00
out , err := creater . New ( test . kind )
2015-09-18 05:54:15 +00:00
if err != nil && ! test . expectErr {
t . Errorf ( "[%s] unexpected error: %v" , test . name , err )
}
if err == nil && test . expectErr {
t . Errorf ( "[%s] unexpected non-error" , test . name )
}
if ! reflect . DeepEqual ( test . expectedObj , out ) {
t . Errorf ( "[%s] unexpected error: expect: %v, got: %v" , test . expectedObj , out )
}
}
}
2015-12-03 04:39:55 +00:00
func TestResourceIsValid ( t * testing . T ) {
tests := [ ] struct {
kind string
resource string
valid bool
name string
} {
{
kind : "Foo" ,
resource : "foos" ,
valid : true ,
name : "basic" ,
} ,
{
kind : "Party" ,
resource : "parties" ,
valid : true ,
name : "fun" ,
} ,
{
kind : "bus" ,
resource : "buses" ,
valid : true ,
name : "transport" ,
} ,
{
kind : "Foo" ,
resource : "fooies" ,
name : "bad" ,
} ,
}
for _ , test := range tests {
mapper := & thirdPartyResourceDataMapper { kind : test . kind }
mapper . mapper = api . RESTMapper
2015-12-07 13:12:24 +00:00
valid := mapper . ResourceIsValid ( unversioned . GroupVersionResource { Resource : test . resource } )
2015-12-03 04:39:55 +00:00
if valid != test . valid {
2015-12-07 13:12:24 +00:00
t . Errorf ( "%s: expected: %v, actual: %v" , test . name , test . valid , valid )
2015-12-03 04:39:55 +00:00
}
}
}