E2E tests done
This commit is contained in:
parent
e7c9034d2c
commit
23a192635e
4 changed files with 32 additions and 22 deletions
18
session.go
18
session.go
|
@ -8,11 +8,18 @@ import (
|
||||||
"io"
|
"io"
|
||||||
"net/http"
|
"net/http"
|
||||||
"net/url"
|
"net/url"
|
||||||
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
var milis int64 = 1000
|
var milis int64 = 1000
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
if testing.Testing() {
|
||||||
|
milis = 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// for provider fun
|
// for provider fun
|
||||||
var provides = make(map[string]Provider)
|
var provides = make(map[string]Provider)
|
||||||
|
|
||||||
|
@ -38,7 +45,7 @@ type Session interface {
|
||||||
Get(key interface{}) (v any, err error)
|
Get(key interface{}) (v any, err error)
|
||||||
//delete session value
|
//delete session value
|
||||||
Delete(key interface{}) error
|
Delete(key interface{}) error
|
||||||
//get session id for session
|
//get session id
|
||||||
SessionID() string
|
SessionID() string
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -46,6 +53,8 @@ type Session interface {
|
||||||
type Provider interface {
|
type Provider interface {
|
||||||
//create new session using sid value
|
//create new session using sid value
|
||||||
Init(sid string) (Session, error)
|
Init(sid string) (Session, error)
|
||||||
|
//Exists return true if session with sid exist
|
||||||
|
Exists(sid string) bool
|
||||||
//read return existing session by id or if not exist create new session
|
//read return existing session by id or if not exist create new session
|
||||||
Read(sid string) (Session, error)
|
Read(sid string) (Session, error)
|
||||||
//destroy remove session with sid from storage if exist
|
//destroy remove session with sid from storage if exist
|
||||||
|
@ -87,7 +96,7 @@ func NewManager(providerName, cookieName string, maxlifetime int64, ssl bool) (*
|
||||||
cookieName: cookieName, provider: provider,
|
cookieName: cookieName, provider: provider,
|
||||||
maxlifetime: maxlifetime, secure: ssl,
|
maxlifetime: maxlifetime, secure: ssl,
|
||||||
}
|
}
|
||||||
m.GC()
|
go m.GC()
|
||||||
return m, nil
|
return m, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -144,6 +153,11 @@ func (manager *Manager) SessionDestroy(w http.ResponseWriter, r *http.Request) (
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Exists return true if session with sid exists on server
|
||||||
|
func (manager *Manager) Exists(sid string) bool {
|
||||||
|
return manager.provider.Exists(sid)
|
||||||
|
}
|
||||||
|
|
||||||
// RegenerateID vhange sid and preserve all session data
|
// RegenerateID vhange sid and preserve all session data
|
||||||
func (manager *Manager) RegenerateID(w http.ResponseWriter, r *http.Request) {
|
func (manager *Manager) RegenerateID(w http.ResponseWriter, r *http.Request) {
|
||||||
if ck, err := r.Cookie(manager.cookieName); err == nil && ck.Value != "" {
|
if ck, err := r.Cookie(manager.cookieName); err == nil && ck.Value != "" {
|
||||||
|
|
|
@ -1,5 +0,0 @@
|
||||||
package session
|
|
||||||
|
|
||||||
func init() {
|
|
||||||
milis = 1
|
|
||||||
}
|
|
|
@ -84,6 +84,14 @@ func (pder *ProviderMemory) Init(sid string) (ses session.Session, err error) {
|
||||||
return sess, nil
|
return sess, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Exists return true if session with sid exists
|
||||||
|
func (pder *ProviderMemory) Exists(sid string) (ex bool) {
|
||||||
|
if _, ex := pder.sessions[sid]; ex {
|
||||||
|
return ex
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
// read return existing unexpired session or create new
|
// read return existing unexpired session or create new
|
||||||
func (pder *ProviderMemory) Read(sid string) (ses session.Session, err error) {
|
func (pder *ProviderMemory) Read(sid string) (ses session.Session, err error) {
|
||||||
pder.lock.Lock()
|
pder.lock.Lock()
|
||||||
|
|
|
@ -46,7 +46,6 @@ func (ts *TestServer) Serve() {
|
||||||
mux.HandleFunc("/deletesessionvar", ts.deleteSessionValue)
|
mux.HandleFunc("/deletesessionvar", ts.deleteSessionValue)
|
||||||
mux.HandleFunc("/validatedeletedvar", ts.validateDeletedValue)
|
mux.HandleFunc("/validatedeletedvar", ts.validateDeletedValue)
|
||||||
mux.HandleFunc("/sessionGC", ts.sessionGC) //ck
|
mux.HandleFunc("/sessionGC", ts.sessionGC) //ck
|
||||||
mux.HandleFunc("/", ts.root)
|
|
||||||
testserver = httptest.NewUnstartedServer(mux)
|
testserver = httptest.NewUnstartedServer(mux)
|
||||||
testserver.EnableHTTP2 = true
|
testserver.EnableHTTP2 = true
|
||||||
testserver.StartTLS()
|
testserver.StartTLS()
|
||||||
|
@ -176,17 +175,17 @@ func (ts *TestServer) validateDeletedValue(w http.ResponseWriter, r *http.Reques
|
||||||
}
|
}
|
||||||
|
|
||||||
func (ts *TestServer) sessionGC(w http.ResponseWriter, r *http.Request) {
|
func (ts *TestServer) sessionGC(w http.ResponseWriter, r *http.Request) {
|
||||||
|
var ses session.Session
|
||||||
var err error
|
var err error
|
||||||
if _, err = sm.SessionStart(w, r); err != nil {
|
if ses, err = sm.SessionStart(w, r); err != nil {
|
||||||
io.WriteString(w, err.Error())
|
io.WriteString(w, err.Error())
|
||||||
|
return
|
||||||
}
|
}
|
||||||
time.Sleep(200 * time.Millisecond)
|
time.Sleep(200 * time.Millisecond)
|
||||||
io.WriteString(w, "OK")
|
if sm.Exists(ses.SessionID()) {
|
||||||
}
|
io.WriteString(w, fmt.Sprintf("Session id: %s must not exists in storage after GC",
|
||||||
|
ses.SessionID()))
|
||||||
func (ts *TestServer) root(w http.ResponseWriter, r *http.Request) {
|
return
|
||||||
if r.Header.Get("Cookie") != "" {
|
|
||||||
io.WriteString(w, fmt.Sprintf("Cookie send after end session: %v", r.Header.Get("Cookie")))
|
|
||||||
}
|
}
|
||||||
io.WriteString(w, "OK")
|
io.WriteString(w, "OK")
|
||||||
}
|
}
|
||||||
|
@ -279,12 +278,6 @@ func t9(t *testing.T) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func t10(t *testing.T) {
|
|
||||||
if err := CheckRequestOK("/"); err != nil {
|
|
||||||
t.Error(err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// iterate all session storage impls. and run t1 - t7
|
// iterate all session storage impls. and run t1 - t7
|
||||||
func TestRunAll(t *testing.T) {
|
func TestRunAll(t *testing.T) {
|
||||||
ts := &TestServer{}
|
ts := &TestServer{}
|
||||||
|
@ -297,7 +290,7 @@ func TestRunAll(t *testing.T) {
|
||||||
if sm, err = session.NewManager(pn, sid, lifet, true); err != nil {
|
if sm, err = session.NewManager(pn, sid, lifet, true); err != nil {
|
||||||
t.Errorf("Session provider %s failed initialize err: %v", pn, err)
|
t.Errorf("Session provider %s failed initialize err: %v", pn, err)
|
||||||
}
|
}
|
||||||
fns := []func(t *testing.T){t1, t2, t3, t4, t5, t6, t7, t8, t9, t10}
|
fns := []func(t *testing.T){t1, t2, t3, t4, t5, t6, t7, t8, t9}
|
||||||
for idx, fn := range fns {
|
for idx, fn := range fns {
|
||||||
t.Run(fmt.Sprintf("Test%d", idx+1), fn)
|
t.Run(fmt.Sprintf("Test%d", idx+1), fn)
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue