github.com/status-im/status-go@v1.1.0/services/connector/commands/personal_sign_test.go (about) 1 package commands 2 3 import ( 4 "encoding/json" 5 "testing" 6 "time" 7 8 "github.com/stretchr/testify/assert" 9 10 "github.com/status-im/status-go/eth-node/types" 11 "github.com/status-im/status-go/signal" 12 ) 13 14 func preparePersonalSignRequest(dApp signal.ConnectorDApp, challenge, address string) (RPCRequest, error) { 15 params := map[string]interface{}{ 16 "challenge": challenge, 17 "address": address, 18 } 19 20 return ConstructRPCRequest("personal_sign", []interface{}{params}, &dApp) 21 } 22 23 func TestFailToPersonalSignWithMissingDAppFields(t *testing.T) { 24 db, close := SetupTestDB(t) 25 defer close() 26 27 cmd := &PersonalSignCommand{Db: db} 28 29 // Missing DApp fields 30 request, err := ConstructRPCRequest("personal_sign", []interface{}{}, nil) 31 assert.NoError(t, err) 32 33 result, err := cmd.Execute(request) 34 assert.Equal(t, ErrRequestMissingDAppData, err) 35 assert.Empty(t, result) 36 } 37 38 func TestFailToPersonalSignForUnpermittedDApp(t *testing.T) { 39 db, close := SetupTestDB(t) 40 defer close() 41 42 cmd := &PersonalSignCommand{Db: db} 43 44 request, err := preparePersonalSignRequest(testDAppData, 45 "0x506c65617365207369676e2074686973206d65737361676520746f20636f6e6669726d20796f7572206964656e746974792e", 46 "0x4B0897b0513FdBeEc7C469D9aF4fA6C0752aBea7", 47 ) 48 assert.NoError(t, err) 49 50 result, err := cmd.Execute(request) 51 assert.Equal(t, ErrDAppIsNotPermittedByUser, err) 52 assert.Empty(t, result) 53 } 54 55 func TestFailToPersonalSignWithoutParams(t *testing.T) { 56 db, close := SetupTestDB(t) 57 defer close() 58 59 cmd := &PersonalSignCommand{Db: db} 60 61 request, err := ConstructRPCRequest("personal_sign", nil, &testDAppData) 62 assert.NoError(t, err) 63 64 result, err := cmd.Execute(request) 65 assert.Equal(t, ErrEmptyRPCParams, err) 66 assert.Empty(t, result) 67 } 68 69 func TestFailToPersonalSignWithSignalTimout(t *testing.T) { 70 db, close := SetupTestDB(t) 71 defer close() 72 73 clientHandler := NewClientSideHandler() 74 75 cmd := &PersonalSignCommand{ 76 Db: db, 77 ClientHandler: clientHandler, 78 } 79 80 err := PersistDAppData(db, testDAppData, types.Address{0x01}, uint64(0x1)) 81 assert.NoError(t, err) 82 83 request, err := preparePersonalSignRequest(testDAppData, 84 "0x506c65617365207369676e2074686973206d65737361676520746f20636f6e6669726d20796f7572206964656e746974792e", 85 "0x4B0897b0513FdBeEc7C469D9aF4fA6C0752aBea7", 86 ) 87 assert.NoError(t, err) 88 89 backupWalletResponseMaxInterval := WalletResponseMaxInterval 90 WalletResponseMaxInterval = 1 * time.Millisecond 91 92 _, err = cmd.Execute(request) 93 assert.Equal(t, ErrWalletResponseTimeout, err) 94 WalletResponseMaxInterval = backupWalletResponseMaxInterval 95 } 96 97 func TestPersonalSignWithSignalAccepted(t *testing.T) { 98 db, close := SetupTestDB(t) 99 defer close() 100 101 fakedSignature := "0x051" 102 103 clientHandler := NewClientSideHandler() 104 105 cmd := &PersonalSignCommand{ 106 Db: db, 107 ClientHandler: clientHandler, 108 } 109 110 err := PersistDAppData(db, testDAppData, types.Address{0x01}, uint64(0x1)) 111 assert.NoError(t, err) 112 113 challenge := "0x506c65617365207369676e2074686973206d65737361676520746f20636f6e6669726d20796f7572206964656e746974792e" 114 address := "0x4B0897b0513FdBeEc7C469D9aF4fA6C0752aBea7" 115 request, err := preparePersonalSignRequest(testDAppData, challenge, address) 116 assert.NoError(t, err) 117 118 signal.SetMobileSignalHandler(signal.MobileSignalHandler(func(s []byte) { 119 var evt EventType 120 err := json.Unmarshal(s, &evt) 121 assert.NoError(t, err) 122 123 switch evt.Type { 124 case signal.EventConnectorPersonalSign: 125 var ev signal.ConnectorPersonalSignSignal 126 err := json.Unmarshal(evt.Event, &ev) 127 assert.NoError(t, err) 128 assert.Equal(t, ev.Challenge, challenge) 129 assert.Equal(t, ev.Address, address) 130 131 err = clientHandler.PersonalSignAccepted(PersonalSignAcceptedArgs{ 132 Signature: fakedSignature, 133 RequestID: ev.RequestID, 134 }) 135 assert.NoError(t, err) 136 } 137 })) 138 t.Cleanup(signal.ResetMobileSignalHandler) 139 140 response, err := cmd.Execute(request) 141 assert.NoError(t, err) 142 assert.Equal(t, response, fakedSignature) 143 } 144 145 func TestPersonalSignWithSignalRejected(t *testing.T) { 146 db, close := SetupTestDB(t) 147 defer close() 148 149 clientHandler := NewClientSideHandler() 150 151 cmd := &PersonalSignCommand{ 152 Db: db, 153 ClientHandler: clientHandler, 154 } 155 156 err := PersistDAppData(db, testDAppData, types.Address{0x01}, uint64(0x1)) 157 assert.NoError(t, err) 158 159 challenge := "0x506c65617365207369676e2074686973206d65737361676520746f20636f6e6669726d20796f7572206964656e746974792e" 160 address := "0x4B0897b0513FdBeEc7C469D9aF4fA6C0752aBea7" 161 request, err := preparePersonalSignRequest(testDAppData, challenge, address) 162 assert.NoError(t, err) 163 164 signal.SetMobileSignalHandler(signal.MobileSignalHandler(func(s []byte) { 165 var evt EventType 166 err := json.Unmarshal(s, &evt) 167 assert.NoError(t, err) 168 169 switch evt.Type { 170 case signal.EventConnectorPersonalSign: 171 var ev signal.ConnectorPersonalSignSignal 172 err := json.Unmarshal(evt.Event, &ev) 173 assert.NoError(t, err) 174 175 err = clientHandler.PersonalSignRejected(RejectedArgs{ 176 RequestID: ev.RequestID, 177 }) 178 assert.NoError(t, err) 179 } 180 })) 181 t.Cleanup(signal.ResetMobileSignalHandler) 182 183 _, err = cmd.Execute(request) 184 assert.Equal(t, ErrPersonalSignRejectedByUser, err) 185 }