This commit is contained in:
Hank Shen 2021-05-19 12:00:05 +08:00
parent 451e03c30f
commit 6180d20b97
4 changed files with 84 additions and 58 deletions

2
.gitignore vendored
View file

@ -24,3 +24,5 @@ _testmain.go
*.db
*.out
go.mod
go.sum

View file

@ -9,13 +9,7 @@ import (
func TestConfig_setDefault(t *testing.T) {
config := Config{}
config.setDefault()
if config.SessionOptions.Path != shared.DefaultPath {
t.Errorf("config.SessionOptions.Path should be %s (actual: %s)", shared.DefaultPath, config.SessionOptions.Path)
}
if config.SessionOptions.MaxAge != shared.DefaultMaxAge {
t.Errorf("config.SessionOptions.MaxAge should be %s (actual: %s)", shared.DefaultMaxAge, config.SessionOptions.MaxAge)
}
if string(config.DBOptions.BucketName) != shared.DefaultBucketName {
t.Errorf("config.SessionOptions.BucketName should be %+v (actual: %+v)", shared.DefaultBucketName, config.DBOptions.BucketName)
t.Errorf("config.SessionOptions.BucketName should be %+v (actual: %+v)", shared.DefaultBucketName, string(config.DBOptions.BucketName))
}
}

View file

@ -55,7 +55,7 @@ func (s *Store) Reload(ctx echo.Context, session *sessions.Session) error {
// Save adds a single session to the response.
func (s *Store) Save(ctx echo.Context, session *sessions.Session) error {
if ctx.CookieOptions().MaxAge < 0 {
s.Remove(session.ID)
s.delete(session)
sessions.SetCookie(ctx, session.Name(), "")
} else {
// Build an alphanumeric ID.
@ -112,6 +112,11 @@ func (s *Store) Remove(sessionID string) error {
})
}
// delete removes the key-value from the database.
func (s *Store) delete(session *sessions.Session) error {
return s.Remove(session.ID)
}
// save stores the session data in the database.
func (s *Store) save(ctx echo.Context, session *sessions.Session) error {
var buf bytes.Buffer

View file

@ -10,11 +10,14 @@ import (
"time"
"github.com/gogo/protobuf/proto"
"github.com/webx-top/echo"
"github.com/webx-top/echo/defaults"
"github.com/webx-top/echo/engine/mock"
"github.com/admpub/boltstore/shared"
"github.com/admpub/securecookie"
"github.com/admpub/sessions"
"github.com/boltdb/bolt"
"github.com/gorilla/securecookie"
)
var benchmarkDB = fmt.Sprintf("benchmark_store_%d.db", time.Now().Unix())
@ -83,6 +86,8 @@ func TestStore_Get(t *testing.T) {
if err != nil {
t.Error(err)
}
w := httptest.NewRecorder()
ctx := echo.NewContext(mock.NewRequest(req), mock.NewResponse(w), defaults.Default)
str, err := New(
db,
@ -93,7 +98,7 @@ func TestStore_Get(t *testing.T) {
t.Error(err)
}
session, err := str.Get(req, "test")
session, err := str.Get(ctx, "test")
if err != nil {
t.Error(err)
}
@ -123,14 +128,15 @@ func TestStore_New(t *testing.T) {
if err != nil {
t.Error(err)
}
w := httptest.NewRecorder()
ctx := echo.NewContext(mock.NewRequest(req), mock.NewResponse(w), defaults.Default)
ctx.SessionOptions().MaxAge = 1024
encoded, err := securecookie.EncodeMulti("test", "1", str.codecs...)
req.AddCookie(sessions.NewCookie("test", encoded, &sessions.Options{
MaxAge: 1024,
}))
req.AddCookie(sessions.NewCookie(ctx, "test", encoded))
session, err := str.New(req, "test")
session, err := str.New(ctx, "test")
if err != nil {
t.Error(err)
}
@ -141,7 +147,7 @@ func TestStore_New(t *testing.T) {
}
func TestStore_Save(t *testing.T) {
// When session.Options.MaxAge < 0
// When ctx.SessionOptions().MaxAge < 0
db, err := bolt.Open("./sessions.db", 0666, nil)
if err != nil {
t.Error(err)
@ -161,47 +167,48 @@ func TestStore_Save(t *testing.T) {
if err != nil {
t.Error(err)
}
session, err := str.Get(req, "test")
if err != nil {
t.Error(err)
}
session.Options.MaxAge = -1
w := httptest.NewRecorder()
if err := str.Save(req, w, session); err != nil {
t.Error(err)
}
ctx := echo.NewContext(mock.NewRequest(req), mock.NewResponse(w), defaults.Default)
// When session.Options.MaxAge >= 0
session, err = str.Get(req, "test")
session, err := str.Get(ctx, "test")
if err != nil {
t.Error(err)
}
session.Options.MaxAge = 1
ctx.SessionOptions().MaxAge = -1
if err := str.Save(ctx, session); err != nil {
t.Error(err)
}
// When ctx.SessionOptions().MaxAge >= 0
session, err = str.Get(ctx, "test")
if err != nil {
t.Error(err)
}
ctx.SessionOptions().MaxAge = 1
w = httptest.NewRecorder()
if err := str.Save(req, w, session); err != nil {
if err := str.Save(ctx, session); err != nil {
t.Error(err)
}
// When session.Options.MaxAge >= 0 and
// When ctx.SessionOptions().MaxAge >= 0 and
// s.save returns an error
session.Values = make(map[interface{}]interface{})
session.Values[make(chan int)] = make(chan int)
if err := str.Save(req, w, session); err == nil || err.Error() != "gob: type not registered for interface: chan int" {
if err := str.Save(ctx, session); err == nil || err.Error() != "gob: type not registered for interface: chan int" {
t.Errorf(`str.Save should return an error "%s" (actual: %+v)`, "gob: type not registered for interface: chan int", err)
}
// When session.Options.MaxAge >= 0 and
// When ctx.SessionOptions().MaxAge >= 0 and
// securecookie.EncodeMulti returns an error
session.Values = make(map[interface{}]interface{})
str.codecs = nil
if err := str.Save(req, w, session); err == nil || err.Error() != "securecookie: no codecs provided" {
if err := str.Save(ctx, session); err == nil || err.Error() != "securecookie: no codecs provided" {
t.Errorf(`str.Save should return an error "%s" (actual: %+v)`, "securecookie: no codecs provided", err)
}
}
@ -227,14 +234,15 @@ func TestStore_load(t *testing.T) {
t.Error(err)
}
session, err := str.Get(req, "test")
w := httptest.NewRecorder()
ctx := echo.NewContext(mock.NewRequest(req), mock.NewResponse(w), defaults.Default)
session, err := str.Get(ctx, "test")
if err != nil {
t.Error(err)
}
w := httptest.NewRecorder()
if err := str.Save(req, w, session); err != nil {
if err := str.Save(ctx, session); err != nil {
t.Error(err)
}
@ -271,12 +279,12 @@ func TestStore_load(t *testing.T) {
}
// When the target session data is expired
session, err = str.Get(req, "test")
session, err = str.Get(ctx, "test")
if err != nil {
t.Error(err)
}
session.Options.MaxAge = 0
if err := str.Save(req, w, session); err != nil {
ctx.SessionOptions().MaxAge = 0
if err := str.Save(ctx, session); err != nil {
t.Error(err)
}
@ -308,7 +316,10 @@ func TestSession_delete(t *testing.T) {
t.Error(err)
}
session, err := str.Get(req, "test")
w := httptest.NewRecorder()
ctx := echo.NewContext(mock.NewRequest(req), mock.NewResponse(w), defaults.Default)
session, err := str.Get(ctx, "test")
if err != nil {
t.Error(err)
}
@ -318,7 +329,7 @@ func TestSession_delete(t *testing.T) {
err = str.delete(session)
if err.Error() != "database not open" {
t.Error(`str.delete should return an error "%s" (actual: %s)`, "database not open", err)
t.Errorf(`str.delete should return an error "%s" (actual: %s)`, "database not open", err)
}
}
@ -336,7 +347,7 @@ func TestNew(t *testing.T) {
[]byte("secret-key"),
)
if err.Error() != "database not open" {
t.Error(`str.delete should return an error "%s" (actual: %s)`, "database not open", err)
t.Errorf(`str.delete should return an error "%s" (actual: %s)`, "database not open", err)
}
}
@ -352,9 +363,11 @@ func ExampleStore_Get() {
if err != nil {
panic(err)
}
w := httptest.NewRecorder()
ctx := echo.NewContext(mock.NewRequest(r), mock.NewResponse(w), defaults.Default)
// Get a session.
session, err := str.Get(r, "session-key")
session, err := str.Get(ctx, "session-key")
if err != nil {
panic(err)
}
@ -375,9 +388,11 @@ func ExampleStore_New() {
if err != nil {
panic(err)
}
w := httptest.NewRecorder()
ctx := echo.NewContext(mock.NewRequest(r), mock.NewResponse(w), defaults.Default)
// Create a session.
session, err := str.New(r, "session-key")
session, err := str.New(ctx, "session-key")
if err != nil {
panic(err)
}
@ -402,8 +417,10 @@ func ExampleStore_Save() {
panic(err)
}
ctx := echo.NewContext(mock.NewRequest(r), mock.NewResponse(w), defaults.Default)
// Create a session.
session, err := str.New(r, "session-key")
session, err := str.New(ctx, "session-key")
if err != nil {
panic(err)
}
@ -412,14 +429,14 @@ func ExampleStore_Save() {
session.Values["foo"] = "bar"
// Save the session.
if err := sessions.Save(r, w); err != nil {
if err := sessions.Save(ctx); err != nil {
panic(err)
}
// You can delete the session by setting the session options's MaxAge
// to a minus value.
session.Options.MaxAge = -1
if err := sessions.Save(r, w); err != nil {
ctx.SessionOptions().MaxAge = -1
if err := sessions.Save(ctx); err != nil {
panic(err)
}
}
@ -436,9 +453,11 @@ func ExampleNew() {
if err != nil {
panic(err)
}
w := httptest.NewRecorder()
ctx := echo.NewContext(mock.NewRequest(r), mock.NewResponse(w), defaults.Default)
// Get a session.
session, err := str.Get(r, "session-key")
session, err := str.Get(ctx, "session-key")
if err != nil {
panic(err)
}
@ -488,9 +507,11 @@ func BenchmarkStore_Get(b *testing.B) {
if err != nil {
b.Error(err)
}
w := httptest.NewRecorder()
ctx := echo.NewContext(mock.NewRequest(req), mock.NewResponse(w), defaults.Default)
for i := 0; i < b.N; i++ {
_, err := str.Get(req, "test")
_, err := str.Get(ctx, "test")
if err != nil {
b.Error(err)
}
@ -518,9 +539,11 @@ func BenchmarkStore_New(b *testing.B) {
if err != nil {
b.Error(err)
}
w := httptest.NewRecorder()
ctx := echo.NewContext(mock.NewRequest(req), mock.NewResponse(w), defaults.Default)
for i := 0; i < b.N; i++ {
_, err := str.New(req, "test")
_, err := str.New(ctx, "test")
if err != nil {
b.Error(err)
}
@ -550,8 +573,9 @@ func BenchmarkStore_Save(b *testing.B) {
}
w := httptest.NewRecorder()
ctx := echo.NewContext(mock.NewRequest(req), mock.NewResponse(w), defaults.Default)
session, err := str.Get(req, "test")
session, err := str.Get(ctx, "test")
if err != nil {
b.Error(err)
}
@ -559,7 +583,7 @@ func BenchmarkStore_Save(b *testing.B) {
session.Values["foo"] = "bar"
for i := 0; i < b.N; i++ {
if err := str.Save(req, w, session); err != nil {
if err := str.Save(ctx, session); err != nil {
b.Error(err)
}
}
@ -588,18 +612,19 @@ func BenchmarkStore_Save_delete(b *testing.B) {
}
w := httptest.NewRecorder()
ctx := echo.NewContext(mock.NewRequest(req), mock.NewResponse(w), defaults.Default)
session, err := str.Get(req, "test")
session, err := str.Get(ctx, "test")
if err != nil {
b.Error(err)
}
session.Values["foo"] = "bar"
session.Options.MaxAge = -1
ctx.SessionOptions().MaxAge = -1
for i := 0; i < b.N; i++ {
if err := str.Save(req, w, session); err != nil {
if err := str.Save(ctx, session); err != nil {
b.Error(err)
}
}