Merge pull request #130 from unistack-org/improvements
Improvements
This commit was merged in pull request #130.
	This commit is contained in:
		| @@ -3,10 +3,27 @@ package api | |||||||
| import ( | import ( | ||||||
| 	"strings" | 	"strings" | ||||||
| 	"testing" | 	"testing" | ||||||
|  |  | ||||||
|  | 	"go.unistack.org/micro/v3/metadata" | ||||||
|  | 	"go.unistack.org/micro/v3/server" | ||||||
| ) | ) | ||||||
|  |  | ||||||
|  | func TestDecode(t *testing.T) { | ||||||
|  | 	md := metadata.New(0) | ||||||
|  | 	md.Set("host", "localhost", "method", "GET", "path", "/") | ||||||
|  | 	ep := Decode(md) | ||||||
|  | 	if md == nil { | ||||||
|  | 		t.Fatalf("failed to decode md %#+v", md) | ||||||
|  | 	} else if len(ep.Host) != 1 || len(ep.Method) != 1 || len(ep.Path) != 1 { | ||||||
|  | 		t.Fatalf("ep invalid after decode %#+v", ep) | ||||||
|  | 	} | ||||||
|  | 	if ep.Host[0] != "localhost" || ep.Method[0] != "GET" || ep.Path[0] != "/" { | ||||||
|  | 		t.Fatalf("ep invalid after decode %#+v", ep) | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
| //nolint:gocyclo | //nolint:gocyclo | ||||||
| func TestEncoding(t *testing.T) { | func TestEncode(t *testing.T) { | ||||||
| 	testData := []*Endpoint{ | 	testData := []*Endpoint{ | ||||||
| 		nil, | 		nil, | ||||||
| 		{ | 		{ | ||||||
| @@ -150,3 +167,79 @@ func TestValidate(t *testing.T) { | |||||||
| 		t.Fatalf("invalid pcre %v", epPcreInvalid.Path[0]) | 		t.Fatalf("invalid pcre %v", epPcreInvalid.Path[0]) | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
|  | func TestWithEndpoint(t *testing.T) { | ||||||
|  | 	ep := &Endpoint{ | ||||||
|  | 		Name:        "Foo.Bar", | ||||||
|  | 		Description: "A test endpoint", | ||||||
|  | 		Handler:     "meta", | ||||||
|  | 		Host:        []string{"foo.com"}, | ||||||
|  | 		Method:      []string{"GET"}, | ||||||
|  | 		Path:        []string{"/test/{id}"}, | ||||||
|  | 	} | ||||||
|  | 	o := WithEndpoint(ep) | ||||||
|  | 	opts := server.NewHandlerOptions(o) | ||||||
|  | 	if opts.Metadata == nil { | ||||||
|  | 		t.Fatalf("WithEndpoint not works %#+v", opts) | ||||||
|  | 	} | ||||||
|  | 	md, ok := opts.Metadata[ep.Name] | ||||||
|  | 	if !ok { | ||||||
|  | 		t.Fatalf("WithEndpoint not works %#+v", opts) | ||||||
|  | 	} | ||||||
|  | 	if v, ok := md.Get("Endpoint"); !ok || v != "Foo.Bar" { | ||||||
|  | 		t.Fatalf("WithEndpoint not works %#+v", md) | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func TestValidateNilErr(t *testing.T) { | ||||||
|  | 	var ep *Endpoint | ||||||
|  | 	if err := Validate(ep); err == nil { | ||||||
|  | 		t.Fatalf("Validate not works") | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func TestValidateMissingNameErr(t *testing.T) { | ||||||
|  | 	ep := &Endpoint{} | ||||||
|  | 	if err := Validate(ep); err == nil { | ||||||
|  | 		t.Fatalf("Validate not works") | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func TestValidateMissingHandlerErr(t *testing.T) { | ||||||
|  | 	ep := &Endpoint{Name: "test"} | ||||||
|  | 	if err := Validate(ep); err == nil { | ||||||
|  | 		t.Fatalf("Validate not works") | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func TestValidateRegexpStartErr(t *testing.T) { | ||||||
|  | 	ep := &Endpoint{Name: "test", Handler: "test"} | ||||||
|  | 	ep.Path = []string{"^/"} | ||||||
|  | 	if err := Validate(ep); err == nil { | ||||||
|  | 		t.Fatalf("Validate not works") | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func TestValidateRegexpEndErr(t *testing.T) { | ||||||
|  | 	ep := &Endpoint{Name: "test", Handler: "test", Path: []string{""}} | ||||||
|  | 	ep.Path[0] = "/$" | ||||||
|  | 	if err := Validate(ep); err == nil { | ||||||
|  | 		t.Fatalf("Validate not works") | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func TestValidateRegexpNonErr(t *testing.T) { | ||||||
|  | 	ep := &Endpoint{Name: "test", Handler: "test", Path: []string{""}} | ||||||
|  | 	ep.Path[0] = "^/(.*)$" | ||||||
|  | 	if err := Validate(ep); err != nil { | ||||||
|  | 		t.Fatalf("Validate not works") | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func TestValidateRegexpErr(t *testing.T) { | ||||||
|  | 	ep := &Endpoint{Name: "test", Handler: "test", Path: []string{""}} | ||||||
|  | 	ep.Path[0] = "^/(.$" | ||||||
|  | 	if err := Validate(ep); err == nil { | ||||||
|  | 		t.Fatalf("Validate not works") | ||||||
|  | 	} | ||||||
|  | } | ||||||
|   | |||||||
| @@ -7,16 +7,31 @@ import ( | |||||||
|  |  | ||||||
| func TestFromContext(t *testing.T) { | func TestFromContext(t *testing.T) { | ||||||
| 	ctx := context.WithValue(context.TODO(), brokerKey{}, NewBroker()) | 	ctx := context.WithValue(context.TODO(), brokerKey{}, NewBroker()) | ||||||
|  |  | ||||||
| 	c, ok := FromContext(ctx) | 	c, ok := FromContext(ctx) | ||||||
| 	if c == nil || !ok { | 	if c == nil || !ok { | ||||||
| 		t.Fatal("FromContext not works") | 		t.Fatal("FromContext not works") | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
|  | func TestFromNilContext(t *testing.T) { | ||||||
|  | 	// nolint: staticcheck | ||||||
|  | 	c, ok := FromContext(nil) | ||||||
|  | 	if ok || c != nil { | ||||||
|  | 		t.Fatal("FromContext not works") | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
| func TestNewContext(t *testing.T) { | func TestNewContext(t *testing.T) { | ||||||
| 	ctx := NewContext(context.TODO(), NewBroker()) | 	ctx := NewContext(context.TODO(), NewBroker()) | ||||||
|  | 	c, ok := FromContext(ctx) | ||||||
|  | 	if c == nil || !ok { | ||||||
|  | 		t.Fatal("NewContext not works") | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func TestNewNilContext(t *testing.T) { | ||||||
|  | 	// nolint: staticcheck | ||||||
|  | 	ctx := NewContext(nil, NewBroker()) | ||||||
| 	c, ok := FromContext(ctx) | 	c, ok := FromContext(ctx) | ||||||
| 	if c == nil || !ok { | 	if c == nil || !ok { | ||||||
| 		t.Fatal("NewContext not works") | 		t.Fatal("NewContext not works") | ||||||
|   | |||||||
| @@ -14,9 +14,25 @@ func TestFromContext(t *testing.T) { | |||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
|  | func TestFromNilContext(t *testing.T) { | ||||||
|  | 	// nolint: staticcheck | ||||||
|  | 	c, ok := FromContext(nil) | ||||||
|  | 	if ok || c != nil { | ||||||
|  | 		t.Fatal("FromContext not works") | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
| func TestNewContext(t *testing.T) { | func TestNewContext(t *testing.T) { | ||||||
| 	ctx := NewContext(context.TODO(), NewClient()) | 	ctx := NewContext(context.TODO(), NewClient()) | ||||||
|  | 	c, ok := FromContext(ctx) | ||||||
|  | 	if c == nil || !ok { | ||||||
|  | 		t.Fatal("NewContext not works") | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func TestNewNilContext(t *testing.T) { | ||||||
|  | 	// nolint: staticcheck | ||||||
|  | 	ctx := NewContext(nil, NewClient()) | ||||||
| 	c, ok := FromContext(ctx) | 	c, ok := FromContext(ctx) | ||||||
| 	if c == nil || !ok { | 	if c == nil || !ok { | ||||||
| 		t.Fatal("NewContext not works") | 		t.Fatal("NewContext not works") | ||||||
|   | |||||||
| @@ -9,6 +9,7 @@ import ( | |||||||
| 	"go.unistack.org/micro/v3/codec" | 	"go.unistack.org/micro/v3/codec" | ||||||
| 	"go.unistack.org/micro/v3/errors" | 	"go.unistack.org/micro/v3/errors" | ||||||
| 	"go.unistack.org/micro/v3/metadata" | 	"go.unistack.org/micro/v3/metadata" | ||||||
|  | 	"go.unistack.org/micro/v3/selector" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| // DefaultCodecs will be used to encode/decode data | // DefaultCodecs will be used to encode/decode data | ||||||
| @@ -233,18 +234,7 @@ func (n *noopClient) Call(ctx context.Context, req Request, rsp interface{}, opt | |||||||
| 		callOpts.Address = []string{n.opts.Proxy} | 		callOpts.Address = []string{n.opts.Proxy} | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	// lookup the route to send the reques to | 	var next selector.Next | ||||||
| 	// TODO apply any filtering here |  | ||||||
| 	routes, err := n.opts.Lookup(ctx, req, callOpts) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return errors.InternalServerError("go.micro.client", err.Error()) |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	// balance the list of nodes |  | ||||||
| 	next, err := callOpts.Selector.Select(routes) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return err |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	// return errors.New("go.micro.client", "request timeout", 408) | 	// return errors.New("go.micro.client", "request timeout", 408) | ||||||
| 	call := func(i int) error { | 	call := func(i int) error { | ||||||
| @@ -259,6 +249,22 @@ func (n *noopClient) Call(ctx context.Context, req Request, rsp interface{}, opt | |||||||
| 			time.Sleep(t) | 			time.Sleep(t) | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
|  | 		if next == nil { | ||||||
|  | 			var routes []string | ||||||
|  | 			// lookup the route to send the reques to | ||||||
|  | 			// TODO apply any filtering here | ||||||
|  | 			routes, err = n.opts.Lookup(ctx, req, callOpts) | ||||||
|  | 			if err != nil { | ||||||
|  | 				return errors.InternalServerError("go.micro.client", err.Error()) | ||||||
|  | 			} | ||||||
|  |  | ||||||
|  | 			// balance the list of nodes | ||||||
|  | 			next, err = callOpts.Selector.Select(routes) | ||||||
|  | 			if err != nil { | ||||||
|  | 				return err | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  |  | ||||||
| 		node := next() | 		node := next() | ||||||
|  |  | ||||||
| 		// make the call | 		// make the call | ||||||
| @@ -323,6 +329,8 @@ func (n *noopClient) NewMessage(topic string, msg interface{}, opts ...MessageOp | |||||||
| } | } | ||||||
|  |  | ||||||
| func (n *noopClient) Stream(ctx context.Context, req Request, opts ...CallOption) (Stream, error) { | func (n *noopClient) Stream(ctx context.Context, req Request, opts ...CallOption) (Stream, error) { | ||||||
|  | 	var err error | ||||||
|  |  | ||||||
| 	// make a copy of call opts | 	// make a copy of call opts | ||||||
| 	callOpts := n.opts.CallOptions | 	callOpts := n.opts.CallOptions | ||||||
| 	for _, o := range opts { | 	for _, o := range opts { | ||||||
| @@ -374,18 +382,7 @@ func (n *noopClient) Stream(ctx context.Context, req Request, opts ...CallOption | |||||||
| 		callOpts.Address = []string{n.opts.Proxy} | 		callOpts.Address = []string{n.opts.Proxy} | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	// lookup the route to send the reques to | 	var next selector.Next | ||||||
| 	// TODO apply any filtering here |  | ||||||
| 	routes, err := n.opts.Lookup(ctx, req, callOpts) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, errors.InternalServerError("go.micro.client", err.Error()) |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	// balance the list of nodes |  | ||||||
| 	next, err := callOpts.Selector.Select(routes) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, err |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	call := func(i int) (Stream, error) { | 	call := func(i int) (Stream, error) { | ||||||
| 		// call backoff first. Someone may want an initial start delay | 		// call backoff first. Someone may want an initial start delay | ||||||
| @@ -399,6 +396,22 @@ func (n *noopClient) Stream(ctx context.Context, req Request, opts ...CallOption | |||||||
| 			time.Sleep(t) | 			time.Sleep(t) | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
|  | 		if next == nil { | ||||||
|  | 			var routes []string | ||||||
|  | 			// lookup the route to send the reques to | ||||||
|  | 			// TODO apply any filtering here | ||||||
|  | 			routes, err = n.opts.Lookup(ctx, req, callOpts) | ||||||
|  | 			if err != nil { | ||||||
|  | 				return nil, errors.InternalServerError("go.micro.client", err.Error()) | ||||||
|  | 			} | ||||||
|  |  | ||||||
|  | 			// balance the list of nodes | ||||||
|  | 			next, err = callOpts.Selector.Select(routes) | ||||||
|  | 			if err != nil { | ||||||
|  | 				return nil, err | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  |  | ||||||
| 		node := next() | 		node := next() | ||||||
|  |  | ||||||
| 		stream, cerr := n.stream(ctx, node, req, callOpts) | 		stream, cerr := n.stream(ctx, node, req, callOpts) | ||||||
|   | |||||||
| @@ -5,6 +5,24 @@ import ( | |||||||
| 	"testing" | 	"testing" | ||||||
| ) | ) | ||||||
|  |  | ||||||
|  | func TestFromNilContext(t *testing.T) { | ||||||
|  | 	// nolint: staticcheck | ||||||
|  | 	c, ok := FromContext(nil) | ||||||
|  | 	if ok || c != nil { | ||||||
|  | 		t.Fatal("FromContext not works") | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func TestNewNilContext(t *testing.T) { | ||||||
|  | 	// nolint: staticcheck | ||||||
|  | 	ctx := NewContext(nil, NewConfig()) | ||||||
|  |  | ||||||
|  | 	c, ok := FromContext(ctx) | ||||||
|  | 	if c == nil || !ok { | ||||||
|  | 		t.Fatal("NewContext not works") | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
| func TestFromContext(t *testing.T) { | func TestFromContext(t *testing.T) { | ||||||
| 	ctx := context.WithValue(context.TODO(), configKey{}, NewConfig()) | 	ctx := context.WithValue(context.TODO(), configKey{}, NewConfig()) | ||||||
|  |  | ||||||
|   | |||||||
| @@ -5,6 +5,24 @@ import ( | |||||||
| 	"testing" | 	"testing" | ||||||
| ) | ) | ||||||
|  |  | ||||||
|  | func TestFromNilContext(t *testing.T) { | ||||||
|  | 	// nolint: staticcheck | ||||||
|  | 	c, ok := FromContext(nil) | ||||||
|  | 	if ok || c != nil { | ||||||
|  | 		t.Fatal("FromContext not works") | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func TestNewNilContext(t *testing.T) { | ||||||
|  | 	// nolint: staticcheck | ||||||
|  | 	ctx := NewContext(nil, NewFlow()) | ||||||
|  |  | ||||||
|  | 	c, ok := FromContext(ctx) | ||||||
|  | 	if c == nil || !ok { | ||||||
|  | 		t.Fatal("NewContext not works") | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
| func TestFromContext(t *testing.T) { | func TestFromContext(t *testing.T) { | ||||||
| 	ctx := context.WithValue(context.TODO(), flowKey{}, NewFlow()) | 	ctx := context.WithValue(context.TODO(), flowKey{}, NewFlow()) | ||||||
|  |  | ||||||
|   | |||||||
| @@ -5,6 +5,24 @@ import ( | |||||||
| 	"testing" | 	"testing" | ||||||
| ) | ) | ||||||
|  |  | ||||||
|  | func TestFromNilContext(t *testing.T) { | ||||||
|  | 	// nolint: staticcheck | ||||||
|  | 	c, ok := FromContext(nil) | ||||||
|  | 	if ok || c != nil { | ||||||
|  | 		t.Fatal("FromContext not works") | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func TestNewNilContext(t *testing.T) { | ||||||
|  | 	// nolint: staticcheck | ||||||
|  | 	ctx := NewContext(nil, NewLogger()) | ||||||
|  |  | ||||||
|  | 	c, ok := FromContext(ctx) | ||||||
|  | 	if c == nil || !ok { | ||||||
|  | 		t.Fatal("NewContext not works") | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
| func TestFromContext(t *testing.T) { | func TestFromContext(t *testing.T) { | ||||||
| 	ctx := context.WithValue(context.TODO(), loggerKey{}, NewLogger()) | 	ctx := context.WithValue(context.TODO(), loggerKey{}, NewLogger()) | ||||||
|  |  | ||||||
|   | |||||||
| @@ -5,6 +5,24 @@ import ( | |||||||
| 	"testing" | 	"testing" | ||||||
| ) | ) | ||||||
|  |  | ||||||
|  | func TestFromNilContext(t *testing.T) { | ||||||
|  | 	// nolint: staticcheck | ||||||
|  | 	c, ok := FromContext(nil) | ||||||
|  | 	if ok || c != nil { | ||||||
|  | 		t.Fatal("FromContext not works") | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func TestNewNilContext(t *testing.T) { | ||||||
|  | 	// nolint: staticcheck | ||||||
|  | 	ctx := NewContext(nil, New(0)) | ||||||
|  |  | ||||||
|  | 	c, ok := FromContext(ctx) | ||||||
|  | 	if c == nil || !ok { | ||||||
|  | 		t.Fatal("NewContext not works") | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
| func TestFromContext(t *testing.T) { | func TestFromContext(t *testing.T) { | ||||||
| 	ctx := context.WithValue(context.TODO(), mdKey{}, &rawMetadata{New(0)}) | 	ctx := context.WithValue(context.TODO(), mdKey{}, &rawMetadata{New(0)}) | ||||||
|  |  | ||||||
|   | |||||||
| @@ -76,16 +76,23 @@ func (md Metadata) Get(key string) (string, bool) { | |||||||
| } | } | ||||||
|  |  | ||||||
| // Set is used to store value in metadata | // Set is used to store value in metadata | ||||||
| func (md Metadata) Set(key, val string) { | func (md Metadata) Set(kv ...string) { | ||||||
| 	md[textproto.CanonicalMIMEHeaderKey(key)] = val | 	if len(kv)%2 == 1 { | ||||||
|  | 		kv = kv[:len(kv)-1] | ||||||
|  | 	} | ||||||
|  | 	for idx := 0; idx < len(kv); idx += 2 { | ||||||
|  | 		md[textproto.CanonicalMIMEHeaderKey(kv[idx])] = kv[idx+1] | ||||||
|  | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
| // Del is used to remove value from metadata | // Del is used to remove value from metadata | ||||||
| func (md Metadata) Del(key string) { | func (md Metadata) Del(keys ...string) { | ||||||
| 	// fast path | 	for _, key := range keys { | ||||||
| 	delete(md, key) | 		// fast path | ||||||
| 	// slow path | 		delete(md, key) | ||||||
| 	delete(md, textproto.CanonicalMIMEHeaderKey(key)) | 		// slow path | ||||||
|  | 		delete(md, textproto.CanonicalMIMEHeaderKey(key)) | ||||||
|  | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
| // Copy makes a copy of the metadata | // Copy makes a copy of the metadata | ||||||
| @@ -129,13 +136,6 @@ func Pairs(kv ...string) (Metadata, bool) { | |||||||
| 		return nil, false | 		return nil, false | ||||||
| 	} | 	} | ||||||
| 	md := New(len(kv) / 2) | 	md := New(len(kv) / 2) | ||||||
| 	var k string | 	md.Set(kv...) | ||||||
| 	for i, v := range kv { |  | ||||||
| 		if i%2 == 0 { |  | ||||||
| 			k = v |  | ||||||
| 			continue |  | ||||||
| 		} |  | ||||||
| 		md.Set(k, v) |  | ||||||
| 	} |  | ||||||
| 	return md, true | 	return md, true | ||||||
| } | } | ||||||
|   | |||||||
| @@ -5,6 +5,21 @@ import ( | |||||||
| 	"testing" | 	"testing" | ||||||
| ) | ) | ||||||
|  |  | ||||||
|  | func TestMetadataSetMultiple(t *testing.T) { | ||||||
|  | 	md := New(4) | ||||||
|  | 	md.Set("key1", "val1", "key2", "val2", "key3") | ||||||
|  |  | ||||||
|  | 	if v, ok := md.Get("key1"); !ok || v != "val1" { | ||||||
|  | 		t.Fatalf("invalid kv %#+v", md) | ||||||
|  | 	} | ||||||
|  | 	if v, ok := md.Get("key2"); !ok || v != "val2" { | ||||||
|  | 		t.Fatalf("invalid kv %#+v", md) | ||||||
|  | 	} | ||||||
|  | 	if _, ok := md.Get("key3"); ok { | ||||||
|  | 		t.Fatalf("invalid kv %#+v", md) | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
| func TestAppend(t *testing.T) { | func TestAppend(t *testing.T) { | ||||||
| 	ctx := context.Background() | 	ctx := context.Background() | ||||||
| 	ctx = AppendIncomingContext(ctx, "key1", "val1", "key2", "val2") | 	ctx = AppendIncomingContext(ctx, "key1", "val1", "key2", "val2") | ||||||
|   | |||||||
| @@ -5,6 +5,24 @@ import ( | |||||||
| 	"testing" | 	"testing" | ||||||
| ) | ) | ||||||
|  |  | ||||||
|  | func TestFromNilContext(t *testing.T) { | ||||||
|  | 	// nolint: staticcheck | ||||||
|  | 	c, ok := FromContext(nil) | ||||||
|  | 	if ok || c != nil { | ||||||
|  | 		t.Fatal("FromContext not works") | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func TestNewNilContext(t *testing.T) { | ||||||
|  | 	// nolint: staticcheck | ||||||
|  | 	ctx := NewContext(nil, NewMeter()) | ||||||
|  |  | ||||||
|  | 	c, ok := FromContext(ctx) | ||||||
|  | 	if c == nil || !ok { | ||||||
|  | 		t.Fatal("NewContext not works") | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
| func TestFromContext(t *testing.T) { | func TestFromContext(t *testing.T) { | ||||||
| 	ctx := context.WithValue(context.TODO(), meterKey{}, NewMeter()) | 	ctx := context.WithValue(context.TODO(), meterKey{}, NewMeter()) | ||||||
|  |  | ||||||
|   | |||||||
| @@ -5,6 +5,24 @@ import ( | |||||||
| 	"testing" | 	"testing" | ||||||
| ) | ) | ||||||
|  |  | ||||||
|  | func TestFromNilContext(t *testing.T) { | ||||||
|  | 	// nolint: staticcheck | ||||||
|  | 	c, ok := FromContext(nil) | ||||||
|  | 	if ok || c != nil { | ||||||
|  | 		t.Fatal("FromContext not works") | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func TestNewNilContext(t *testing.T) { | ||||||
|  | 	// nolint: staticcheck | ||||||
|  | 	ctx := NewContext(nil, NewRegister()) | ||||||
|  |  | ||||||
|  | 	c, ok := FromContext(ctx) | ||||||
|  | 	if c == nil || !ok { | ||||||
|  | 		t.Fatal("NewContext not works") | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
| func TestFromContext(t *testing.T) { | func TestFromContext(t *testing.T) { | ||||||
| 	ctx := context.WithValue(context.TODO(), registerKey{}, NewRegister()) | 	ctx := context.WithValue(context.TODO(), registerKey{}, NewRegister()) | ||||||
|  |  | ||||||
|   | |||||||
| @@ -5,6 +5,24 @@ import ( | |||||||
| 	"testing" | 	"testing" | ||||||
| ) | ) | ||||||
|  |  | ||||||
|  | func TestFromNilContext(t *testing.T) { | ||||||
|  | 	// nolint: staticcheck | ||||||
|  | 	c, ok := FromContext(nil) | ||||||
|  | 	if ok || c != nil { | ||||||
|  | 		t.Fatal("FromContext not works") | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func TestNewNilContext(t *testing.T) { | ||||||
|  | 	// nolint: staticcheck | ||||||
|  | 	ctx := NewContext(nil, NewRouter()) | ||||||
|  |  | ||||||
|  | 	c, ok := FromContext(ctx) | ||||||
|  | 	if c == nil || !ok { | ||||||
|  | 		t.Fatal("NewContext not works") | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
| func TestFromContext(t *testing.T) { | func TestFromContext(t *testing.T) { | ||||||
| 	ctx := context.WithValue(context.TODO(), routerKey{}, NewRouter()) | 	ctx := context.WithValue(context.TODO(), routerKey{}, NewRouter()) | ||||||
|  |  | ||||||
|   | |||||||
| @@ -5,6 +5,24 @@ import ( | |||||||
| 	"testing" | 	"testing" | ||||||
| ) | ) | ||||||
|  |  | ||||||
|  | func TestFromNilContext(t *testing.T) { | ||||||
|  | 	// nolint: staticcheck | ||||||
|  | 	c, ok := FromContext(nil) | ||||||
|  | 	if ok || c != nil { | ||||||
|  | 		t.Fatal("FromContext not works") | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func TestNewNilContext(t *testing.T) { | ||||||
|  | 	// nolint: staticcheck | ||||||
|  | 	ctx := NewContext(nil, NewServer()) | ||||||
|  |  | ||||||
|  | 	c, ok := FromContext(ctx) | ||||||
|  | 	if c == nil || !ok { | ||||||
|  | 		t.Fatal("NewContext not works") | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
| func TestFromContext(t *testing.T) { | func TestFromContext(t *testing.T) { | ||||||
| 	ctx := context.WithValue(context.TODO(), serverKey{}, NewServer()) | 	ctx := context.WithValue(context.TODO(), serverKey{}, NewServer()) | ||||||
|  |  | ||||||
|   | |||||||
| @@ -5,6 +5,24 @@ import ( | |||||||
| 	"testing" | 	"testing" | ||||||
| ) | ) | ||||||
|  |  | ||||||
|  | func TestFromNilContext(t *testing.T) { | ||||||
|  | 	// nolint: staticcheck | ||||||
|  | 	c, ok := FromContext(nil) | ||||||
|  | 	if ok || c != nil { | ||||||
|  | 		t.Fatal("FromContext not works") | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func TestNewNilContext(t *testing.T) { | ||||||
|  | 	// nolint: staticcheck | ||||||
|  | 	ctx := NewContext(nil, NewStore()) | ||||||
|  |  | ||||||
|  | 	c, ok := FromContext(ctx) | ||||||
|  | 	if c == nil || !ok { | ||||||
|  | 		t.Fatal("NewContext not works") | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
| func TestFromContext(t *testing.T) { | func TestFromContext(t *testing.T) { | ||||||
| 	ctx := context.WithValue(context.TODO(), storeKey{}, NewStore()) | 	ctx := context.WithValue(context.TODO(), storeKey{}, NewStore()) | ||||||
|  |  | ||||||
|   | |||||||
| @@ -5,6 +5,24 @@ import ( | |||||||
| 	"testing" | 	"testing" | ||||||
| ) | ) | ||||||
|  |  | ||||||
|  | func TestFromNilContext(t *testing.T) { | ||||||
|  | 	// nolint: staticcheck | ||||||
|  | 	c, ok := FromContext(nil) | ||||||
|  | 	if ok || c != nil { | ||||||
|  | 		t.Fatal("FromContext not works") | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func TestNewNilContext(t *testing.T) { | ||||||
|  | 	// nolint: staticcheck | ||||||
|  | 	ctx := NewContext(nil, NewTracer()) | ||||||
|  |  | ||||||
|  | 	c, ok := FromContext(ctx) | ||||||
|  | 	if c == nil || !ok { | ||||||
|  | 		t.Fatal("NewContext not works") | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
| func TestFromContext(t *testing.T) { | func TestFromContext(t *testing.T) { | ||||||
| 	ctx := context.WithValue(context.TODO(), tracerKey{}, NewTracer()) | 	ctx := context.WithValue(context.TODO(), tracerKey{}, NewTracer()) | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user