diff --git a/go.mod b/go.mod index 5aee9da3b5..bba1c7e831 100755 --- a/go.mod +++ b/go.mod @@ -78,7 +78,7 @@ require ( gonum.org/v1/hdf5 v0.0.0-20200504100616-496fefe91614 gonum.org/v1/plot v0.8.1 google.golang.org/api v0.36.0 - google.golang.org/genproto v0.0.0-20210119180700-e258113e47cc + google.golang.org/genproto v0.0.0-20210120162456-f5e8c5e2aaf2 google.golang.org/grpc v1.34.0 gopkg.in/yaml.v2 v2.4.0 k8s.io/api v0.20.2 diff --git a/go.sum b/go.sum index 2e36b1316e..8b701a82e5 100644 --- a/go.sum +++ b/go.sum @@ -806,8 +806,8 @@ google.golang.org/genproto v0.0.0-20201019141844-1ed22bb0c154/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20201110150050-8816d57aaa9a/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210119180700-e258113e47cc h1:tsmkSntchraIEmbGgYaZGZ8LVIidKCWEmPwEnSQSalA= -google.golang.org/genproto v0.0.0-20210119180700-e258113e47cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210120162456-f5e8c5e2aaf2 h1:5SVh73Qofuzb+K5wbIiNyDFK6+hjPfVD9DStL2dAiDM= +google.golang.org/genproto v0.0.0-20210120162456-f5e8c5e2aaf2/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/grpc v1.35.0 h1:TwIQcH3es+MojMVojxxfQ3l3OF2KzlRxML2xZq0kRo8= google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/protobuf v1.25.0 h1:Ejskq+SyPohKW+1uil0JJMtmHCgJPJ/qWTxr8qp+R4c= diff --git a/internal/net/grpc/interceptor/server/recover/recover_test.go b/internal/net/grpc/interceptor/server/recover/recover_test.go index 600409ad75..a199c82369 100644 --- a/internal/net/grpc/interceptor/server/recover/recover_test.go +++ b/internal/net/grpc/interceptor/server/recover/recover_test.go @@ -85,7 +85,6 @@ func TestRecoverInterceptor(t *testing.T) { if err := test.checkFunc(test.want, got); err != nil { tt.Errorf("error = %v", err) } - }) } } @@ -149,7 +148,6 @@ func TestRecoverStreamInterceptor(t *testing.T) { if err := test.checkFunc(test.want, got); err != nil { tt.Errorf("error = %v", err) } - }) } } diff --git a/internal/net/grpc/interceptor/server/trace/payload.go b/internal/net/grpc/interceptor/server/trace/payload.go index bf5e22b84e..e68d535432 100644 --- a/internal/net/grpc/interceptor/server/trace/payload.go +++ b/internal/net/grpc/interceptor/server/trace/payload.go @@ -40,13 +40,11 @@ const ( traceAttrGRPCResponsePayload = "grpc.response.payload" ) -var ( - bufferPool = sync.Pool{ - New: func() interface{} { - return &bytes.Buffer{} - }, - } -) +var bufferPool = sync.Pool{ + New: func() interface{} { + return &bytes.Buffer{} + }, +} func TracePayloadInterceptor() grpc.UnaryServerInterceptor { return func( diff --git a/internal/net/grpc/interceptor/server/trace/payload_test.go b/internal/net/grpc/interceptor/server/trace/payload_test.go new file mode 100644 index 0000000000..3e5edc3f79 --- /dev/null +++ b/internal/net/grpc/interceptor/server/trace/payload_test.go @@ -0,0 +1,491 @@ +// +// Copyright (C) 2019-2021 vdaas.org vald team +// +// 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 +// +// https://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 trace provides gRPC interceptors for traces +package trace + +import ( + "reflect" + "testing" + + "github.com/vdaas/vald/internal/errors" + "github.com/vdaas/vald/internal/net/grpc" + "go.uber.org/goleak" +) + +func TestTracePayloadInterceptor(t *testing.T) { + t.Parallel() + type want struct { + want grpc.UnaryServerInterceptor + } + type test struct { + name string + want want + checkFunc func(want, grpc.UnaryServerInterceptor) error + beforeFunc func() + afterFunc func() + } + defaultCheckFunc := func(w want, got grpc.UnaryServerInterceptor) error { + if !reflect.DeepEqual(got, w.want) { + return errors.Errorf("got: \"%#v\",\n\t\t\t\twant: \"%#v\"", got, w.want) + } + return nil + } + tests := []test{ + // TODO test cases + /* + { + name: "test_case_1", + want: want{}, + checkFunc: defaultCheckFunc, + }, + */ + + // TODO test cases + /* + func() test { + return test { + name: "test_case_2", + want: want{}, + checkFunc: defaultCheckFunc, + } + }(), + */ + } + + for _, tc := range tests { + test := tc + t.Run(test.name, func(tt *testing.T) { + tt.Parallel() + defer goleak.VerifyNone(tt, goleak.IgnoreCurrent()) + if test.beforeFunc != nil { + test.beforeFunc() + } + if test.afterFunc != nil { + defer test.afterFunc() + } + if test.checkFunc == nil { + test.checkFunc = defaultCheckFunc + } + + got := TracePayloadInterceptor() + if err := test.checkFunc(test.want, got); err != nil { + tt.Errorf("error = %v", err) + } + }) + } +} + +func TestTracePayloadStreamInterceptor(t *testing.T) { + t.Parallel() + type want struct { + want grpc.StreamServerInterceptor + } + type test struct { + name string + want want + checkFunc func(want, grpc.StreamServerInterceptor) error + beforeFunc func() + afterFunc func() + } + defaultCheckFunc := func(w want, got grpc.StreamServerInterceptor) error { + if !reflect.DeepEqual(got, w.want) { + return errors.Errorf("got: \"%#v\",\n\t\t\t\twant: \"%#v\"", got, w.want) + } + return nil + } + tests := []test{ + // TODO test cases + /* + { + name: "test_case_1", + want: want{}, + checkFunc: defaultCheckFunc, + }, + */ + + // TODO test cases + /* + func() test { + return test { + name: "test_case_2", + want: want{}, + checkFunc: defaultCheckFunc, + } + }(), + */ + } + + for _, tc := range tests { + test := tc + t.Run(test.name, func(tt *testing.T) { + tt.Parallel() + defer goleak.VerifyNone(tt, goleak.IgnoreCurrent()) + if test.beforeFunc != nil { + test.beforeFunc() + } + if test.afterFunc != nil { + defer test.afterFunc() + } + if test.checkFunc == nil { + test.checkFunc = defaultCheckFunc + } + + got := TracePayloadStreamInterceptor() + if err := test.checkFunc(test.want, got); err != nil { + tt.Errorf("error = %v", err) + } + }) + } +} + +func Test_tracingServerStream_RecvMsg(t *testing.T) { + t.Parallel() + type args struct { + m interface{} + } + type fields struct { + ServerStream grpc.ServerStream + request string + response string + } + type want struct { + err error + } + type test struct { + name string + args args + fields fields + want want + checkFunc func(want, error) error + beforeFunc func(args) + afterFunc func(args) + } + defaultCheckFunc := func(w want, err error) error { + if !errors.Is(err, w.err) { + return errors.Errorf("got_error: \"%#v\",\n\t\t\t\twant: \"%#v\"", err, w.err) + } + return nil + } + tests := []test{ + // TODO test cases + /* + { + name: "test_case_1", + args: args { + m: nil, + }, + fields: fields { + ServerStream: nil, + request: "", + response: "", + }, + want: want{}, + checkFunc: defaultCheckFunc, + }, + */ + + // TODO test cases + /* + func() test { + return test { + name: "test_case_2", + args: args { + m: nil, + }, + fields: fields { + ServerStream: nil, + request: "", + response: "", + }, + want: want{}, + checkFunc: defaultCheckFunc, + } + }(), + */ + } + + for _, tc := range tests { + test := tc + t.Run(test.name, func(tt *testing.T) { + tt.Parallel() + defer goleak.VerifyNone(tt, goleak.IgnoreCurrent()) + if test.beforeFunc != nil { + test.beforeFunc(test.args) + } + if test.afterFunc != nil { + defer test.afterFunc(test.args) + } + if test.checkFunc == nil { + test.checkFunc = defaultCheckFunc + } + tss := &tracingServerStream{ + ServerStream: test.fields.ServerStream, + request: test.fields.request, + response: test.fields.response, + } + + err := tss.RecvMsg(test.args.m) + if err := test.checkFunc(test.want, err); err != nil { + tt.Errorf("error = %v", err) + } + }) + } +} + +func Test_tracingServerStream_SendMsg(t *testing.T) { + t.Parallel() + type args struct { + m interface{} + } + type fields struct { + ServerStream grpc.ServerStream + request string + response string + } + type want struct { + err error + } + type test struct { + name string + args args + fields fields + want want + checkFunc func(want, error) error + beforeFunc func(args) + afterFunc func(args) + } + defaultCheckFunc := func(w want, err error) error { + if !errors.Is(err, w.err) { + return errors.Errorf("got_error: \"%#v\",\n\t\t\t\twant: \"%#v\"", err, w.err) + } + return nil + } + tests := []test{ + // TODO test cases + /* + { + name: "test_case_1", + args: args { + m: nil, + }, + fields: fields { + ServerStream: nil, + request: "", + response: "", + }, + want: want{}, + checkFunc: defaultCheckFunc, + }, + */ + + // TODO test cases + /* + func() test { + return test { + name: "test_case_2", + args: args { + m: nil, + }, + fields: fields { + ServerStream: nil, + request: "", + response: "", + }, + want: want{}, + checkFunc: defaultCheckFunc, + } + }(), + */ + } + + for _, tc := range tests { + test := tc + t.Run(test.name, func(tt *testing.T) { + tt.Parallel() + defer goleak.VerifyNone(tt, goleak.IgnoreCurrent()) + if test.beforeFunc != nil { + test.beforeFunc(test.args) + } + if test.afterFunc != nil { + defer test.afterFunc(test.args) + } + if test.checkFunc == nil { + test.checkFunc = defaultCheckFunc + } + tss := &tracingServerStream{ + ServerStream: test.fields.ServerStream, + request: test.fields.request, + response: test.fields.response, + } + + err := tss.SendMsg(test.args.m) + if err := test.checkFunc(test.want, err); err != nil { + tt.Errorf("error = %v", err) + } + }) + } +} + +func Test_parseMethod(t *testing.T) { + t.Parallel() + type args struct { + fullMethod string + } + type want struct { + wantService string + wantMethod string + } + type test struct { + name string + args args + want want + checkFunc func(want, string, string) error + beforeFunc func(args) + afterFunc func(args) + } + defaultCheckFunc := func(w want, gotService string, gotMethod string) error { + if !reflect.DeepEqual(gotService, w.wantService) { + return errors.Errorf("got: \"%#v\",\n\t\t\t\twant: \"%#v\"", gotService, w.wantService) + } + if !reflect.DeepEqual(gotMethod, w.wantMethod) { + return errors.Errorf("got: \"%#v\",\n\t\t\t\twant: \"%#v\"", gotMethod, w.wantMethod) + } + return nil + } + tests := []test{ + // TODO test cases + /* + { + name: "test_case_1", + args: args { + fullMethod: "", + }, + want: want{}, + checkFunc: defaultCheckFunc, + }, + */ + + // TODO test cases + /* + func() test { + return test { + name: "test_case_2", + args: args { + fullMethod: "", + }, + want: want{}, + checkFunc: defaultCheckFunc, + } + }(), + */ + } + + for _, tc := range tests { + test := tc + t.Run(test.name, func(tt *testing.T) { + tt.Parallel() + defer goleak.VerifyNone(tt, goleak.IgnoreCurrent()) + if test.beforeFunc != nil { + test.beforeFunc(test.args) + } + if test.afterFunc != nil { + defer test.afterFunc(test.args) + } + if test.checkFunc == nil { + test.checkFunc = defaultCheckFunc + } + + gotService, gotMethod := parseMethod(test.args.fullMethod) + if err := test.checkFunc(test.want, gotService, gotMethod); err != nil { + tt.Errorf("error = %v", err) + } + }) + } +} + +func Test_marshalJSON(t *testing.T) { + t.Parallel() + type args struct { + pbMsg interface{} + } + type want struct { + want string + } + type test struct { + name string + args args + want want + checkFunc func(want, string) error + beforeFunc func(args) + afterFunc func(args) + } + defaultCheckFunc := func(w want, got string) error { + if !reflect.DeepEqual(got, w.want) { + return errors.Errorf("got: \"%#v\",\n\t\t\t\twant: \"%#v\"", got, w.want) + } + return nil + } + tests := []test{ + // TODO test cases + /* + { + name: "test_case_1", + args: args { + pbMsg: nil, + }, + want: want{}, + checkFunc: defaultCheckFunc, + }, + */ + + // TODO test cases + /* + func() test { + return test { + name: "test_case_2", + args: args { + pbMsg: nil, + }, + want: want{}, + checkFunc: defaultCheckFunc, + } + }(), + */ + } + + for _, tc := range tests { + test := tc + t.Run(test.name, func(tt *testing.T) { + tt.Parallel() + defer goleak.VerifyNone(tt, goleak.IgnoreCurrent()) + if test.beforeFunc != nil { + test.beforeFunc(test.args) + } + if test.afterFunc != nil { + defer test.afterFunc(test.args) + } + if test.checkFunc == nil { + test.checkFunc = defaultCheckFunc + } + + got := marshalJSON(test.args.pbMsg) + if err := test.checkFunc(test.want, got); err != nil { + tt.Errorf("error = %v", err) + } + }) + } +} diff --git a/k8s/metrics/profefe/clusterrole.yaml b/k8s/metrics/profefe/clusterrole.yaml index f8d028e374..ad1e56b79a 100644 --- a/k8s/metrics/profefe/clusterrole.yaml +++ b/k8s/metrics/profefe/clusterrole.yaml @@ -14,7 +14,7 @@ # See the License for the specific language governing permissions and # limitations under the License. # -apiVersion: rbac.authorization.k8s.io/v1beta1 +apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: kprofefe diff --git a/k8s/metrics/profefe/clusterrolebinding.yaml b/k8s/metrics/profefe/clusterrolebinding.yaml index 252782617b..c32053cc11 100644 --- a/k8s/metrics/profefe/clusterrolebinding.yaml +++ b/k8s/metrics/profefe/clusterrolebinding.yaml @@ -14,7 +14,7 @@ # See the License for the specific language governing permissions and # limitations under the License. # -apiVersion: rbac.authorization.k8s.io/v1beta1 +apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: kprofefe diff --git a/k8s/metrics/prometheus/clusterrole.yaml b/k8s/metrics/prometheus/clusterrole.yaml index 55dcf1b3ed..82dd7d5af4 100644 --- a/k8s/metrics/prometheus/clusterrole.yaml +++ b/k8s/metrics/prometheus/clusterrole.yaml @@ -14,7 +14,7 @@ # See the License for the specific language governing permissions and # limitations under the License. # -apiVersion: rbac.authorization.k8s.io/v1beta1 +apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: metrics-reader diff --git a/k8s/metrics/prometheus/clusterrolebinding.yaml b/k8s/metrics/prometheus/clusterrolebinding.yaml index 0b2fa69baf..3dfa5b8e3b 100644 --- a/k8s/metrics/prometheus/clusterrolebinding.yaml +++ b/k8s/metrics/prometheus/clusterrolebinding.yaml @@ -14,7 +14,7 @@ # See the License for the specific language governing permissions and # limitations under the License. # -apiVersion: rbac.authorization.k8s.io/v1beta1 +apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: prometheus