github.com/xzl8028/xenia-server@v0.0.0-20190809101854-18450a97da63/store/storetest/session_store.go (about) 1 // Copyright (c) 2015-present Xenia, Inc. All Rights Reserved. 2 // See License.txt for license information. 3 4 package storetest 5 6 import ( 7 "testing" 8 9 "github.com/xzl8028/xenia-server/model" 10 "github.com/xzl8028/xenia-server/store" 11 12 "github.com/stretchr/testify/assert" 13 "github.com/stretchr/testify/require" 14 ) 15 16 func TestSessionStore(t *testing.T, ss store.Store) { 17 // Run serially to prevent interfering with other tests 18 testSessionCleanup(t, ss) 19 20 t.Run("Save", func(t *testing.T) { testSessionStoreSave(t, ss) }) 21 t.Run("SessionGet", func(t *testing.T) { testSessionGet(t, ss) }) 22 t.Run("SessionGetWithDeviceId", func(t *testing.T) { testSessionGetWithDeviceId(t, ss) }) 23 t.Run("SessionRemove", func(t *testing.T) { testSessionRemove(t, ss) }) 24 t.Run("SessionRemoveAll", func(t *testing.T) { testSessionRemoveAll(t, ss) }) 25 t.Run("SessionRemoveByUser", func(t *testing.T) { testSessionRemoveByUser(t, ss) }) 26 t.Run("SessionRemoveToken", func(t *testing.T) { testSessionRemoveToken(t, ss) }) 27 t.Run("SessionUpdateDeviceId", func(t *testing.T) { testSessionUpdateDeviceId(t, ss) }) 28 t.Run("SessionUpdateDeviceId2", func(t *testing.T) { testSessionUpdateDeviceId2(t, ss) }) 29 t.Run("UpdateLastActivityAt", func(t *testing.T) { testSessionStoreUpdateLastActivityAt(t, ss) }) 30 t.Run("SessionCount", func(t *testing.T) { testSessionCount(t, ss) }) 31 } 32 33 func testSessionStoreSave(t *testing.T, ss store.Store) { 34 s1 := &model.Session{} 35 s1.UserId = model.NewId() 36 37 if _, err := ss.Session().Save(s1); err != nil { 38 t.Fatal(err) 39 } 40 } 41 42 func testSessionGet(t *testing.T, ss store.Store) { 43 s1 := &model.Session{} 44 s1.UserId = model.NewId() 45 46 s1, err := ss.Session().Save(s1) 47 require.Nil(t, err) 48 49 s2 := &model.Session{} 50 s2.UserId = s1.UserId 51 52 s2, err = ss.Session().Save(s2) 53 require.Nil(t, err) 54 55 s3 := &model.Session{} 56 s3.UserId = s1.UserId 57 s3.ExpiresAt = 1 58 59 s3, err = ss.Session().Save(s3) 60 require.Nil(t, err) 61 62 if session, err := ss.Session().Get(s1.Id); err != nil { 63 t.Fatal(err) 64 } else { 65 if session.Id != s1.Id { 66 t.Fatal("should match") 67 } 68 } 69 70 if session, err := ss.Session().GetSessions(s1.UserId); err != nil { 71 t.Fatal(err) 72 } else { 73 if len(session) != 3 { 74 t.Fatal("should match len") 75 } 76 } 77 } 78 79 func testSessionGetWithDeviceId(t *testing.T, ss store.Store) { 80 s1 := &model.Session{} 81 s1.UserId = model.NewId() 82 s1.ExpiresAt = model.GetMillis() + 10000 83 84 s1, err := ss.Session().Save(s1) 85 require.Nil(t, err) 86 87 s2 := &model.Session{} 88 s2.UserId = s1.UserId 89 s2.DeviceId = model.NewId() 90 s2.ExpiresAt = model.GetMillis() + 10000 91 92 s2, err = ss.Session().Save(s2) 93 require.Nil(t, err) 94 95 s3 := &model.Session{} 96 s3.UserId = s1.UserId 97 s3.ExpiresAt = 1 98 s3.DeviceId = model.NewId() 99 100 s3, err = ss.Session().Save(s3) 101 require.Nil(t, err) 102 103 if data, err := ss.Session().GetSessionsWithActiveDeviceIds(s1.UserId); err != nil { 104 t.Fatal(err) 105 } else { 106 if len(data) != 1 { 107 t.Fatal("should match len") 108 } 109 } 110 } 111 112 func testSessionRemove(t *testing.T, ss store.Store) { 113 s1 := &model.Session{} 114 s1.UserId = model.NewId() 115 116 s1, err := ss.Session().Save(s1) 117 require.Nil(t, err) 118 119 if session, err := ss.Session().Get(s1.Id); err != nil { 120 t.Fatal(err) 121 } else { 122 if session.Id != s1.Id { 123 t.Fatal("should match") 124 } 125 } 126 127 removeErr := ss.Session().Remove(s1.Id) 128 require.Nil(t, removeErr) 129 if _, err := ss.Session().Get(s1.Id); err == nil { 130 t.Fatal("should have been removed") 131 } 132 } 133 134 func testSessionRemoveAll(t *testing.T, ss store.Store) { 135 s1 := &model.Session{} 136 s1.UserId = model.NewId() 137 138 s1, err := ss.Session().Save(s1) 139 require.Nil(t, err) 140 141 if session, err := ss.Session().Get(s1.Id); err != nil { 142 t.Fatal(err) 143 } else { 144 if session.Id != s1.Id { 145 t.Fatal("should match") 146 } 147 } 148 149 removeErr := ss.Session().RemoveAllSessions() 150 require.Nil(t, removeErr) 151 152 if _, err := ss.Session().Get(s1.Id); err == nil { 153 t.Fatal("should have been removed") 154 } 155 } 156 157 func testSessionRemoveByUser(t *testing.T, ss store.Store) { 158 s1 := &model.Session{} 159 s1.UserId = model.NewId() 160 161 s1, err := ss.Session().Save(s1) 162 require.Nil(t, err) 163 164 if session, err := ss.Session().Get(s1.Id); err != nil { 165 t.Fatal(err) 166 } else { 167 if session.Id != s1.Id { 168 t.Fatal("should match") 169 } 170 } 171 172 deleteErr := ss.Session().PermanentDeleteSessionsByUser(s1.UserId) 173 require.Nil(t, deleteErr) 174 175 if _, err := ss.Session().Get(s1.Id); err == nil { 176 t.Fatal("should have been removed") 177 } 178 } 179 180 func testSessionRemoveToken(t *testing.T, ss store.Store) { 181 s1 := &model.Session{} 182 s1.UserId = model.NewId() 183 184 s1, err := ss.Session().Save(s1) 185 require.Nil(t, err) 186 187 if session, err := ss.Session().Get(s1.Id); err != nil { 188 t.Fatal(err) 189 } else { 190 if session.Id != s1.Id { 191 t.Fatal("should match") 192 } 193 } 194 195 removeErr := ss.Session().Remove(s1.Token) 196 require.Nil(t, removeErr) 197 198 if _, err := ss.Session().Get(s1.Id); err == nil { 199 t.Fatal("should have been removed") 200 } 201 202 if session, err := ss.Session().GetSessions(s1.UserId); err != nil { 203 t.Fatal(err) 204 } else { 205 if len(session) != 0 { 206 t.Fatal("should match len") 207 } 208 } 209 } 210 211 func testSessionUpdateDeviceId(t *testing.T, ss store.Store) { 212 s1 := &model.Session{} 213 s1.UserId = model.NewId() 214 215 s1, err := ss.Session().Save(s1) 216 require.Nil(t, err) 217 218 if _, err = ss.Session().UpdateDeviceId(s1.Id, model.PUSH_NOTIFY_APPLE+":1234567890", s1.ExpiresAt); err != nil { 219 t.Fatal(err) 220 } 221 222 s2 := &model.Session{} 223 s2.UserId = model.NewId() 224 225 s2, err = ss.Session().Save(s2) 226 require.Nil(t, err) 227 228 if _, err := ss.Session().UpdateDeviceId(s2.Id, model.PUSH_NOTIFY_APPLE+":1234567890", s1.ExpiresAt); err != nil { 229 t.Fatal(err) 230 } 231 } 232 233 func testSessionUpdateDeviceId2(t *testing.T, ss store.Store) { 234 s1 := &model.Session{} 235 s1.UserId = model.NewId() 236 237 s1, err := ss.Session().Save(s1) 238 require.Nil(t, err) 239 240 if _, err = ss.Session().UpdateDeviceId(s1.Id, model.PUSH_NOTIFY_APPLE_REACT_NATIVE+":1234567890", s1.ExpiresAt); err != nil { 241 t.Fatal(err) 242 } 243 244 s2 := &model.Session{} 245 s2.UserId = model.NewId() 246 247 s2, err = ss.Session().Save(s2) 248 require.Nil(t, err) 249 250 if _, err := ss.Session().UpdateDeviceId(s2.Id, model.PUSH_NOTIFY_APPLE_REACT_NATIVE+":1234567890", s1.ExpiresAt); err != nil { 251 t.Fatal(err) 252 } 253 } 254 255 func testSessionStoreUpdateLastActivityAt(t *testing.T, ss store.Store) { 256 s1 := &model.Session{} 257 s1.UserId = model.NewId() 258 259 s1, err := ss.Session().Save(s1) 260 require.Nil(t, err) 261 262 err = ss.Session().UpdateLastActivityAt(s1.Id, 1234567890) 263 require.Nil(t, err) 264 265 if session, err := ss.Session().Get(s1.Id); err != nil { 266 t.Fatal(err) 267 } else { 268 if session.LastActivityAt != 1234567890 { 269 t.Fatal("LastActivityAt not updated correctly") 270 } 271 } 272 273 } 274 275 func testSessionCount(t *testing.T, ss store.Store) { 276 s1 := &model.Session{} 277 s1.UserId = model.NewId() 278 s1.ExpiresAt = model.GetMillis() + 100000 279 280 s1, err := ss.Session().Save(s1) 281 require.Nil(t, err) 282 283 if count, err := ss.Session().AnalyticsSessionCount(); err != nil { 284 t.Fatal(err) 285 } else { 286 if count == 0 { 287 t.Fatal("should have at least 1 session") 288 } 289 } 290 } 291 292 func testSessionCleanup(t *testing.T, ss store.Store) { 293 now := model.GetMillis() 294 295 s1 := &model.Session{} 296 s1.UserId = model.NewId() 297 s1.ExpiresAt = 0 // never expires 298 299 s1, err := ss.Session().Save(s1) 300 require.Nil(t, err) 301 302 s2 := &model.Session{} 303 s2.UserId = s1.UserId 304 s2.ExpiresAt = now + 1000000 // expires in the future 305 306 s2, err = ss.Session().Save(s2) 307 require.Nil(t, err) 308 309 s3 := &model.Session{} 310 s3.UserId = model.NewId() 311 s3.ExpiresAt = 1 // expired 312 313 s3, err = ss.Session().Save(s3) 314 require.Nil(t, err) 315 316 s4 := &model.Session{} 317 s4.UserId = model.NewId() 318 s4.ExpiresAt = 2 // expired 319 320 s4, err = ss.Session().Save(s4) 321 require.Nil(t, err) 322 323 ss.Session().Cleanup(now, 1) 324 325 _, err = ss.Session().Get(s1.Id) 326 assert.Nil(t, err) 327 328 _, err = ss.Session().Get(s2.Id) 329 assert.Nil(t, err) 330 331 _, err = ss.Session().Get(s3.Id) 332 assert.NotNil(t, err) 333 334 _, err = ss.Session().Get(s4.Id) 335 assert.NotNil(t, err) 336 337 removeErr := ss.Session().Remove(s1.Id) 338 require.Nil(t, removeErr) 339 340 removeErr = ss.Session().Remove(s2.Id) 341 require.Nil(t, removeErr) 342 }