|
|
|
package metrics
|
|
|
|
|
|
|
|
import (
|
|
|
|
"context"
|
|
|
|
"errors"
|
|
|
|
"testing"
|
|
|
|
|
|
|
|
"github.com/go-kratos/kratos/v2/metrics"
|
|
|
|
"github.com/go-kratos/kratos/v2/transport"
|
|
|
|
"github.com/go-kratos/kratos/v2/transport/http"
|
|
|
|
)
|
|
|
|
|
|
|
|
type (
|
|
|
|
mockCounter struct {
|
|
|
|
lvs []string
|
|
|
|
value float64
|
|
|
|
}
|
|
|
|
mockObserver struct {
|
|
|
|
lvs []string
|
|
|
|
value float64
|
|
|
|
}
|
|
|
|
)
|
|
|
|
|
|
|
|
func (m *mockCounter) With(lvs ...string) metrics.Counter {
|
|
|
|
return m
|
|
|
|
}
|
|
|
|
|
|
|
|
func (m *mockCounter) Inc() {
|
|
|
|
m.value += 1.0
|
|
|
|
}
|
|
|
|
|
|
|
|
func (m *mockCounter) Add(delta float64) {
|
|
|
|
m.value += delta
|
|
|
|
}
|
|
|
|
|
|
|
|
func (m *mockObserver) With(lvs ...string) metrics.Observer {
|
|
|
|
return m
|
|
|
|
}
|
|
|
|
|
|
|
|
func (m *mockObserver) Observe(delta float64) {
|
|
|
|
m.value += delta
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestWithRequests(t *testing.T) {
|
|
|
|
mock := mockCounter{
|
|
|
|
lvs: []string{"Initial"},
|
|
|
|
value: 1.23,
|
|
|
|
}
|
|
|
|
o := options{
|
|
|
|
requests: &mock,
|
|
|
|
}
|
|
|
|
|
|
|
|
WithRequests(&mock)(&o)
|
|
|
|
|
|
|
|
if _, ok := o.requests.(*mockCounter); !ok {
|
|
|
|
t.Errorf(`The type of the option requests property must be of "mockCounter", %T given.`, o.requests)
|
|
|
|
}
|
|
|
|
|
|
|
|
counter := o.requests.(*mockCounter)
|
|
|
|
|
|
|
|
if len(counter.lvs) != 1 || counter.lvs[0] != "Initial" {
|
|
|
|
t.Errorf(`The given counter lvs must have only one element equal to "Initial", %v given`, counter.lvs)
|
|
|
|
}
|
|
|
|
if counter.value != 1.23 {
|
|
|
|
t.Errorf(`The given counter value must be equal to 1.23, %v given`, counter.value)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestWithSeconds(t *testing.T) {
|
|
|
|
mock := mockObserver{
|
|
|
|
lvs: []string{"Initial"},
|
|
|
|
value: 1.23,
|
|
|
|
}
|
|
|
|
o := options{
|
|
|
|
seconds: &mock,
|
|
|
|
}
|
|
|
|
|
|
|
|
WithSeconds(&mock)(&o)
|
|
|
|
|
|
|
|
if _, ok := o.seconds.(*mockObserver); !ok {
|
|
|
|
t.Errorf(`The type of the option requests property must be of "mockObserver", %T given.`, o.requests)
|
|
|
|
}
|
|
|
|
|
|
|
|
observer := o.seconds.(*mockObserver)
|
|
|
|
|
|
|
|
if len(observer.lvs) != 1 || observer.lvs[0] != "Initial" {
|
|
|
|
t.Errorf(`The given observer lvs must have only one element equal to "Initial", %v given`, observer.lvs)
|
|
|
|
}
|
|
|
|
if observer.value != 1.23 {
|
|
|
|
t.Errorf(`The given observer value must be equal to 1.23, %v given`, observer.value)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestServer(t *testing.T) {
|
|
|
|
e := errors.New("got an error")
|
|
|
|
nextError := func(ctx context.Context, req interface{}) (interface{}, error) {
|
|
|
|
return nil, e
|
|
|
|
}
|
|
|
|
nextValid := func(ctx context.Context, req interface{}) (interface{}, error) {
|
|
|
|
return "Hello valid", nil
|
|
|
|
}
|
|
|
|
|
|
|
|
_, err := Server()(nextError)(context.Background(), "test:")
|
|
|
|
if err != e {
|
|
|
|
t.Error("The given error mismatch the expected.")
|
|
|
|
}
|
|
|
|
|
|
|
|
res, err := Server(func(o *options) {
|
|
|
|
o.requests = &mockCounter{
|
|
|
|
lvs: []string{"Initial"},
|
|
|
|
value: 1.23,
|
|
|
|
}
|
|
|
|
o.seconds = &mockObserver{
|
|
|
|
lvs: []string{"Initial"},
|
|
|
|
value: 1.23,
|
|
|
|
}
|
|
|
|
})(nextValid)(transport.NewServerContext(context.Background(), &http.Transport{}), "test:")
|
|
|
|
if err != nil {
|
|
|
|
t.Error("The server must not throw an error.")
|
|
|
|
}
|
|
|
|
if res != "Hello valid" {
|
|
|
|
t.Error(`The server must return a "Hello valid" response.`)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestClient(t *testing.T) {
|
|
|
|
e := errors.New("got an error")
|
|
|
|
nextError := func(ctx context.Context, req interface{}) (interface{}, error) {
|
|
|
|
return nil, e
|
|
|
|
}
|
|
|
|
nextValid := func(ctx context.Context, req interface{}) (interface{}, error) {
|
|
|
|
return "Hello valid", nil
|
|
|
|
}
|
|
|
|
|
|
|
|
_, err := Client()(nextError)(context.Background(), "test:")
|
|
|
|
if err != e {
|
|
|
|
t.Error("The given error mismatch the expected.")
|
|
|
|
}
|
|
|
|
|
|
|
|
res, err := Client(func(o *options) {
|
|
|
|
o.requests = &mockCounter{
|
|
|
|
lvs: []string{"Initial"},
|
|
|
|
value: 1.23,
|
|
|
|
}
|
|
|
|
o.seconds = &mockObserver{
|
|
|
|
lvs: []string{"Initial"},
|
|
|
|
value: 1.23,
|
|
|
|
}
|
|
|
|
})(nextValid)(transport.NewClientContext(context.Background(), &http.Transport{}), "test:")
|
|
|
|
if err != nil {
|
|
|
|
t.Error("The server must not throw an error.")
|
|
|
|
}
|
|
|
|
if res != "Hello valid" {
|
|
|
|
t.Error(`The server must return a "Hello valid" response.`)
|
|
|
|
}
|
|
|
|
}
|