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 }