update
This commit is contained in:
parent
451e03c30f
commit
6180d20b97
4 changed files with 84 additions and 58 deletions
2
.gitignore
vendored
2
.gitignore
vendored
|
@ -24,3 +24,5 @@ _testmain.go
|
|||
|
||||
*.db
|
||||
*.out
|
||||
go.mod
|
||||
go.sum
|
|
@ -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))
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue