|
|
package storage
|
|
|
|
|
|
import (
|
|
|
"testing"
|
|
|
"time"
|
|
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
|
"github.com/stretchr/testify/require"
|
|
|
)
|
|
|
|
|
|
func TestMemoryStorage(t *testing.T) {
|
|
|
storage := NewMemoryStorage(0) // 0表示不过期
|
|
|
|
|
|
// 测试Create
|
|
|
sess, err := storage.Create("session1")
|
|
|
require.NoError(t, err, "Expected no error when creating session")
|
|
|
assert.Equal(t, "session1", sess.ID(), "Expected session ID to match")
|
|
|
|
|
|
// 测试Get
|
|
|
retrieved, err := storage.Get("session1")
|
|
|
require.NoError(t, err, "Expected no error when getting session")
|
|
|
require.NotNil(t, retrieved, "Expected session to be non-nil")
|
|
|
assert.Equal(t, "session1", retrieved.ID(), "Expected session ID to match")
|
|
|
|
|
|
// 测试Save
|
|
|
err = storage.Save(sess)
|
|
|
require.NoError(t, err, "Expected no error when saving session")
|
|
|
|
|
|
// 测试Delete
|
|
|
err = storage.Delete("session1")
|
|
|
require.NoError(t, err, "Expected no error when deleting session")
|
|
|
|
|
|
// 验证删除(Get应该返回nil, nil)
|
|
|
retrieved, err = storage.Get("session1")
|
|
|
require.NoError(t, err) // Get可能返回nil, nil而不是错误
|
|
|
assert.Nil(t, retrieved, "Expected session to be nil after deletion")
|
|
|
}
|
|
|
|
|
|
func TestMemoryStorageGetNotFound(t *testing.T) {
|
|
|
storage := NewMemoryStorage(0)
|
|
|
|
|
|
// 测试获取不存在的session(应该返回nil, nil)
|
|
|
retrieved, err := storage.Get("nonexistent")
|
|
|
require.NoError(t, err) // Get返回nil, nil而不是错误
|
|
|
assert.Nil(t, retrieved, "Expected session to be nil")
|
|
|
}
|
|
|
|
|
|
func TestMemoryStorageConcurrent(t *testing.T) {
|
|
|
storage := NewMemoryStorage(0)
|
|
|
|
|
|
// 并发创建和获取session
|
|
|
done := make(chan bool, 100)
|
|
|
for i := 0; i < 100; i++ {
|
|
|
go func(id int) {
|
|
|
sessionID := string(rune(id))
|
|
|
sess, _ := storage.Create(sessionID)
|
|
|
if sess != nil {
|
|
|
_ = sess.Set("key", id)
|
|
|
retrieved, _ := storage.Get(sessionID)
|
|
|
if retrieved != nil {
|
|
|
val, _ := retrieved.Get("key")
|
|
|
assert.Equal(t, id, val)
|
|
|
}
|
|
|
}
|
|
|
done <- true
|
|
|
}(i)
|
|
|
}
|
|
|
|
|
|
// 等待所有goroutine完成
|
|
|
for i := 0; i < 100; i++ {
|
|
|
<-done
|
|
|
}
|
|
|
}
|
|
|
|
|
|
func TestMemoryStorageExpiration(t *testing.T) {
|
|
|
storage := NewMemoryStorage(100 * time.Millisecond)
|
|
|
|
|
|
// 创建session
|
|
|
sess, err := storage.Create("session1")
|
|
|
require.NoError(t, err)
|
|
|
assert.NotNil(t, sess)
|
|
|
|
|
|
// 立即获取应该成功
|
|
|
retrieved, err := storage.Get("session1")
|
|
|
require.NoError(t, err)
|
|
|
assert.NotNil(t, retrieved)
|
|
|
|
|
|
// 等待过期
|
|
|
time.Sleep(150 * time.Millisecond)
|
|
|
|
|
|
// 清理过期session
|
|
|
err = storage.Cleanup()
|
|
|
require.NoError(t, err)
|
|
|
|
|
|
// 获取应该返回nil(已过期)
|
|
|
retrieved, err = storage.Get("session1")
|
|
|
require.NoError(t, err)
|
|
|
assert.Nil(t, retrieved, "Expected session to be nil after expiration")
|
|
|
}
|
|
|
|