package cmd
import (
"bytes"
"fmt"
"reflect"
"testing"
kapi "k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/api/meta"
"k8s.io/kubernetes/pkg/api/unversioned"
"k8s.io/kubernetes/pkg/kubectl/resource"
"k8s.io/kubernetes/pkg/runtime"
)
type bulkTester struct {
meta.RESTMapper
mapping *meta.RESTMapping
err error
opErr error
infos []runtime.Object
recorded []runtime.Object
}
func (bt *bulkTester) ResourceSingularizer(resource string) (string, error) {
return resource, nil
}
func (bt *bulkTester) InfoForObject(obj runtime.Object, preferredGVKs []unversioned.GroupVersionKind) (*resource.Info, error) {
bt.infos = append(bt.infos, obj)
return &resource.Info{Object: obj, Mapping: bt.mapping}, bt.err
}
func (bt *bulkTester) Record(info *resource.Info, namespace string, obj runtime.Object) (runtime.Object, error) {
bt.recorded = append(bt.recorded, obj)
return obj, bt.opErr
}
func TestBulk(t *testing.T) {
bt := &bulkTester{
mapping: &meta.RESTMapping{
MetadataAccessor: meta.NewAccessor(),
},
}
b := Bulk{Mapper: bt, Op: bt.Record}
in := &kapi.Pod{}
if errs := b.Run(&kapi.List{Items: []runtime.Object{in}}, "test_namespace"); len(errs) > 0 {
t.Fatal(errs)
}
if !reflect.DeepEqual(bt.infos, []runtime.Object{in}) {
t.Fatalf("unexpected: %#v", bt.infos)
}
if !reflect.DeepEqual(bt.recorded, []runtime.Object{in}) {
t.Fatalf("unexpected: %#v", bt.recorded)
}
}
func TestBulkInfoError(t *testing.T) {
bt := &bulkTester{
mapping: &meta.RESTMapping{
MetadataAccessor: meta.NewAccessor(),
},
err: fmt.Errorf("error1"),
}
b := Bulk{Mapper: bt, Op: bt.Record}
in := &kapi.Pod{}
if errs := b.Run(&kapi.List{Items: []runtime.Object{in}}, "test_namespace"); len(errs) != 1 || errs[0] != bt.err {
t.Fatal(errs)
}
if !reflect.DeepEqual(bt.infos, []runtime.Object{in}) {
t.Fatalf("unexpected: %#v", bt.infos)
}
if !reflect.DeepEqual(bt.recorded, []runtime.Object(nil)) {
t.Fatalf("unexpected: %#v", bt.recorded)
}
}
func TestBulkOpError(t *testing.T) {
bt := &bulkTester{
mapping: &meta.RESTMapping{
MetadataAccessor: meta.NewAccessor(),
},
opErr: fmt.Errorf("error1"),
}
b := Bulk{Mapper: bt, Op: bt.Record}
in := &kapi.Pod{}
if errs := b.Run(&kapi.List{Items: []runtime.Object{in}}, "test_namespace"); len(errs) != 1 || errs[0] != bt.opErr {
t.Fatal(errs)
}
if !reflect.DeepEqual(bt.infos, []runtime.Object{in}) {
t.Fatalf("unexpected: %#v", bt.infos)
}
if !reflect.DeepEqual(bt.recorded, []runtime.Object{in}) {
t.Fatalf("unexpected: %#v", bt.recorded)
}
}
func TestBulkAction(t *testing.T) {
bt := &bulkTester{
mapping: &meta.RESTMapping{
MetadataAccessor: meta.NewAccessor(),
},
}
out, err := &bytes.Buffer{}, &bytes.Buffer{}
bulk := Bulk{Mapper: bt, Op: bt.Record}
b := &BulkAction{Bulk: bulk, Output: "", Out: out, ErrOut: err}
b2 := b.WithMessage("test1", "test2")
in := &kapi.Pod{ObjectMeta: kapi.ObjectMeta{Name: "obj1"}}
if errs := b2.Run(&kapi.List{Items: []runtime.Object{in}}, "test_namespace"); len(errs) != 0 {
t.Fatal(errs)
}
if !reflect.DeepEqual(bt.infos, []runtime.Object{in}) {
t.Fatalf("unexpected: %#v", bt.infos)
}
if !reflect.DeepEqual(bt.recorded, []runtime.Object{in}) {
t.Fatalf("unexpected: %#v", bt.recorded)
}
if out.String() != `--> test1 ...
"obj1" test2
--> Success
` {
t.Fatalf("unexpected: %s", out.String())
}
if err.String() != `` {
t.Fatalf("unexpected: %s", err.String())
}
}
func TestBulkActionCompact(t *testing.T) {
bt := &bulkTester{
mapping: &meta.RESTMapping{
MetadataAccessor: meta.NewAccessor(),
},
}
out, err := &bytes.Buffer{}, &bytes.Buffer{}
bulk := Bulk{Mapper: bt, Op: bt.Record}
b := &BulkAction{Bulk: bulk, Output: "", Out: out, ErrOut: err}
b.Compact()
b2 := b.WithMessage("test1", "test2")
in := &kapi.Pod{ObjectMeta: kapi.ObjectMeta{Name: "obj1"}}
if errs := b2.Run(&kapi.List{Items: []runtime.Object{in}}, "test_namespace"); len(errs) != 0 {
t.Fatal(errs)
}
if !reflect.DeepEqual(bt.infos, []runtime.Object{in}) {
t.Fatalf("unexpected: %#v", bt.infos)
}
if !reflect.DeepEqual(bt.recorded, []runtime.Object{in}) {
t.Fatalf("unexpected: %#v", bt.recorded)
}
if out.String() != `` {
t.Fatalf("unexpected: %s", out.String())
}
if err.String() != `` {
t.Fatalf("unexpected: %s", err.String())
}
}