You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
156 lines
3.6 KiB
156 lines
3.6 KiB
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.`) |
|
} |
|
}
|
|
|