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