Skip to content

Commit

Permalink
rules: initial unit test for rule-metric integration
Browse files Browse the repository at this point in the history
  • Loading branch information
James DeFelice committed Jun 14, 2017
1 parent 5e5bc8d commit 90fe8a5
Show file tree
Hide file tree
Showing 13 changed files with 297 additions and 11 deletions.
2 changes: 1 addition & 1 deletion api/v1/lib/extras/executor/callrules/gen.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,4 @@ package callrules

//go:generate go run ../../gen/rule_callers.go ../../gen/gen.go -import github.com/mesos/mesos-go/api/v1/lib/executor -import github.com/mesos/mesos-go/api/v1/lib/executor/calls -type E:*executor.Call -type C:calls.Caller -type CF:calls.CallerFunc -output callers_generated.go

//go:generate go run ../../gen/rule_metrics.go ../../gen/gen.go -import github.com/mesos/mesos-go/api/v1/lib -import github.com/mesos/mesos-go/api/v1/lib/executor -type E:*executor.Call -type Z:mesos.Response -output metrics_generated.go
//go:generate go run ../../gen/rule_metrics.go ../../gen/gen.go -import github.com/mesos/mesos-go/api/v1/lib -import github.com/mesos/mesos-go/api/v1/lib/executor -type E:*executor.Call:&executor.Call{} -type Z:mesos.Response:&mesos.ResponseWrapper{} -output metrics_generated.go
2 changes: 1 addition & 1 deletion api/v1/lib/extras/executor/callrules/metrics_generated.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package callrules

// go generate -import github.com/mesos/mesos-go/api/v1/lib -import github.com/mesos/mesos-go/api/v1/lib/executor -type E:*executor.Call -type Z:mesos.Response -output metrics_generated.go
// go generate -import github.com/mesos/mesos-go/api/v1/lib -import github.com/mesos/mesos-go/api/v1/lib/executor -type E:*executor.Call:&executor.Call{} -type Z:mesos.Response:&mesos.ResponseWrapper{} -output metrics_generated.go
// GENERATED CODE FOLLOWS; DO NOT EDIT.

