github.com/status-im/status-go@v1.1.0/protocol/encryption/persistence_keys_storage_test.go (about) 1 package encryption 2 3 import ( 4 "testing" 5 6 dr "github.com/status-im/doubleratchet" 7 "github.com/stretchr/testify/suite" 8 9 "github.com/status-im/status-go/appdatabase" 10 "github.com/status-im/status-go/protocol/sqlite" 11 "github.com/status-im/status-go/t/helpers" 12 ) 13 14 var ( 15 pubKey1 = dr.Key{0xe3, 0xbe, 0xb9, 0x4e, 0x70, 0x17, 0x37, 0xc, 0x1, 0x8f, 0xa9, 0x7e, 0xef, 0x4, 0xfb, 0x23, 0xac, 0xea, 0x28, 0xf7, 0xa9, 0x56, 0xcc, 0x1d, 0x46, 0xf3, 0xb5, 0x1d, 0x7d, 0x7d, 0x5e, 0x2c} 16 pubKey2 = dr.Key{0xec, 0x8, 0x10, 0x7c, 0x33, 0x54, 0x0, 0x20, 0xe9, 0x4f, 0x6c, 0x84, 0xe4, 0x39, 0x50, 0x5a, 0x2f, 0x60, 0xbe, 0x81, 0xa, 0x78, 0x8b, 0xeb, 0x1e, 0x2c, 0x9, 0x8d, 0x4b, 0x4d, 0xc1, 0x40} 17 mk1 = dr.Key{0x00, 0x8, 0x10, 0x7c, 0x33, 0x54, 0x0, 0x20, 0xe9, 0x4f, 0x6c, 0x84, 0xe4, 0x39, 0x50, 0x5a, 0x2f, 0x60, 0xbe, 0x81, 0xa, 0x78, 0x8b, 0xeb, 0x1e, 0x2c, 0x9, 0x8d, 0x4b, 0x4d, 0xc1, 0x40} 18 mk2 = dr.Key{0x01, 0x8, 0x10, 0x7c, 0x33, 0x54, 0x0, 0x20, 0xe9, 0x4f, 0x6c, 0x84, 0xe4, 0x39, 0x50, 0x5a, 0x2f, 0x60, 0xbe, 0x81, 0xa, 0x78, 0x8b, 0xeb, 0x1e, 0x2c, 0x9, 0x8d, 0x4b, 0x4d, 0xc1, 0x40} 19 mk3 = dr.Key{0x02, 0x8, 0x10, 0x7c, 0x33, 0x54, 0x0, 0x20, 0xe9, 0x4f, 0x6c, 0x84, 0xe4, 0x39, 0x50, 0x5a, 0x2f, 0x60, 0xbe, 0x81, 0xa, 0x78, 0x8b, 0xeb, 0x1e, 0x2c, 0x9, 0x8d, 0x4b, 0x4d, 0xc1, 0x40} 20 mk4 = dr.Key{0x03, 0x8, 0x10, 0x7c, 0x33, 0x54, 0x0, 0x20, 0xe9, 0x4f, 0x6c, 0x84, 0xe4, 0x39, 0x50, 0x5a, 0x2f, 0x60, 0xbe, 0x81, 0xa, 0x78, 0x8b, 0xeb, 0x1e, 0x2c, 0x9, 0x8d, 0x4b, 0x4d, 0xc1, 0x40} 21 mk5 = dr.Key{0x04, 0x8, 0x10, 0x7c, 0x33, 0x54, 0x0, 0x20, 0xe9, 0x4f, 0x6c, 0x84, 0xe4, 0x39, 0x50, 0x5a, 0x2f, 0x60, 0xbe, 0x81, 0xa, 0x78, 0x8b, 0xeb, 0x1e, 0x2c, 0x9, 0x8d, 0x4b, 0x4d, 0xc1, 0x40} 22 ) 23 24 func TestSQLLitePersistenceKeysStorageTestSuite(t *testing.T) { 25 suite.Run(t, new(SQLLitePersistenceKeysStorageTestSuite)) 26 } 27 28 type SQLLitePersistenceKeysStorageTestSuite struct { 29 suite.Suite 30 service dr.KeysStorage 31 } 32 33 func (s *SQLLitePersistenceKeysStorageTestSuite) SetupTest() { 34 db, err := helpers.SetupTestMemorySQLDB(appdatabase.DbInitializer{}) 35 s.Require().NoError(err) 36 err = sqlite.Migrate(db) 37 s.Require().NoError(err) 38 39 p := newSQLitePersistence(db) 40 s.service = p.KeysStorage() 41 } 42 43 func (s *SQLLitePersistenceKeysStorageTestSuite) TestKeysStorageSqlLiteGetMissing() { 44 // Act. 45 _, ok, err := s.service.Get(pubKey1, 0) 46 47 // Assert. 48 s.NoError(err) 49 s.False(ok, "It returns false") 50 } 51 52 func (s *SQLLitePersistenceKeysStorageTestSuite) TestKeysStorageSqlLite_Put() { 53 // Act and assert. 54 err := s.service.Put([]byte("session-id"), pubKey1, 0, mk1, 1) 55 s.NoError(err) 56 } 57 58 func (s *SQLLitePersistenceKeysStorageTestSuite) TestKeysStorageSqlLite_DeleteOldMks() { 59 // Insert keys out-of-order 60 err := s.service.Put([]byte("session-id"), pubKey1, 0, mk1, 1) 61 s.NoError(err) 62 err = s.service.Put([]byte("session-id"), pubKey1, 1, mk2, 2) 63 s.NoError(err) 64 err = s.service.Put([]byte("session-id"), pubKey1, 2, mk3, 20) 65 s.NoError(err) 66 err = s.service.Put([]byte("session-id"), pubKey1, 3, mk4, 21) 67 s.NoError(err) 68 err = s.service.Put([]byte("session-id"), pubKey1, 4, mk5, 22) 69 s.NoError(err) 70 71 err = s.service.DeleteOldMks([]byte("session-id"), 20) 72 s.NoError(err) 73 74 _, ok, err := s.service.Get(pubKey1, 0) 75 s.NoError(err) 76 s.False(ok) 77 78 _, ok, err = s.service.Get(pubKey1, 1) 79 s.NoError(err) 80 s.False(ok) 81 82 _, ok, err = s.service.Get(pubKey1, 2) 83 s.NoError(err) 84 s.False(ok) 85 86 _, ok, err = s.service.Get(pubKey1, 3) 87 s.NoError(err) 88 s.True(ok) 89 90 _, ok, err = s.service.Get(pubKey1, 4) 91 s.NoError(err) 92 s.True(ok) 93 } 94 95 func (s *SQLLitePersistenceKeysStorageTestSuite) TestKeysStorageSqlLite_TruncateMks() { 96 // Insert keys out-of-order 97 err := s.service.Put([]byte("session-id"), pubKey2, 2, mk5, 5) 98 s.NoError(err) 99 err = s.service.Put([]byte("session-id"), pubKey2, 0, mk3, 3) 100 s.NoError(err) 101 err = s.service.Put([]byte("session-id"), pubKey1, 1, mk2, 2) 102 s.NoError(err) 103 err = s.service.Put([]byte("session-id"), pubKey2, 1, mk4, 4) 104 s.NoError(err) 105 err = s.service.Put([]byte("session-id"), pubKey1, 0, mk1, 1) 106 s.NoError(err) 107 108 err = s.service.TruncateMks([]byte("session-id"), 2) 109 s.NoError(err) 110 111 _, ok, err := s.service.Get(pubKey1, 0) 112 s.NoError(err) 113 s.False(ok) 114 115 _, ok, err = s.service.Get(pubKey1, 1) 116 s.NoError(err) 117 s.False(ok) 118 119 _, ok, err = s.service.Get(pubKey2, 0) 120 s.NoError(err) 121 s.False(ok) 122 123 _, ok, err = s.service.Get(pubKey2, 1) 124 s.NoError(err) 125 s.True(ok) 126 127 _, ok, err = s.service.Get(pubKey2, 2) 128 s.NoError(err) 129 s.True(ok) 130 } 131 132 func (s *SQLLitePersistenceKeysStorageTestSuite) TestKeysStorageSqlLite_Count() { 133 134 // Act. 135 cnt, err := s.service.Count(pubKey1) 136 137 // Assert. 138 s.NoError(err) 139 s.EqualValues(0, cnt, "It returns 0 when no keys are in the database") 140 } 141 142 func (s *SQLLitePersistenceKeysStorageTestSuite) TestKeysStorageSqlLite_Delete() { 143 // Arrange. 144 145 // Act and assert. 146 err := s.service.DeleteMk(pubKey1, 0) 147 s.NoError(err) 148 } 149 150 func (s *SQLLitePersistenceKeysStorageTestSuite) TestKeysStorageSqlLite_Flow() { 151 152 // Act. 153 err := s.service.Put([]byte("session-id"), pubKey1, 0, mk1, 1) 154 s.NoError(err) 155 156 k, ok, err := s.service.Get(pubKey1, 0) 157 158 // Assert. 159 s.NoError(err) 160 s.True(ok, "It returns true") 161 s.Equal(mk1, k, "It returns the message key") 162 163 // Act. 164 _, ok, err = s.service.Get(pubKey2, 0) 165 166 // Assert. 167 s.NoError(err) 168 s.False(ok, "It returns false when querying non existing public key") 169 170 // Act. 171 _, ok, err = s.service.Get(pubKey1, 1) 172 173 // Assert. 174 s.NoError(err) 175 s.False(ok, "It returns false when querying the wrong msg number") 176 177 // Act. 178 cnt, err := s.service.Count(pubKey1) 179 180 // Assert. 181 s.NoError(err) 182 s.EqualValues(1, cnt) 183 184 // Act and assert. 185 err = s.service.DeleteMk(pubKey1, 1) 186 s.NoError(err) 187 188 // Act and assert. 189 err = s.service.DeleteMk(pubKey2, 0) 190 s.NoError(err) 191 192 // Act. 193 err = s.service.DeleteMk(pubKey1, 0) 194 s.NoError(err) 195 196 cnt, err = s.service.Count(pubKey1) 197 198 // Assert. 199 s.NoError(err) 200 s.EqualValues(0, cnt) 201 }