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 }