import (
Expand Down
58 changes: 58 additions & 0 deletions api/v1/lib/extras/executor/callrules/metrics_generated_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
package callrules

// go generate -import github.com/mesos/mesos-go/api/v1/lib -import github.com/mesos/mesos-go/api/v1/lib/executor -type E:*executor.Call:&executor.Call{} -type Z:mesos.Response:&mesos.ResponseWrapper{} -output metrics_generated.go
// GENERATED CODE FOLLOWS; DO NOT EDIT.

import (
"context"
"errors"
"reflect"
"testing"

"github.com/mesos/mesos-go/api/v1/lib"
"github.com/mesos/mesos-go/api/v1/lib/executor"
)

func TestMetrics(t *testing.T) {
var (
i int
ctx = context.Background()
p = &executor.Call{}
a = errors.New("a")
h = func(f func() error, _ ...string) error {
i++
return f()
}
r = Metrics(h)
)
var zp = &mesos.ResponseWrapper{}
for ti, tc := range []struct {
ctx context.Context
e *executor.Call
z mesos.Response
err error
}{
{ctx, p, zp, a},
{ctx, p, zp, nil},

{ctx, p, nil, a},
{ctx, nil, zp, a},
} {
c, e, z, err := r.Eval(tc.ctx, tc.e, tc.z, tc.err, ChainIdentity)
if !reflect.DeepEqual(c, tc.ctx) {
t.Errorf("test case %d: expected context %q instead of %q", ti, tc.ctx, c)
}
if !reflect.DeepEqual(e, tc.e) {
t.Errorf("test case %d: expected event %q instead of %q", ti, tc.e, e)
}
if !reflect.DeepEqual(z, tc.z) {
t.Errorf("expected return object %q instead of %q", z, tc.z)
}
if !reflect.DeepEqual(err, tc.err) {
t.Errorf("test case %d: expected error %q instead of %q", ti, tc.err, err)
}
if y := ti + 1; y != i {
t.Errorf("test case %d: expected count %q instead of %q", ti, y, i)
}
}
}
2 changes: 1 addition & 1 deletion api/v1/lib/extras/executor/eventrules/gen.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,4 @@ package eventrules

//go:generate go run ../../gen/rule_handlers.go ../../gen/gen.go -import github.com/mesos/mesos-go/api/v1/lib/executor -import github.com/mesos/mesos-go/api/v1/lib/executor/events -type E:*executor.Event -type H:events.Handler -type HF:events.HandlerFunc -output handlers_generated.go

//go:generate go run ../../gen/rule_metrics.go ../../gen/gen.go -import github.com/mesos/mesos-go/api/v1/lib/executor -type E:*executor.Event -output metrics_generated.go
//go:generate go run ../../gen/rule_metrics.go ../../gen/gen.go -import github.com/mesos/mesos-go/api/v1/lib/executor -type E:*executor.Event:&executor.Event{} -output metrics_generated.go
2 changes: 1 addition & 1 deletion api/v1/lib/extras/executor/eventrules/metrics_generated.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package eventrules

// go generate -import github.com/mesos/mesos-go/api/v1/lib/executor -type E:*executor.Event -output metrics_generated.go
// go generate -import github.com/mesos/mesos-go/api/v1/lib/executor -type E:*executor.Event:&executor.Event{} -output metrics_generated.go
// GENERATED CODE FOLLOWS; DO NOT EDIT.

import (
Expand Down
50 changes: 50 additions & 0 deletions api/v1/lib/extras/executor/eventrules/metrics_generated_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
package eventrules

// go generate -import github.com/mesos/mesos-go/api/v1/lib/executor -type E:*executor.Event:&executor.Event{} -output metrics_generated.go
// GENERATED CODE FOLLOWS; DO NOT EDIT.

import (
"context"
"errors"
"reflect"
"testing"

"github.com/mesos/mesos-go/api/v1/lib/executor"
)

func TestMetrics(t *testing.T) {
var (
i int
ctx = context.Background()
p = &executor.Event{}
a = errors.New("a")
h = func(f func() error, _ ...string) error {
i++
return f()
}
r = Metrics(h)
)
for ti, tc := range []struct {
ctx context.Context
e *executor.Event
err error
}{
{ctx, p, a},
{ctx, p, nil},
{ctx, nil, a},
} {
c, e, err := r.Eval(tc.ctx, tc.e, tc.err, ChainIdentity)
if !reflect.DeepEqual(c, tc.ctx) {
t.Errorf("test case %d: expected context %q instead of %q", ti, tc.ctx, c)
}
if !reflect.DeepEqual(e, tc.e) {
t.Errorf("test case %d: expected event %q instead of %q", ti, tc.e, e)
}
if !reflect.DeepEqual(err, tc.err) {
t.Errorf("test case %d: expected error %q instead of %q", ti, tc.err, err)
}
if y := ti + 1; y != i {
t.Errorf("test case %d: expected count %q instead of %q", ti, y, i)
}
}
}
76 changes: 73 additions & 3 deletions api/v1/lib/extras/gen/rule_metrics.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,10 @@ import (
)

func main() {
Run(handlersTemplate, nil, os.Args...)
Run(metricsTemplate, metricsTestTemplate, os.Args...)
}

var handlersTemplate = template.Must(template.New("").Parse(`package {{.Package}}
var metricsTemplate = template.Must(template.New("").Parse(`package {{.Package}}
// go generate {{.Args}}
// GENERATED CODE FOLLOWS; DO NOT EDIT.
Expand All @@ -26,7 +26,7 @@ import (
{{end}}
)
{{.RequireType "E" -}}
{{.RequireType "E" -}}{{/* type E should have a GetType() func that returns an object w/ a String() func */ -}}
func Metrics(harness metrics.Harness) Rule {
return func(ctx context.Context, e {{.Type "E"}}, {{.Arg "Z" "z," -}} err error, ch Chain) (context.Context, {{.Type "E"}}, {{.Arg "Z" "," -}} error) {
typename := strings.ToLower(e.GetType().String())
Expand All @@ -38,3 +38,73 @@ func Metrics(harness metrics.Harness) Rule {
}
}
`))

var metricsTestTemplate = template.Must(template.New("").Parse(`package {{.Package}}
// go generate {{.Args}}
// GENERATED CODE FOLLOWS; DO NOT EDIT.
import (
"context"
"errors"
"reflect"
"testing"
{{range .Imports}}
{{ printf "%q" . -}}
{{end}}
)
{{.RequireType "E" -}}
{{.RequirePrototype "E" -}}
{{.RequirePrototype "Z" -}}
func TestMetrics(t *testing.T) {
var (
i int
ctx = context.Background()
p = {{.Prototype "E"}}
a = errors.New("a")
h = func(f func() error, _ ...string) error {
i++
return f()
}
r = Metrics(h)
)
{{if .Type "Z" -}}
var zp = {{.Prototype "Z"}}
{{end -}}
for ti, tc := range []struct {
ctx context.Context
e {{.Type "E"}}
{{if .Type "Z"}}
{{- .Arg "Z" "z "}}
{{end -}}
err error
}{
{ctx, p, {{.Ref "Z" "zp," -}} a},
{ctx, p, {{.Ref "Z" "zp," -}} nil},
{{if .Type "Z"}}
{ctx, p, {{.Ref "Z" "nil," -}} a},
{{end -}}
{ctx, nil, {{.Ref "Z" "zp," -}} a},
} {
c, e, {{.Ref "Z" "z," -}} err := r.Eval(tc.ctx, tc.e, {{.Ref "Z" "tc.z," -}} tc.err, ChainIdentity)
if !reflect.DeepEqual(c, tc.ctx) {
t.Errorf("test case %d: expected context %q instead of %q", ti, tc.ctx, c)
}
if !reflect.DeepEqual(e, tc.e) {
t.Errorf("test case %d: expected event %q instead of %q", ti, tc.e, e)
}
{{if .Type "Z" -}}
if !reflect.DeepEqual(z, tc.z) {
t.Errorf("expected return object %q instead of %q", z, tc.z)
}
{{end -}}
if !reflect.DeepEqual(err, tc.err) {
t.Errorf("test case %d: expected error %q instead of %q", ti, tc.err, err)
}
if y := ti + 1; y != i {
t.Errorf("test case %d: expected count %q instead of %q", ti, y, i)
}
}
}
`))
2 changes: 1 addition & 1 deletion api/v1/lib/extras/scheduler/callrules/gen.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,4 @@ package callrules

//go:generate go run ../../gen/rule_callers.go ../../gen/gen.go -import github.com/mesos/mesos-go/api/v1/lib/scheduler -import github.com/mesos/mesos-go/api/v1/lib/scheduler/calls -type E:*scheduler.Call -type C:calls.Caller -type CF:calls.CallerFunc -output callers_generated.go

//go:generate go run ../../gen/rule_metrics.go ../../gen/gen.go -import github.com/mesos/mesos-go/api/v1/lib -import github.com/mesos/mesos-go/api/v1/lib/scheduler -type E:*scheduler.Call -type Z:mesos.Response -output metrics_generated.go
//go:generate go run ../../gen/rule_metrics.go ../../gen/gen.go -import github.com/mesos/mesos-go/api/v1/lib -import github.com/mesos/mesos-go/api/v1/lib/scheduler -type E:*scheduler.Call:&scheduler.Call{} -type Z:mesos.Response:&mesos.ResponseWrapper{} -output metrics_generated.go
2 changes: 1 addition & 1 deletion api/v1/lib/extras/scheduler/callrules/metrics_generated.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package callrules

// go generate -import github.com/mesos/mesos-go/api/v1/lib -import github.com/mesos/mesos-go/api/v1/lib/scheduler -type E:*scheduler.Call -type Z:mesos.Response -output metrics_generated.go
// go generate -import github.com/mesos/mesos-go/api/v1/lib -import github.com/mesos/mesos-go/api/v1/lib/scheduler -type E:*scheduler.Call:&scheduler.Call{} -type Z:mesos.Response:&mesos.ResponseWrapper{} -output metrics_generated.go
// GENERATED CODE FOLLOWS; DO NOT EDIT.

import (
Expand Down
58 changes: 58 additions & 0 deletions api/v1/lib/extras/scheduler/callrules/metrics_generated_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
package callrules

// go generate -import github.com/mesos/mesos-go/api/v1/lib -import github.com/mesos/mesos-go/api/v1/lib/scheduler -type E:*scheduler.Call:&scheduler.Call{} -type Z:mesos.Response:&mesos.ResponseWrapper{} -output metrics_generated.go
// GENERATED CODE FOLLOWS; DO NOT EDIT.

import (
"context"
"errors"
"reflect"
"testing"

"github.com/mesos/mesos-go/api/v1/lib"
"github.com/mesos/mesos-go/api/v1/lib/scheduler"
)

func TestMetrics(t *testing.T) {
var (
i int
ctx = context.Background()
p = &scheduler.Call{}
a = errors.New("a")
h = func(f func() error, _ ...string) error {
i++
return f()
}
r = Metrics(h)
)
var zp = &mesos.ResponseWrapper{}
for ti, tc := range []struct {
ctx context.Context
e *scheduler.Call
z mesos.Response
err error
}{
{ctx, p, zp, a},
{ctx, p, zp, nil},

{ctx, p, nil, a},
{ctx, nil, zp, a},
} {
c, e, z, err := r.Eval(tc.ctx, tc.e, tc.z, tc.err, ChainIdentity)
if !reflect.DeepEqual(c, tc.ctx) {
t.Errorf("test case %d: expected context %q instead of %q", ti, tc.ctx, c)
}
if !reflect.DeepEqual(e, tc.e) {
t.Errorf("test case %d: expected event %q instead of %q", ti, tc.e, e)
}
if !reflect.DeepEqual(z, tc.z) {
t.Errorf("expected return object %q instead of %q", z, tc.z)
}
if !reflect.DeepEqual(err, tc.err) {
t.Errorf("test case %d: expected error %q instead of %q", ti, tc.err, err)
}
if y := ti + 1; y != i {
t.Errorf("test case %d: expected count %q instead of %q", ti, y, i)
}
}
}
2 changes: 1 addition & 1 deletion api/v1/lib/extras/scheduler/eventrules/gen.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,4 @@ package eventrules

//go:generate go run ../../gen/rule_handlers.go ../../gen/gen.go -import github.com/mesos/mesos-go/api/v1/lib/scheduler -import github.com/mesos/mesos-go/api/v1/lib/scheduler/events -type E:*scheduler.Event -type H:events.Handler -type HF:events.HandlerFunc -output handlers_generated.go

//go:generate go run ../../gen/rule_metrics.go ../../gen/gen.go -import github.com/mesos/mesos-go/api/v1/lib/scheduler -type E:*scheduler.Event -output metrics_generated.go
//go:generate go run ../../gen/rule_metrics.go ../../gen/gen.go -import github.com/mesos/mesos-go/api/v1/lib/scheduler -type E:*scheduler.Event:&scheduler.Event{} -output metrics_generated.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package eventrules

// go generate -import github.com/mesos/mesos-go/api/v1/lib/scheduler -type E:*scheduler.Event -output metrics_generated.go
// go generate -import github.com/mesos/mesos-go/api/v1/lib/scheduler -type E:*scheduler.Event:&scheduler.Event{} -output metrics_generated.go
// GENERATED CODE FOLLOWS; DO NOT EDIT.

import (
Expand Down
50 changes: 50 additions & 0 deletions api/v1/lib/extras/scheduler/eventrules/metrics_generated_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
package eventrules

// go generate -import github.com/mesos/mesos-go/api/v1/lib/scheduler -type E:*scheduler.Event:&scheduler.Event{} -output metrics_generated.go
// GENERATED CODE FOLLOWS; DO NOT EDIT.

import (
"context"
"errors"
"reflect"
"testing"

"github.com/mesos/mesos-go/api/v1/lib/scheduler"
)

func TestMetrics(t *testing.T) {
var (
i int
ctx = context.Background()
p = &scheduler.Event{}
a = errors.New("a")
h = func(f func() error, _ ...string) error {
i++
return f()
}
r = Metrics(h)
)
for ti, tc := range []struct {
ctx context.Context
e *scheduler.Event
err error
}{
{ctx, p, a},
{ctx, p, nil},
{ctx, nil, a},
} {
c, e, err := r.Eval(tc.ctx, tc.e, tc.err, ChainIdentity)
if !reflect.DeepEqual(c, tc.ctx) {
t.Errorf("test case %d: expected context %q instead of %q", ti, tc.ctx, c)
}
if !reflect.DeepEqual(e, tc.e) {
t.Errorf("test case %d: expected event %q instead of %q", ti, tc.e, e)
}
if !reflect.DeepEqual(err, tc.err) {
t.Errorf("test case %d: expected error %q instead of %q", ti, tc.err, err)
}
if y := ti + 1; y != i {
t.Errorf("test case %d: expected count %q instead of %q", ti, y, i)
}
}
}

0 comments on commit 90fe8a5

Please sign in to comment.