github.com/mises-id/sdk@v0.0.0-20220328093804-29ea0c38cb95/sdk_test.go (about) 1 package sdk_test 2 3 import ( 4 "fmt" 5 "testing" 6 7 "github.com/mises-id/sdk" 8 "github.com/mises-id/sdk/bip39" 9 "github.com/mises-id/sdk/misesid" 10 "github.com/mises-id/sdk/types" 11 "github.com/mises-id/sdk/user" 12 "github.com/tyler-smith/assert" 13 ) 14 15 func CreateRandomUser() types.MUser { 16 //create user 17 entropy, _ := bip39.NewEntropy(128) 18 19 mnemonics, _ := bip39.NewMnemonic(entropy) 20 21 var ugr user.MisesUserMgr 22 pUgr := &ugr 23 cuser, _ := pUgr.CreateUser(mnemonics, "123456") 24 25 return cuser 26 } 27 28 func TestSdkNewForUesr(t *testing.T) { 29 misesid.DeleteKeyStoreFile() 30 mo := sdk.MSdkOption{ 31 ChainID: "test", 32 Debug: true, 33 } 34 35 // test NewSdkForUser 36 s := sdk.NewSdkForUser(mo, "123456") 37 38 ugr := s.UserMgr() 39 40 // test CreateUser 41 mnemonics, err := misesid.RandomMnemonics() 42 assert.NoError(t, err) 43 fmt.Printf("mnemonics is: %s\n", mnemonics) 44 45 newUser, err := ugr.CreateUser(mnemonics, "123456") 46 assert.NoError(t, err) 47 48 // fmt.Printf("keystore version is: %d\n", misesid.Ks.Version) 49 // fmt.Printf("keystore id is: %s\n", misesid.Ks.MId) 50 // fmt.Printf("keystore address is: %s\n", misesid.Ks.PubKey) 51 // fmt.Printf("keystore kdf is: %s\n", misesid.Ks.Crypto.Kdf) 52 // fmt.Printf("keystore dklen is: %d\n", misesid.Ks.Crypto.KdfParams.Dklen) 53 // fmt.Printf("keystore salt is: %s\n", misesid.Ks.Crypto.KdfParams.Salt) 54 // fmt.Printf("keystore n is: %d\n", misesid.Ks.Crypto.KdfParams.N) 55 // fmt.Printf("keystore r is: %d\n", misesid.Ks.Crypto.KdfParams.R) 56 // fmt.Printf("keystore p is: %d\n", misesid.Ks.Crypto.KdfParams.P) 57 // fmt.Printf("keystore cipher is: %s\n", misesid.Ks.Crypto.Cipher) 58 // fmt.Printf("keystore ciphertext is: %s\n", misesid.Ks.Crypto.Ciphertext) 59 // fmt.Printf("keystore iv is: %s\n", misesid.Ks.Crypto.CipherParams.Iv) 60 // fmt.Printf("keystore mac is: %s\n", misesid.Ks.Crypto.Mac) 61 62 u := ugr.ActiveUser() 63 assert.True(t, u != nil) 64 assert.True(t, newUser.MisesID() == u.MisesID()) 65 fmt.Printf("user's mid is %s\n", u.MisesID()) 66 fmt.Printf("user's pubKey is %s\n", u.Signer().PubKey()) 67 68 // test Login, sign & verify 69 permissions := []string{"user_info_r", "user_info_w"} 70 auth, err := s.Login("mises.site", permissions) 71 assert.NoError(t, err) 72 73 fmt.Printf("auth string is: %s\n", auth) 74 75 // v, err := url.ParseQuery(auth) 76 // assert.NoError(t, err) 77 // misesID := v.Get("mises_id") 78 // sigStr := v.Get("sig") 79 // nonce := v.Get("nonce") 80 81 // err = misesid.Verify(misesID+"&"+nonce, u.Signer().PubKey(), sigStr) 82 // assert.NoError(t, err) 83 // if err == nil { 84 // fmt.Printf("signature is verified\n") 85 // } else { 86 // fmt.Printf("Signature verification is failed\n") 87 // } 88 89 misesid.DeleteKeyStoreFile() 90 appinfo := types.NewMisesAppInfoReadonly( 91 "Mises Discover", 92 "https://www.mises.site", 93 "https://home.mises.site", 94 []string{"mises.site"}, 95 "Mises Network", 96 ) 97 sApp, _ := sdk.NewSdkForApp(mo, appinfo) 98 99 mid, _, err := sApp.VerifyLogin(auth) 100 assert.NoError(t, err) 101 assert.True(t, mid == u.MisesID()) 102 103 } 104 105 func TestSdkVerifyLogin(t *testing.T) { 106 misesid.DeleteKeyStoreFile() 107 mo := sdk.MSdkOption{ 108 ChainID: "test", 109 Debug: true, 110 } 111 112 appinfo := types.NewMisesAppInfoReadonly( 113 "Mises Discover", 114 "https://www.mises.site", 115 "https://home.mises.site", 116 []string{"mises.site"}, 117 "Mises Network", 118 ) 119 sApp, _ := sdk.NewSdkForApp(mo, appinfo) 120 auth := "mises_id=did:mises:mises1y53kz80x5gm2w0ype8x7a3w6sstztxxg7qkl5n&nonce=0123456789&sig=304402201ada63a9dccc8ace5b3c96b00817311a36096c997e081b57f8b39b2392a51905022041e74283ec05333062a3a7180ba2775b5e203e596c3cefd8b92b775b519b7e06&pubkey=03e78b0e4bddddabd37bca173c9df270096ec55aa97bed2ba82d72c830d400c8e5" 121 122 mid, _, err := sApp.VerifyLogin(auth) 123 assert.NoError(t, err) 124 assert.True(t, mid == "did:mises:mises1y53kz80x5gm2w0ype8x7a3w6sstztxxg7qkl5n") 125 126 } 127 128 func TestSdkActiveUesr(t *testing.T) { 129 misesid.DeleteKeyStoreFile() 130 mo := sdk.MSdkOption{ 131 ChainID: "test", 132 Debug: true, 133 } 134 135 // test NewSdkForUser 136 s := sdk.NewSdkForUser(mo, "123456") 137 138 ugr := s.UserMgr() 139 140 u := ugr.ActiveUser() 141 assert.True(t, u == nil) 142 mnemonics, err := misesid.RandomMnemonics() 143 assert.NoError(t, err) 144 fmt.Printf("mnemonics is: %s\n", mnemonics) 145 146 newUser, err := ugr.CreateUser(mnemonics, "123456") 147 assert.NoError(t, err) 148 149 u = ugr.ActiveUser() 150 assert.True(t, u.MisesID() == newUser.MisesID()) 151 152 s = sdk.NewSdkForUser(mo, "123456") 153 ugr = s.UserMgr() 154 u = ugr.ActiveUser() 155 assert.NotNil(t, u) 156 157 s = sdk.NewSdkForUser(mo, "") 158 ugr = s.UserMgr() 159 u = ugr.ActiveUser() 160 assert.Nil(t, u) 161 162 } 163 164 func TestSdkRegisterUser(t *testing.T) { 165 mo := sdk.MSdkOption{ 166 ChainID: "test", 167 Debug: true, 168 } 169 170 appinfo := types.NewMisesAppInfoReadonly( 171 "Mises Discover", 172 "https://www.mises.site", 173 "https://home.mises.site", 174 []string{"mises.site"}, 175 "Mises Network", 176 ) 177 _, app := sdk.NewSdkForApp(mo, appinfo) 178 179 newUser := CreateRandomUser() 180 181 err := app.RunSync(app.NewRegisterUserCmd(newUser.MisesID(), newUser.Signer().PubKey(), 100000)) 182 assert.NoError(t, err) 183 184 } 185 186 type RegisterUserCallback struct { 187 done chan bool 188 successCount int 189 failCount int 190 maxCount int 191 } 192 193 func (cb *RegisterUserCallback) OnTxGenerated(cmd types.MisesAppCmd) { 194 fmt.Printf("OnTxGenerated %s %s\n", cmd.MisesUID(), cmd.TxID()) 195 } 196 func (cb *RegisterUserCallback) OnSucceed(cmd types.MisesAppCmd) { 197 fmt.Printf("OnSucceed %d %s %s\n", cb.successCount, cmd.MisesUID(), cmd.TxID()) 198 cb.successCount += 1 199 if cb.successCount == cb.maxCount { 200 cb.done <- true 201 } 202 } 203 func (cb *RegisterUserCallback) OnFailed(cmd types.MisesAppCmd, err error) { 204 fmt.Printf("OnFailed %s\n", cmd.TxID()) 205 cb.failCount += 1 206 if cb.failCount > 10 { 207 cb.done <- true 208 } 209 } 210 func (cb *RegisterUserCallback) wait() { 211 <-cb.done 212 } 213 214 func TestHexDuplication(t *testing.T) { 215 mo := sdk.MSdkOption{ 216 ChainID: "test", 217 Debug: true, 218 } 219 220 appinfo := types.NewMisesAppInfoReadonly( 221 "Mises Discover", 222 "https://www.mises.site", 223 "https://home.mises.site", 224 []string{"mises.site"}, 225 "Mises Network", 226 ) 227 _, app := sdk.NewSdkForApp(mo, appinfo) 228 229 callback := &RegisterUserCallback{} 230 callback.done = make(chan bool) 231 callback.maxCount = 1 232 app.SetListener(callback) 233 234 err := app.RunAsync(app.NewRegisterUserCmd("did:mises:mises1jprvqruscc6unxdyan9738s3qcxzgsykhx97me", "032e1cc6a8396a407c0c2c9586c16531f09ee727750db919bf116b28146f1c7454", 1000), false) 235 if err != nil { 236 fmt.Printf(err.Error()) 237 return 238 } 239 callback.wait() 240 241 } 242 243 func BenchmarkSdkRegisterUserFlooding(t *testing.B) { 244 mo := sdk.MSdkOption{ 245 ChainID: "test", 246 Debug: true, 247 } 248 249 appinfo := types.NewMisesAppInfoReadonly( 250 "Mises Discover", 251 "https://www.mises.site", 252 "https://home.mises.site", 253 []string{"mises.site"}, 254 "Mises Network", 255 ) 256 _, app := sdk.NewSdkForApp(mo, appinfo) 257 258 callback := &RegisterUserCallback{} 259 callback.done = make(chan bool) 260 callback.maxCount = 10000 261 app.SetListener(callback) 262 for userIndex := 0; userIndex < callback.maxCount; userIndex++ { 263 newUser := CreateRandomUser() 264 265 err := app.RunAsync(app.NewRegisterUserCmd(newUser.MisesID(), newUser.Signer().PubKey(), 1000), false) 266 if err != nil { 267 fmt.Printf(err.Error()) 268 return 269 } 270 } 271 callback.wait() 272 273 } 274 275 type FaucetCallback struct { 276 } 277 278 func (cb *FaucetCallback) OnTxGenerated(cmd types.MisesAppCmd) { 279 fmt.Printf("OnTxGenerated\n") 280 } 281 func (cb *FaucetCallback) OnSucceed(cmd types.MisesAppCmd) { 282 fmt.Printf("OnSucceed\n") 283 } 284 func (cb *FaucetCallback) OnFailed(cmd types.MisesAppCmd, err error) { 285 fmt.Printf("OnFailed\n") 286 } 287 288 func TestSdkFaucet(t *testing.T) { 289 mo := sdk.MSdkOption{ 290 ChainID: "test", 291 Debug: true, 292 PassPhrase: "mises.site", 293 } 294 295 appinfo := types.NewMisesAppInfoReadonly( 296 "Mises Faucet", 297 "https://www.mises.site", 298 "https://home.mises.site", 299 []string{"mises.site"}, 300 "Mises Network", 301 ) 302 _, app := sdk.NewSdkForApp(mo, appinfo) 303 304 app.SetListener(&FaucetCallback{}) 305 newUser := CreateRandomUser() 306 307 err := app.RunSync(app.NewFaucetCmd(newUser.MisesID(), newUser.Signer().PubKey(), 100)) 308 assert.NoError(t, err) 309 310 }