59 lines
1.7 KiB
Go
59 lines
1.7 KiB
Go
package app_test
|
|
|
|
import (
|
|
"bytes"
|
|
"context"
|
|
"net/http/httptest"
|
|
"strings"
|
|
"testing"
|
|
|
|
omni "git.yuntuo.hk/k2safe/go-omni"
|
|
"git.yuntuo.hk/k2safe/go-omni/httpx"
|
|
"git.yuntuo.hk/k2safe/go-omni/logx"
|
|
)
|
|
|
|
func TestAppLogAndRequestMetadataIsolation(t *testing.T) {
|
|
var a, b bytes.Buffer
|
|
la, _ := logx.New(logx.Config{Writer: &a})
|
|
lb, _ := logx.New(logx.Config{Writer: &b})
|
|
apps := []*omni.App{
|
|
omni.New(omni.WithLogger(true), omni.WithLogInstance(la), omni.WithTrustedProxies("127.0.0.1/32")),
|
|
omni.New(omni.WithLogger(true), omni.WithLogInstance(lb)),
|
|
}
|
|
for i, app := range apps {
|
|
app.GET("/probe/:id", func(c *httpx.Context) error {
|
|
ctx := c.Context()
|
|
meta := httpx.Metadata(ctx)
|
|
expected := "127.0.0.1"
|
|
if i == 0 {
|
|
expected = "203.0.113.7"
|
|
}
|
|
if meta.ClientIP != expected || meta.Route != "/probe/:id" || meta.Method != "GET" {
|
|
t.Error(meta)
|
|
}
|
|
logx.InfoContext(ctx, "business", "app", i)
|
|
clone := c.Clone(context.WithValue(ctx, struct{}{}, true), httptest.NewRecorder())
|
|
if httpx.Metadata(clone.Context()) != meta {
|
|
t.Error("metadata lost")
|
|
}
|
|
return c.OK(nil)
|
|
})
|
|
}
|
|
for _, app := range apps {
|
|
r := httptest.NewRequest("GET", "/probe/42", nil)
|
|
r.RemoteAddr = "127.0.0.1:1234"
|
|
r.Header.Set("X-Forwarded-For", "203.0.113.7")
|
|
app.ServeHTTP(httptest.NewRecorder(), r)
|
|
}
|
|
for i, out := range []string{a.String(), b.String()} {
|
|
if !strings.Contains(out, "http.request") || !strings.Contains(out, "business") || strings.Contains(out, `"app":`+string(rune('0'+(1-i)))) {
|
|
t.Fatal(out)
|
|
}
|
|
}
|
|
_ = apps[0].Close()
|
|
lb.Info("still open")
|
|
if !strings.Contains(b.String(), "still open") {
|
|
t.Fatal("borrowed logger closed")
|
|
}
|
|
}
|