* api/router/registry: extract path based parameters from url to req * api/handler/rpc: fix empty body request parsing * bundle grpc-gateway util funcs Signed-off-by: Vasiliy Tolstov <v.tolstov@unistack.org>
		
			
				
	
	
		
			123 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			123 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package util
 | |
| 
 | |
| // download from https://raw.githubusercontent.com/grpc-ecosystem/grpc-gateway/master/protoc-gen-grpc-gateway/httprule/compile_test.go
 | |
| 
 | |
| import (
 | |
| 	"reflect"
 | |
| 	"testing"
 | |
| )
 | |
| 
 | |
| const (
 | |
| 	operandFiller = 0
 | |
| )
 | |
| 
 | |
| func TestCompile(t *testing.T) {
 | |
| 	for _, spec := range []struct {
 | |
| 		segs []segment
 | |
| 		verb string
 | |
| 
 | |
| 		ops    []int
 | |
| 		pool   []string
 | |
| 		fields []string
 | |
| 	}{
 | |
| 		{},
 | |
| 		{
 | |
| 			segs: []segment{
 | |
| 				wildcard{},
 | |
| 			},
 | |
| 			ops: []int{int(OpPush), operandFiller},
 | |
| 		},
 | |
| 		{
 | |
| 			segs: []segment{
 | |
| 				deepWildcard{},
 | |
| 			},
 | |
| 			ops: []int{int(OpPushM), operandFiller},
 | |
| 		},
 | |
| 		{
 | |
| 			segs: []segment{
 | |
| 				literal("v1"),
 | |
| 			},
 | |
| 			ops:  []int{int(OpLitPush), 0},
 | |
| 			pool: []string{"v1"},
 | |
| 		},
 | |
| 		{
 | |
| 			segs: []segment{
 | |
| 				literal("v1"),
 | |
| 			},
 | |
| 			verb: "LOCK",
 | |
| 			ops:  []int{int(OpLitPush), 0},
 | |
| 			pool: []string{"v1"},
 | |
| 		},
 | |
| 		{
 | |
| 			segs: []segment{
 | |
| 				variable{
 | |
| 					path: "name.nested",
 | |
| 					segments: []segment{
 | |
| 						wildcard{},
 | |
| 					},
 | |
| 				},
 | |
| 			},
 | |
| 			ops: []int{
 | |
| 				int(OpPush), operandFiller,
 | |
| 				int(OpConcatN), 1,
 | |
| 				int(OpCapture), 0,
 | |
| 			},
 | |
| 			pool:   []string{"name.nested"},
 | |
| 			fields: []string{"name.nested"},
 | |
| 		},
 | |
| 		{
 | |
| 			segs: []segment{
 | |
| 				literal("obj"),
 | |
| 				variable{
 | |
| 					path: "name.nested",
 | |
| 					segments: []segment{
 | |
| 						literal("a"),
 | |
| 						wildcard{},
 | |
| 						literal("b"),
 | |
| 					},
 | |
| 				},
 | |
| 				variable{
 | |
| 					path: "obj",
 | |
| 					segments: []segment{
 | |
| 						deepWildcard{},
 | |
| 					},
 | |
| 				},
 | |
| 			},
 | |
| 			ops: []int{
 | |
| 				int(OpLitPush), 0,
 | |
| 				int(OpLitPush), 1,
 | |
| 				int(OpPush), operandFiller,
 | |
| 				int(OpLitPush), 2,
 | |
| 				int(OpConcatN), 3,
 | |
| 				int(OpCapture), 3,
 | |
| 				int(OpPushM), operandFiller,
 | |
| 				int(OpConcatN), 1,
 | |
| 				int(OpCapture), 0,
 | |
| 			},
 | |
| 			pool:   []string{"obj", "a", "b", "name.nested"},
 | |
| 			fields: []string{"name.nested", "obj"},
 | |
| 		},
 | |
| 	} {
 | |
| 		tmpl := template{
 | |
| 			segments: spec.segs,
 | |
| 			verb:     spec.verb,
 | |
| 		}
 | |
| 		compiled := tmpl.Compile()
 | |
| 		if got, want := compiled.Version, opcodeVersion; got != want {
 | |
| 			t.Errorf("tmpl.Compile().Version = %d; want %d; segs=%#v, verb=%q", got, want, spec.segs, spec.verb)
 | |
| 		}
 | |
| 		if got, want := compiled.OpCodes, spec.ops; !reflect.DeepEqual(got, want) {
 | |
| 			t.Errorf("tmpl.Compile().OpCodes = %v; want %v; segs=%#v, verb=%q", got, want, spec.segs, spec.verb)
 | |
| 		}
 | |
| 		if got, want := compiled.Pool, spec.pool; !reflect.DeepEqual(got, want) {
 | |
| 			t.Errorf("tmpl.Compile().Pool = %q; want %q; segs=%#v, verb=%q", got, want, spec.segs, spec.verb)
 | |
| 		}
 | |
| 		if got, want := compiled.Verb, spec.verb; got != want {
 | |
| 			t.Errorf("tmpl.Compile().Verb = %q; want %q; segs=%#v, verb=%q", got, want, spec.segs, spec.verb)
 | |
| 		}
 | |
| 		if got, want := compiled.Fields, spec.fields; !reflect.DeepEqual(got, want) {
 | |
| 			t.Errorf("tmpl.Compile().Fields = %q; want %q; segs=%#v, verb=%q", got, want, spec.segs, spec.verb)
 | |
| 		}
 | |
| 	}
 | |
| }
 |