1
0
mirror of https://github.com/kataras/iris.git synced 2026-01-22 11:25:59 +00:00

add example for hero *sessions.Session dependency which is used on an index route outside of the main package, it is as easy as it shown. Added mostly after the issue: https://github.com/kataras/iris/issues/1057 -- have fun

Former-commit-id: 93338d0e03d6be885edf783c09a2c181568e9ec5
This commit is contained in:
Gerasimos (Makis) Maropoulos
2018-08-07 12:43:51 +03:00
parent 293c29d6e7
commit 55e4cf038e
4 changed files with 173 additions and 0 deletions

View File

@@ -0,0 +1,101 @@
package router
import (
"math/rand"
"strings"
"testing"
"time"
"github.com/kataras/iris/context"
)
//
// randStringBytesMaskImprSrc helps us to generate random paths for the test,
// the below piece of code is external, as an answer to a stackoverflow question.
//
// START.
const letterBytes = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
const (
letterIdxBits = 6 // 6 bits to represent a letter index
letterIdxMask = 1<<letterIdxBits - 1 // All 1-bits, as many as letterIdxBits
letterIdxMax = 63 / letterIdxBits // # of letter indices fitting in 63 bits
)
var src = rand.NewSource(time.Now().UnixNano())
func randStringBytesMaskImprSrc(n int) string {
b := make([]byte, n)
// A src.Int63() generates 63 random bits, enough for letterIdxMax characters!
for i, cache, remain := n-1, src.Int63(), letterIdxMax; i >= 0; {
if remain == 0 {
cache, remain = src.Int63(), letterIdxMax
}
if idx := int(cache & letterIdxMask); idx < len(letterBytes) {
b[i] = letterBytes[idx]
i--
}
cache >>= letterIdxBits
remain--
}
return strings.ToLower(string(b))
}
// END.
func genPaths(routesLength, minCharLength, maxCharLength int) []string {
b := new(strings.Builder)
paths := make([]string, routesLength)
pathStart := '/'
for i := 0; i < routesLength; i++ {
pathSegmentCharsLength := rand.Intn(maxCharLength-minCharLength) + minCharLength
b.WriteRune(pathStart)
b.WriteString(randStringBytesMaskImprSrc(pathSegmentCharsLength))
b.WriteString("/{name:string}/") // sugar.
b.WriteString(randStringBytesMaskImprSrc(pathSegmentCharsLength))
b.WriteString("/{age:int}/end")
paths[i] = b.String()
b.Reset()
}
return paths
}
// Build 1296(=144*9(the available http methods)) routes
// with up to 2*range(15-42)+ 2 named paths lowercase letters
// and 12 request handlers each.
//
// GOCACHE=off && go test -run=XXX -bench=BenchmarkAPIBuilder$ -benchtime=10s
func BenchmarkAPIBuilder(b *testing.B) {
rand.Seed(time.Now().Unix())
noOpHandler := func(ctx context.Context) {}
handlersPerRoute := make(context.Handlers, 12)
for i := 0; i < cap(handlersPerRoute); i++ {
handlersPerRoute[i] = noOpHandler
}
routesLength := 144
// i.e /gzhyweumidvelqewrvoyqmzopvuxli/{name:string}/bibrkratnrrhvsjwsxygfwmqwhcstc/{age:int}/end
paths := genPaths(routesLength, 15, 42)
api := NewAPIBuilder()
requestHandler := NewDefaultHandler()
b.ReportAllocs()
b.ResetTimer()
for i := 0; i < routesLength; i++ {
api.Any(paths[i], handlersPerRoute...)
}
if err := requestHandler.Build(api); err != nil {
b.Fatal(err)
}
b.StopTimer()
b.Logf("%d routes have just builded\n", len(api.GetRoutes()))
}