E2E tests done

This commit is contained in:
DarkGopher 2025-06-08 21:24:21 +02:00
parent e7c9034d2c
commit 23a192635e
4 changed files with 32 additions and 22 deletions

View file

@ -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 != "" {

View file

@ -1,5 +0,0 @@
package session
func init() {
milis = 1
}

View file

@ -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()

View file

@ -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)
} }