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  }