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  }