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  }