From 23a192635e3d0edf9591f2156d71d8b52216f3ce Mon Sep 17 00:00:00 2001 From: DarkGopher Date: Sun, 8 Jun 2025 21:24:21 +0200 Subject: [PATCH] E2E tests done --- session.go | 18 ++++++++++++++++-- session_test.go | 5 ----- storage/memory/memory.go | 8 ++++++++ tests/t_test.go | 23 ++++++++--------------- 4 files changed, 32 insertions(+), 22 deletions(-) delete mode 100644 session_test.go diff --git a/session.go b/session.go index cd22674..f38aa02 100644 --- a/session.go +++ b/session.go @@ -8,11 +8,18 @@ import ( "io" "net/http" "net/url" + "testing" "time" ) var milis int64 = 1000 +func init() { + if testing.Testing() { + milis = 1 + } +} + // for provider fun var provides = make(map[string]Provider) @@ -38,7 +45,7 @@ type Session interface { Get(key interface{}) (v any, err error) //delete session value Delete(key interface{}) error - //get session id for session + //get session id SessionID() string } @@ -46,6 +53,8 @@ type Session interface { type Provider interface { //create new session using sid value 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(sid string) (Session, error) //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, maxlifetime: maxlifetime, secure: ssl, } - m.GC() + go m.GC() return m, nil } @@ -144,6 +153,11 @@ func (manager *Manager) SessionDestroy(w http.ResponseWriter, r *http.Request) ( 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 func (manager *Manager) RegenerateID(w http.ResponseWriter, r *http.Request) { if ck, err := r.Cookie(manager.cookieName); err == nil && ck.Value != "" { diff --git a/session_test.go b/session_test.go deleted file mode 100644 index d9252dc..0000000 --- a/session_test.go +++ /dev/null @@ -1,5 +0,0 @@ -package session - -func init() { - milis = 1 -} diff --git a/storage/memory/memory.go b/storage/memory/memory.go index 9eac2ad..e14ab9f 100644 --- a/storage/memory/memory.go +++ b/storage/memory/memory.go @@ -84,6 +84,14 @@ func (pder *ProviderMemory) Init(sid string) (ses session.Session, err error) { 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 func (pder *ProviderMemory) Read(sid string) (ses session.Session, err error) { pder.lock.Lock() diff --git a/tests/t_test.go b/tests/t_test.go index 231c7bf..98b8ecb 100644 --- a/tests/t_test.go +++ b/tests/t_test.go @@ -46,7 +46,6 @@ func (ts *TestServer) Serve() { mux.HandleFunc("/deletesessionvar", ts.deleteSessionValue) mux.HandleFunc("/validatedeletedvar", ts.validateDeletedValue) mux.HandleFunc("/sessionGC", ts.sessionGC) //ck - mux.HandleFunc("/", ts.root) testserver = httptest.NewUnstartedServer(mux) testserver.EnableHTTP2 = true 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) { + var ses session.Session 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()) + return } time.Sleep(200 * time.Millisecond) - io.WriteString(w, "OK") -} - -func (ts *TestServer) root(w http.ResponseWriter, r *http.Request) { - if r.Header.Get("Cookie") != "" { - io.WriteString(w, fmt.Sprintf("Cookie send after end session: %v", r.Header.Get("Cookie"))) + if sm.Exists(ses.SessionID()) { + io.WriteString(w, fmt.Sprintf("Session id: %s must not exists in storage after GC", + ses.SessionID())) + return } 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 func TestRunAll(t *testing.T) { ts := &TestServer{} @@ -297,7 +290,7 @@ func TestRunAll(t *testing.T) { if sm, err = session.NewManager(pn, sid, lifet, true); err != nil { 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 { t.Run(fmt.Sprintf("Test%d", idx+1), fn) }