123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294 |
- package permit
- import (
- "context"
- "net/http"
- "net/url"
- "sync"
- "testing"
- "time"
- "go-common/library/cache/memcache"
- "go-common/library/container/pool"
- "go-common/library/ecode"
- "go-common/library/log"
- bm "go-common/library/net/http/blademaster"
- "go-common/library/net/netutil/breaker"
- xtime "go-common/library/time"
- )
- var (
- once sync.Once
- )
- type Response struct {
- Code int `json:"code"`
- Data string `json:"data"`
- }
- func init() {
- log.Init(nil)
- }
- func client() *bm.Client {
- return bm.NewClient(&bm.ClientConfig{
- App: &bm.App{
- Key: "test",
- Secret: "test",
- },
- Dial: xtime.Duration(time.Second),
- Timeout: xtime.Duration(time.Second),
- KeepAlive: xtime.Duration(time.Second * 10),
- Breaker: &breaker.Config{
- Window: xtime.Duration(time.Second),
- Sleep: xtime.Duration(time.Millisecond * 100),
- Bucket: 10,
- Ratio: 0.5,
- Request: 100,
- },
- })
- }
- func getPermit() *Permit {
- return New(&Config{
- DsHTTPClient: &bm.ClientConfig{
- App: &bm.App{
- Key: "manager-go",
- Secret: "949bbb2dd3178252638c2407578bc7ad",
- },
- Dial: xtime.Duration(time.Second),
- Timeout: xtime.Duration(time.Second),
- KeepAlive: xtime.Duration(time.Second * 10),
- Breaker: &breaker.Config{
- Window: xtime.Duration(time.Second),
- Sleep: xtime.Duration(time.Millisecond * 100),
- Bucket: 10,
- Ratio: 0.5,
- Request: 100,
- },
- },
- MaHTTPClient: &bm.ClientConfig{
- App: &bm.App{
- Key: "f6433799dbd88751",
- Secret: "36f8ddb1806207fe07013ab6a77a3935",
- },
- Dial: xtime.Duration(time.Second),
- Timeout: xtime.Duration(time.Second),
- KeepAlive: xtime.Duration(time.Second * 10),
- Breaker: &breaker.Config{
- Window: xtime.Duration(time.Second),
- Sleep: xtime.Duration(time.Millisecond * 100),
- Bucket: 10,
- Ratio: 0.5,
- Request: 100,
- },
- },
- Session: &SessionConfig{
- SessionIDLength: 32,
- CookieLifeTime: 1800,
- CookieName: "mng-go",
- Domain: ".bilibili.co",
- Memcache: &memcache.Config{
- Config: &pool.Config{
- Active: 10,
- Idle: 5,
- IdleTimeout: xtime.Duration(time.Second * 80),
- },
- Name: "go-business/auth",
- Proto: "tcp",
- Addr: "172.16.33.54:11211",
- DialTimeout: xtime.Duration(time.Millisecond * 1000),
- ReadTimeout: xtime.Duration(time.Millisecond * 1000),
- WriteTimeout: xtime.Duration(time.Millisecond * 1000),
- },
- },
- ManagerHost: "http://uat-manager.bilibili.co",
- DashboardHost: "http://dashboard-mng.bilibili.co",
- DashboardCaller: "manager-go",
- })
- }
- func engine() *bm.Engine {
- e := bm.NewServer(nil)
- a := getPermit()
- e.GET("/login", a.Verify(), func(c *bm.Context) {
- c.JSON("pass", nil)
- })
- e.GET("/tag/del", a.Permit("TAG_DEL"), func(c *bm.Context) {
- c.JSON("pass", nil)
- })
- e.GET("/tag/admin", a.Permit("TAG_ADMIN"), func(c *bm.Context) {
- c.JSON("pass", nil)
- })
- return e
- }
- func setSession(uid int64, username string) (string, error) {
- a := getPermit()
- sv := a.sm.newSession(context.TODO())
- sv.Set("username", username)
- mcConn := a.sm.mc.Get(context.TODO())
- defer mcConn.Close()
- key := sv.Sid
- item := &memcache.Item{
- Key: key,
- Object: sv,
- Flags: memcache.FlagJSON,
- Expiration: int32(a.sm.c.CookieLifeTime),
- }
- if err := mcConn.Set(item); err != nil {
- return "", err
- }
- return key, nil
- }
- func startEngine(t *testing.T) func() {
- return func() {
- e := engine()
- err := e.Run(":18080")
- if err != nil {
- t.Fatalf("failed to run server!%v", err)
- }
- }
- }
- func TestLoginSuccess(t *testing.T) {
- go once.Do(startEngine(t))
- time.Sleep(time.Millisecond * 100)
- sid, err := setSession(2233, "caoguoliang")
- if err != nil {
- t.Fatalf("faild to set session !err:=%v", err)
- }
- query := url.Values{}
- query.Set("test", "test")
- cli := client()
- req, err := cli.NewRequest("GET", "http://127.0.0.1:18080/login", "", query)
- if err != nil {
- t.Fatalf("Failed to build request: %v", err)
- }
- req.AddCookie(&http.Cookie{
- Name: "mng-go",
- Value: sid,
- })
- req.AddCookie(&http.Cookie{
- Name: "username",
- Value: "caoguoliang",
- })
- req.AddCookie(&http.Cookie{
- Name: "_AJSESSIONID",
- Value: "87fa8450e93511e79ed8522233007f8a",
- })
- res := Response{}
- if err := cli.Do(context.TODO(), req, &res); err != nil {
- t.Fatalf("Failed to send request: %v", err)
- }
- if res.Code != 0 || res.Data != "pass" {
- t.Fatalf("Unexpected response code(%d) data(%v)", res.Code, res.Data)
- }
- }
- func TestLoginFail(t *testing.T) {
- go once.Do(startEngine(t))
- time.Sleep(time.Millisecond * 100)
- query := url.Values{}
- query.Set("test", "test")
- cli := client()
- req, err := cli.NewRequest("GET", "http://127.0.0.1:18080/login", "", query)
- if err != nil {
- t.Fatalf("Failed to build request: %v", err)
- }
- req.AddCookie(&http.Cookie{
- Name: "mng-go",
- Value: "fakesess",
- })
- req.AddCookie(&http.Cookie{
- Name: "username",
- Value: "caoguoliang",
- })
- req.AddCookie(&http.Cookie{
- Name: "_AJSESSIONID",
- Value: "testsess",
- })
- res := Response{}
- if err := cli.Do(context.TODO(), req, &res); err != nil {
- t.Fatalf("Failed to send request: %v", err)
- }
- if res.Code != ecode.Unauthorized.Code() {
- t.Fatalf("This request should be forbidden: code(%d) data(%v)", res.Code, res.Data)
- }
- }
- func TestVerifySuccess(t *testing.T) {
- go once.Do(startEngine(t))
- time.Sleep(time.Millisecond * 100)
- sid, err := setSession(2233, "caoguoliang")
- if err != nil {
- t.Fatalf("faild to set session !err:=%v", err)
- }
- query := url.Values{}
- query.Set("test", "test")
- cli := client()
- req, err := cli.NewRequest("GET", "http://127.0.0.1:18080/tag/del", "", query)
- if err != nil {
- t.Fatalf("Failed to build request: %v", err)
- }
- req.AddCookie(&http.Cookie{
- Name: "mng-go",
- Value: sid,
- })
- req.AddCookie(&http.Cookie{
- Name: "username",
- Value: "caoguoliang",
- })
- req.AddCookie(&http.Cookie{
- Name: "_AJSESSIONID",
- Value: "87fa8450e93511e79ed8522233007f8a",
- })
- res := Response{}
- if err := cli.Do(context.TODO(), req, &res); err != nil {
- t.Fatalf("Failed to send request: %v", err)
- }
- if res.Code != 0 || res.Data != "pass" {
- t.Fatalf("Unexpected response code(%d) data(%v)", res.Code, res.Data)
- }
- }
- func TestVerifyFail(t *testing.T) {
- go once.Do(startEngine(t))
- time.Sleep(time.Millisecond * 100)
- sid, err := setSession(2233, "caoguoliang")
- if err != nil {
- t.Fatalf("faild to set session !err:=%v", err)
- }
- query := url.Values{}
- query.Set("test", "test")
- cli := client()
- req, err := cli.NewRequest("GET", "http://127.0.0.1:18080/tag/admin", "", query)
- if err != nil {
- t.Fatalf("Failed to build request: %v", err)
- }
- req.AddCookie(&http.Cookie{
- Name: "mng-go",
- Value: sid,
- })
- req.AddCookie(&http.Cookie{
- Name: "username",
- Value: "caoguoliang",
- })
- req.AddCookie(&http.Cookie{
- Name: "_AJSESSIONID",
- Value: "87fa8450e93511e79ed8522233007f8a",
- })
- res := Response{}
- if err := cli.Do(context.TODO(), req, &res); err != nil {
- t.Fatalf("Failed to send request: %v", err)
- }
- if res.Code != ecode.AccessDenied.Code() {
- t.Fatalf("This request should be forbidden: code(%d) data(%v)", res.Code, res.Data)
- }
- }
|