github.com/mavryk-network/mvgo@v1.19.9/micheline/key_test.go (about)

     1  // Copyright (c) 2021 Blockwatch Data Inc.
     2  // Author: alex@blockwatch.cc
     3  //
     4  
     5  package micheline
     6  
     7  import (
     8  	"bytes"
     9  	"encoding/hex"
    10  	"encoding/json"
    11  	"testing"
    12  
    13  	"github.com/mavryk-network/mvgo/mavryk"
    14  )
    15  
    16  type keyTest struct {
    17  	Name   string
    18  	Type   string
    19  	Hash   mavryk.ExprHash
    20  	Hex    string
    21  	Value  json.RawMessage
    22  	String string
    23  	Prim   Prim
    24  }
    25  
    26  var keyInfo = []keyTest{
    27  	// scalars
    28  	//   int
    29  	{
    30  		Name:   "int",
    31  		Type:   "int",
    32  		Hash:   mavryk.MustParseExprHash("exprv6n4YrvfCD2N6JmSF9aZxtcrcDCDV5YAFpaJDhJU6bhmNHz3YK"),
    33  		Hex:    "00a005",
    34  		Value:  []byte(`"352"`),
    35  		String: "352",
    36  		Prim:   NewInt64(352),
    37  	},
    38  	//   nat
    39  	{
    40  		Name:   "nat",
    41  		Type:   "nat",
    42  		Hash:   mavryk.MustParseExprHash("expruE5MGe6oKRLTiog6iBZzpztj5kCGzMEYBfWzsVebPnhn43ndYa"),
    43  		Hex:    "008eb818",
    44  		Value:  []byte(`"200206"`),
    45  		String: "200206",
    46  		Prim:   NewInt64(200206),
    47  	},
    48  	//   mumav
    49  	{
    50  		Name:   "mumav",
    51  		Type:   "mumav",
    52  		Hash:   mavryk.MustParseExprHash("expruE5MGe6oKRLTiog6iBZzpztj5kCGzMEYBfWzsVebPnhn43ndYa"),
    53  		Hex:    "008eb818",
    54  		Value:  []byte(`"200206"`),
    55  		String: "200206",
    56  		Prim:   NewInt64(200206),
    57  	},
    58  	//   unit
    59  	{
    60  		Name:   "unit",
    61  		Type:   "unit",
    62  		Hash:   mavryk.MustParseExprHash("expruaDPoTWXcTR6fiQPy4KZSW72U6Swc1rVmMiP1KdwmCceeEpVjd"),
    63  		Hex:    "030b",
    64  		Value:  []byte(`null`),
    65  		String: "Unit",
    66  		Prim:   NewCode(D_UNIT),
    67  	},
    68  	//   string
    69  	{
    70  		Name:   "string",
    71  		Type:   "string",
    72  		Hash:   mavryk.MustParseExprHash("exprtiRSZkLKYRess9GZ3ryb4cVQD36WLo2oysZBFxKTZ2jXqcHWGj"),
    73  		Hex:    "010000000947616d65206f6e6521",
    74  		Value:  []byte(`"Game one!"`),
    75  		String: "Game one!",
    76  		Prim:   NewString("Game one!"),
    77  	},
    78  	//   bytes
    79  	{
    80  		Name:   "bytes",
    81  		Type:   "bytes",
    82  		Hash:   mavryk.MustParseExprHash("expruLUtQBGu3aw4onM4nA9A8UM7PrDh3pbcrqnrFpzAAuTd12Ggdv"),
    83  		Hex:    "0a000000209e2dce28b861646c13c2b9cf4245e483a837525f2d1547a410293e29c3734d6e",
    84  		Value:  []byte(`"9e2dce28b861646c13c2b9cf4245e483a837525f2d1547a410293e29c3734d6e"`),
    85  		String: "9e2dce28b861646c13c2b9cf4245e483a837525f2d1547a410293e29c3734d6e",
    86  		Prim:   NewBytes([]byte{0x9e, 0x2d, 0xce, 0x28, 0xb8, 0x61, 0x64, 0x6c, 0x13, 0xc2, 0xb9, 0xcf, 0x42, 0x45, 0xe4, 0x83, 0xa8, 0x37, 0x52, 0x5f, 0x2d, 0x15, 0x47, 0xa4, 0x10, 0x29, 0x3e, 0x29, 0xc3, 0x73, 0x4d, 0x6e}),
    87  	},
    88  	//   key_hash
    89  	{
    90  		Name:   "mv1 key_hash",
    91  		Type:   "key_hash",
    92  		Hash:   mavryk.MustParseExprHash("exprtqoHg7oQtzkxaJGFMnGCZGTS1sYmzWGBiBq8678wgzzAAapd21"),
    93  		Hex:    "0a000000150026f32c59c5240691c60ce20ec52cc2afaa47cf62",
    94  		Value:  []byte(`"mv1BZSyyRgGX7QogeDCanY1Mr3VD9UwBJGFM"`),
    95  		String: "mv1BZSyyRgGX7QogeDCanY1Mr3VD9UwBJGFM",
    96  		Prim:   NewBytes(mavryk.MustParseAddress("mv1BZSyyRgGX7QogeDCanY1Mr3VD9UwBJGFM").Encode()),
    97  	},
    98  	//   address
    99  	{
   100  		Name:   "mv1 address",
   101  		Type:   "address",
   102  		Hash:   mavryk.MustParseExprHash("expruUXWZpQ8CbM2KQR3zZLcvfbs75J247Bac2yrQHNaTrcboWdptW"),
   103  		Hex:    "0a000000160000449cf979e666c4706a26c8176f930e35d5b42493",
   104  		Value:  []byte(`"mv1EGHzY37ttLfXHRxxZJNQ9aVWQJe95voSo"`),
   105  		String: "mv1EGHzY37ttLfXHRxxZJNQ9aVWQJe95voSo",
   106  		Prim:   NewBytes(mavryk.MustParseAddress("mv1EGHzY37ttLfXHRxxZJNQ9aVWQJe95voSo").EncodePadded()),
   107  	},
   108  	{
   109  		Name:   "KT1 address",
   110  		Type:   "address",
   111  		Hash:   mavryk.MustParseExprHash("exprvAHu1SyoiSzyh9w7GPfifvyrNiMb442y7Q2MA8tcPCGPajxRH6"),
   112  		Hex:    "0a0000001601a3d0f58d8964bd1b37fb0a0c197b38cf46608d4900",
   113  		Value:  []byte(`"KT1PWx2mnDueood7fEmfbBDKx1D9BAnnXitn"`),
   114  		String: "KT1PWx2mnDueood7fEmfbBDKx1D9BAnnXitn",
   115  		Prim:   NewBytes(mavryk.MustParseAddress("KT1PWx2mnDueood7fEmfbBDKx1D9BAnnXitn").EncodePadded()),
   116  	},
   117  
   118  	//   timestamp as string
   119  	//   timestamp as unix seconds
   120  	//   timestamp with out-of-range year
   121  	//   key
   122  	{
   123  		Name:   "key",
   124  		Type:   "key",
   125  		Hash:   mavryk.MustParseExprHash("exprv1Vjr2jWEzSALFrHaoubi3jELpXvnMtGNG4ZJPDMRHxrQtyBDW"),
   126  		Hex:    "0a000000210078149c2d111816aaef9e329970c344fc32375dd5eff99eeeed3b37a9d51beacd",
   127  		Value:  []byte(`"edpkuZ7ERiU5B8knLqQsVMH86j9RLMUyHyL665oCXDkPQxF7HGqSeJ"`),
   128  		String: "edpkuZ7ERiU5B8knLqQsVMH86j9RLMUyHyL665oCXDkPQxF7HGqSeJ",
   129  		Prim:   NewBytes(mavryk.MustParseKey("edpkuZ7ERiU5B8knLqQsVMH86j9RLMUyHyL665oCXDkPQxF7HGqSeJ").Bytes()),
   130  	},
   131  	//   signature
   132  	//   bool
   133  
   134  	// composites
   135  	//   pair
   136  	{
   137  		Name:   "Pair(address,nat)",
   138  		Type:   "pair",
   139  		Hash:   mavryk.MustParseExprHash("exprvD1v8DxXvrsCqbx7BA2ZqxYuUk9jXE1QrXuL46i3MWG6o1szUq"),
   140  		Hex:    "07070a0000001600005db799bf9b0dc319ba1cf21ab01461a9639043ca009902",
   141  		Value:  []byte(`{"0":"mv1GZ2nLrBcdGpecDeTqTCXMVdZuoTUecDks","1":"153"}`),
   142  		String: "mv1GZ2nLrBcdGpecDeTqTCXMVdZuoTUecDks,153",
   143  		Prim: NewPair(
   144  			NewBytes(mavryk.MustParseAddress("mv1GZ2nLrBcdGpecDeTqTCXMVdZuoTUecDks").EncodePadded()),
   145  			NewInt64(153),
   146  		),
   147  	},
   148  	{
   149  		Name:   "Pair(address,string)",
   150  		Type:   "pair",
   151  		Hash:   mavryk.MustParseExprHash("expruCp21FBR8PnYGy2QQnAA684LTQJhUVvM1GCVP8CyY3WeLJSzWh"),
   152  		Hex:    "07070a0000001600002ca7bca83fa8cfbb594c013d611d08eae48a9f3b01000000094449435245524a3238",
   153  		Value:  []byte(`{"0":"mv1C5cfidAuDUVZgZjjuGgAskjxPftLrShLx","1":"DICRERJ28"}`),
   154  		String: "mv1C5cfidAuDUVZgZjjuGgAskjxPftLrShLx,DICRERJ28",
   155  		Prim: NewPair(
   156  			NewBytes(mavryk.MustParseAddress("mv1C5cfidAuDUVZgZjjuGgAskjxPftLrShLx").EncodePadded()),
   157  			NewString("DICRERJ28"),
   158  		),
   159  	},
   160  	{
   161  		Name:   "Pair(address,address,nat)",
   162  		Type:   "pair",
   163  		Hash:   mavryk.MustParseExprHash("expruV4TWZLF1QLgBT2sLehF5LLUTgrQZRjrJcBFiTcyHACyCfejLc"),
   164  		Hex:    "07070a0000001600009b671169734f0ba7c9853d03b5512cfbe404fe0f07070a0000001601c953466e6cf9295ecad052acc742247dd0e3c91900008f01",
   165  		Value:  []byte(`{"0":"mv1NBCCjdZe99TYysW3JCcEJzKrcVwf29bdX","1":"KT1SwH9P1Tx8a58Mm6qBExQFTcy2rwZyZiXS","2":"79"}`),
   166  		String: "mv1NBCCjdZe99TYysW3JCcEJzKrcVwf29bdX,KT1SwH9P1Tx8a58Mm6qBExQFTcy2rwZyZiXS,79",
   167  		Prim: NewPair(
   168  			NewBytes(mavryk.MustParseAddress("mv1NBCCjdZe99TYysW3JCcEJzKrcVwf29bdX").EncodePadded()),
   169  			NewPair(
   170  				NewBytes(mavryk.MustParseAddress("KT1SwH9P1Tx8a58Mm6qBExQFTcy2rwZyZiXS").EncodePadded()),
   171  				NewInt64(79),
   172  			),
   173  		),
   174  	},
   175  	//   option
   176  	//   or / union
   177  
   178  	// specials
   179  	//   packed key
   180  
   181  }
   182  
   183  func TestKeyParser(t *testing.T) {
   184  	for _, test := range keyInfo {
   185  		t.Run(test.Name, func(T *testing.T) {
   186  			typ, err := ParseKeyType(test.Type)
   187  			if err != nil {
   188  				T.Errorf("key type error: %v", err)
   189  				T.FailNow()
   190  			}
   191  			key, err := ParseKey(typ, test.String)
   192  			if err != nil {
   193  				T.Errorf("key parse error: %v", err)
   194  				T.FailNow()
   195  			}
   196  
   197  			// encode and check against bytes
   198  			buf := key.Bytes()
   199  			hx, _ := hex.DecodeString(test.Hex)
   200  			if !bytes.Equal(buf, hx) {
   201  				T.Errorf("binary encoding mismatch:\n    want: %x\n    got:  %x", hx, buf)
   202  			}
   203  
   204  			// check against prim
   205  			prim := key.Prim()
   206  			if !prim.IsEqual(test.Prim) {
   207  				T.Errorf("prim mismatch:\n    want: %s\n    got:  %s", test.Prim.Dump(), prim.Dump())
   208  			}
   209  
   210  			// generate hash and compare
   211  			hs := key.Hash()
   212  			if !hs.Equal(test.Hash) {
   213  				T.Errorf("hash mismatch:\n    want: %s\n    got:  %s", test.Hash, hs)
   214  			}
   215  		})
   216  	}
   217  }
   218  
   219  func TestKeyRendering(t *testing.T) {
   220  	for _, test := range keyInfo {
   221  		t.Run(test.Name, func(T *testing.T) {
   222  			typ, err := ParseKeyType(test.Type)
   223  			if err != nil {
   224  				T.Errorf("key type error: %v", err)
   225  				T.FailNow()
   226  			}
   227  			key, err := NewKey(NewType(NewPrim(typ)), test.Prim)
   228  			if err != nil {
   229  				T.Errorf("new key error: %v", err)
   230  				T.FailNow()
   231  			}
   232  
   233  			// marshal string
   234  			if want, have := test.String, key.String(); want != have {
   235  				T.Errorf("string mismatch:\n    want: %s\n    got:  %s", want, have)
   236  			}
   237  
   238  			// encode and check against bytes
   239  			buf := key.Bytes()
   240  			hx, _ := hex.DecodeString(test.Hex)
   241  			if !bytes.Equal(buf, hx) {
   242  				T.Errorf("binary encoding mismatch:\n    want: %x\n    got:  %x", hx, buf)
   243  			}
   244  
   245  			// marshal JSON
   246  			have, err := key.MarshalJSON()
   247  			if err != nil {
   248  				T.Errorf("marshal error: %v", err)
   249  			}
   250  			if !jsonDiff(T, have, []byte(test.Value)) {
   251  				T.Error("render mismatch, see log for details")
   252  				t.FailNow()
   253  			}
   254  
   255  			// generate hash and compare
   256  			hs := key.Hash()
   257  			if !hs.Equal(test.Hash) {
   258  				T.Errorf("hash mismatch:\n    want: %s\n    got:  %s", test.Hash, hs)
   259  			}
   260  		})
   261  	}
   262  }