github.com/status-im/status-go@v1.1.0/multiaccounts/accounts/keycard_database_test.go (about)

     1  package accounts
     2  
     3  import (
     4  	"testing"
     5  
     6  	"github.com/stretchr/testify/require"
     7  
     8  	"github.com/status-im/status-go/eth-node/types"
     9  )
    10  
    11  func TestKeycards(t *testing.T) {
    12  	db, stop := setupTestDB(t)
    13  	defer stop()
    14  
    15  	kp1 := GetProfileKeypairForTest(true, true, true)
    16  	keycard1 := GetProfileKeycardForTest()
    17  
    18  	kp2 := GetSeedImportedKeypair1ForTest()
    19  	keycard2 := GetKeycardForSeedImportedKeypair1ForTest()
    20  
    21  	keycard2Copy := GetKeycardForSeedImportedKeypair1ForTest()
    22  	keycard2Copy.KeycardUID = keycard2Copy.KeycardUID + "C"
    23  	keycard2Copy.KeycardName = keycard2Copy.KeycardName + "Copy"
    24  	keycard2Copy.Position = keycard2Copy.Position + 1
    25  
    26  	// Pre-condition
    27  	err := db.SaveOrUpdateKeypair(kp1)
    28  	require.NoError(t, err)
    29  	err = db.SaveOrUpdateKeypair(kp2)
    30  	require.NoError(t, err)
    31  	dbKeypairs, err := db.GetActiveKeypairs()
    32  	require.NoError(t, err)
    33  	require.Equal(t, 2, len(dbKeypairs))
    34  
    35  	// Test adding/reading keycards
    36  	err = db.SaveOrUpdateKeycard(*keycard1, 0, false)
    37  	require.NoError(t, err)
    38  	dbKeycard1, err := db.GetKeycardByKeycardUID(keycard1.KeycardUID)
    39  	require.NoError(t, err)
    40  	require.True(t, SameKeycards(keycard1, dbKeycard1))
    41  
    42  	err = db.SaveOrUpdateKeycard(*keycard2, 0, false)
    43  	require.NoError(t, err)
    44  	dbKeycard2, err := db.GetKeycardByKeycardUID(keycard2.KeycardUID)
    45  	require.NoError(t, err)
    46  	require.True(t, SameKeycards(keycard2, dbKeycard2))
    47  
    48  	err = db.SaveOrUpdateKeycard(*keycard2Copy, 0, false)
    49  	require.NoError(t, err)
    50  	dbKeycard2Copy, err := db.GetKeycardByKeycardUID(keycard2Copy.KeycardUID)
    51  	require.NoError(t, err)
    52  	require.True(t, SameKeycards(keycard2Copy, dbKeycard2Copy))
    53  
    54  	dbKeycards, err := db.GetKeycardsWithSameKeyUID(keycard2.KeyUID)
    55  	require.NoError(t, err)
    56  	require.Equal(t, 2, len(dbKeycards))
    57  	require.True(t, Contains(dbKeycards, keycard2, SameKeycards))
    58  	require.True(t, Contains(dbKeycards, keycard2Copy, SameKeycards))
    59  
    60  	dbKeycards, err = db.GetAllKnownKeycards()
    61  	require.NoError(t, err)
    62  	require.Equal(t, 3, len(dbKeycards))
    63  	require.True(t, Contains(dbKeycards, keycard1, SameKeycards))
    64  	require.True(t, Contains(dbKeycards, keycard2, SameKeycards))
    65  	require.True(t, Contains(dbKeycards, keycard2Copy, SameKeycards))
    66  
    67  	nextPosition, err := db.GetPositionForNextNewKeycard()
    68  	require.NoError(t, err)
    69  	require.Equal(t, uint64(len(dbKeycards)), nextPosition)
    70  
    71  	// test adding additional accounts to keycard
    72  	keycard1.AccountsAddresses = append(keycard1.AccountsAddresses, types.Address{0x05}, types.Address{0x06})
    73  	err = db.SaveOrUpdateKeycard(*keycard1, 0, false)
    74  	require.NoError(t, err)
    75  	dbKeycard1, err = db.GetKeycardByKeycardUID(keycard1.KeycardUID)
    76  	require.NoError(t, err)
    77  	require.Equal(t, len(keycard1.AccountsAddresses), len(dbKeycard1.AccountsAddresses))
    78  	require.True(t, SameKeycards(keycard1, dbKeycard1))
    79  
    80  	// Test seting a new keycard name
    81  	keycard1.KeycardName = "Card101"
    82  	err = db.SetKeycardName(keycard1.KeycardUID, keycard1.KeycardName, 1000)
    83  	require.NoError(t, err)
    84  	dbKeycard1, err = db.GetKeycardByKeycardUID(keycard1.KeycardUID)
    85  	require.NoError(t, err)
    86  	require.True(t, SameKeycards(keycard1, dbKeycard1))
    87  
    88  	// Test locking a keycard
    89  	keycard1.KeycardLocked = true
    90  	err = db.KeycardLocked(keycard1.KeycardUID, 1001)
    91  	require.NoError(t, err)
    92  	dbKeycard1, err = db.GetKeycardByKeycardUID(keycard1.KeycardUID)
    93  	require.NoError(t, err)
    94  	require.True(t, SameKeycards(keycard1, dbKeycard1))
    95  
    96  	// Test unlocking a keycard
    97  	keycard1.KeycardLocked = false
    98  	err = db.KeycardUnlocked(keycard1.KeycardUID, 1002)
    99  	require.NoError(t, err)
   100  	dbKeycard1, err = db.GetKeycardByKeycardUID(keycard1.KeycardUID)
   101  	require.NoError(t, err)
   102  	require.True(t, SameKeycards(keycard1, dbKeycard1))
   103  
   104  	// Test update keycard uid
   105  	oldKeycardUID := keycard1.KeycardUID
   106  	keycard1.KeycardUID = "00000000000000000000000000000000"
   107  	err = db.UpdateKeycardUID(oldKeycardUID, keycard1.KeycardUID, 1003)
   108  	require.NoError(t, err)
   109  	dbKeycard1, err = db.GetKeycardByKeycardUID(keycard1.KeycardUID)
   110  	require.NoError(t, err)
   111  	require.True(t, SameKeycards(keycard1, dbKeycard1))
   112  
   113  	// Test detleting accounts (addresses) for a certain keycard
   114  	const numOfAccountsToRemove = 2
   115  	require.Greater(t, len(keycard1.AccountsAddresses), numOfAccountsToRemove)
   116  	accountsToRemove := keycard1.AccountsAddresses[:numOfAccountsToRemove]
   117  	keycard1.AccountsAddresses = keycard1.AccountsAddresses[numOfAccountsToRemove:]
   118  	err = db.DeleteKeycardAccounts(keycard1.KeycardUID, accountsToRemove, 1004)
   119  	require.NoError(t, err)
   120  	dbKeycard1, err = db.GetKeycardByKeycardUID(keycard1.KeycardUID)
   121  	require.NoError(t, err)
   122  	require.True(t, SameKeycards(keycard1, dbKeycard1))
   123  
   124  	// Test detleting a keycard
   125  	err = db.DeleteKeycard(keycard1.KeycardUID, 1006)
   126  	require.NoError(t, err)
   127  	dbKeycards, err = db.GetAllKnownKeycards()
   128  	require.NoError(t, err)
   129  	require.Equal(t, 2, len(dbKeycards))
   130  	dbKeycards, err = db.GetKeycardsWithSameKeyUID(keycard1.KeyUID)
   131  	require.NoError(t, err)
   132  	require.Equal(t, 0, len(dbKeycards))
   133  	dbKeycard, err := db.GetKeycardByKeycardUID(keycard1.KeycardUID)
   134  	require.Error(t, err)
   135  	require.True(t, err == ErrNoKeycardForPassedKeycardUID)
   136  	require.Nil(t, dbKeycard)
   137  
   138  	// Test detleting all keycards for KeyUID
   139  	dbKeycards, err = db.GetKeycardsWithSameKeyUID(keycard2.KeyUID)
   140  	require.NoError(t, err)
   141  	require.Equal(t, 2, len(dbKeycards))
   142  	err = db.DeleteAllKeycardsWithKeyUID(keycard2.KeyUID, 1007)
   143  	require.NoError(t, err)
   144  	dbKeycards, err = db.GetAllKnownKeycards()
   145  	require.NoError(t, err)
   146  	require.Equal(t, 0, len(dbKeycards))
   147  	dbKeycards, err = db.GetKeycardsWithSameKeyUID(keycard2.KeyUID)
   148  	require.NoError(t, err)
   149  	require.Equal(t, 0, len(dbKeycards))
   150  	dbKeycard, err = db.GetKeycardByKeycardUID(keycard2.KeycardUID)
   151  	require.Error(t, err)
   152  	require.True(t, err == ErrNoKeycardForPassedKeycardUID)
   153  	require.Nil(t, dbKeycard)
   154  }
   155  
   156  func TestKeycardsRemovalWhenDeletingKeypair(t *testing.T) {
   157  	db, stop := setupTestDB(t)
   158  	defer stop()
   159  
   160  	kp2 := GetSeedImportedKeypair1ForTest()
   161  	keycard2 := GetKeycardForSeedImportedKeypair1ForTest()
   162  
   163  	keycard2Copy := GetKeycardForSeedImportedKeypair1ForTest()
   164  	keycard2Copy.KeycardUID = keycard2Copy.KeycardUID + "C"
   165  	keycard2Copy.KeycardName = keycard2Copy.KeycardName + "Copy"
   166  	keycard2Copy.Position = keycard2Copy.Position + 1
   167  
   168  	// Pre-condition
   169  	err := db.SaveOrUpdateKeypair(kp2)
   170  	require.NoError(t, err)
   171  	dbKeypairs, err := db.GetActiveKeypairs()
   172  	require.NoError(t, err)
   173  	require.Equal(t, 1, len(dbKeypairs))
   174  
   175  	// Pre-condition - save keycards referring to previously added keypair
   176  	err = db.SaveOrUpdateKeycard(*keycard2, 0, false)
   177  	require.NoError(t, err)
   178  	dbKeycard2, err := db.GetKeycardByKeycardUID(keycard2.KeycardUID)
   179  	require.NoError(t, err)
   180  	require.True(t, SameKeycards(keycard2, dbKeycard2))
   181  
   182  	err = db.SaveOrUpdateKeycard(*keycard2Copy, 0, false)
   183  	require.NoError(t, err)
   184  	dbKeycard2Copy, err := db.GetKeycardByKeycardUID(keycard2Copy.KeycardUID)
   185  	require.NoError(t, err)
   186  	require.True(t, SameKeycards(keycard2Copy, dbKeycard2Copy))
   187  
   188  	// Check db state
   189  	dbKeycards, err := db.GetKeycardsWithSameKeyUID(keycard2.KeyUID)
   190  	require.NoError(t, err)
   191  	require.Equal(t, 2, len(dbKeycards))
   192  	require.True(t, Contains(dbKeycards, keycard2, SameKeycards))
   193  	require.True(t, Contains(dbKeycards, keycard2Copy, SameKeycards))
   194  
   195  	// Remove keypair
   196  	err = db.RemoveKeypair(kp2.KeyUID, 0)
   197  	require.NoError(t, err)
   198  
   199  	// Check db state after deletion
   200  	dbKeypairs, err = db.GetActiveKeypairs()
   201  	require.NoError(t, err)
   202  	require.Equal(t, 0, len(dbKeypairs))
   203  
   204  	dbKeycards, err = db.GetAllKnownKeycards()
   205  	require.NoError(t, err)
   206  	require.Equal(t, 0, len(dbKeycards))
   207  	dbKeycards, err = db.GetKeycardsWithSameKeyUID(kp2.KeyUID)
   208  	require.NoError(t, err)
   209  	require.Equal(t, 0, len(dbKeycards))
   210  	dbKeycard, err := db.GetKeycardByKeycardUID(keycard2.KeycardUID)
   211  	require.Error(t, err)
   212  	require.True(t, err == ErrNoKeycardForPassedKeycardUID)
   213  	require.Nil(t, dbKeycard)
   214  }