github.com/klaytn/klaytn@v1.10.2/common/types_test.go (about) 1 // Modifications Copyright 2018 The klaytn Authors 2 // Copyright 2015 The go-ethereum Authors 3 // This file is part of the go-ethereum library. 4 // 5 // The go-ethereum library is free software: you can redistribute it and/or modify 6 // it under the terms of the GNU Lesser General Public License as published by 7 // the Free Software Foundation, either version 3 of the License, or 8 // (at your option) any later version. 9 // 10 // The go-ethereum library is distributed in the hope that it will be useful, 11 // but WITHOUT ANY WARRANTY; without even the implied warranty of 12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 // GNU Lesser General Public License for more details. 14 // 15 // You should have received a copy of the GNU Lesser General Public License 16 // along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>. 17 // 18 // This file is derived from common/types_test.go (2018/06/04). 19 // Modified and improved for the klaytn development. 20 21 package common 22 23 import ( 24 "encoding/json" 25 "math/big" 26 "strings" 27 "testing" 28 ) 29 30 func TestBytesConversion(t *testing.T) { 31 bytes := []byte{5} 32 hash := BytesToHash(bytes) 33 34 var exp Hash 35 exp[31] = 5 36 37 if hash != exp { 38 t.Errorf("expected %x got %x", exp, hash) 39 } 40 } 41 42 func TestIsHexAddress(t *testing.T) { 43 tests := []struct { 44 str string 45 exp bool 46 }{ 47 {"0x5aaeb6053f3e94c9b9a09f33669435e7ef1beaed", true}, 48 {"5aaeb6053f3e94c9b9a09f33669435e7ef1beaed", true}, 49 {"0X5aaeb6053f3e94c9b9a09f33669435e7ef1beaed", true}, 50 {"0XAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", true}, 51 {"0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", true}, 52 {"0x5aaeb6053f3e94c9b9a09f33669435e7ef1beaed1", false}, 53 {"0x5aaeb6053f3e94c9b9a09f33669435e7ef1beae", false}, 54 {"5aaeb6053f3e94c9b9a09f33669435e7ef1beaed11", false}, 55 {"0xxaaeb6053f3e94c9b9a09f33669435e7ef1beaed", false}, 56 } 57 58 for _, test := range tests { 59 if result := IsHexAddress(test.str); result != test.exp { 60 t.Errorf("IsHexAddress(%s) == %v; expected %v", 61 test.str, result, test.exp) 62 } 63 } 64 } 65 66 func TestHashJsonValidation(t *testing.T) { 67 tests := []struct { 68 Prefix string 69 Size int 70 Error string 71 }{ 72 {"", 62, "json: cannot unmarshal hex string without 0x prefix into Go value of type common.Hash"}, 73 {"0x", 66, "hex string has length 66, want 64 for common.Hash"}, 74 {"0x", 63, "json: cannot unmarshal hex string of odd length into Go value of type common.Hash"}, 75 {"0x", 0, "hex string has length 0, want 64 for common.Hash"}, 76 {"0x", 64, ""}, 77 {"0X", 64, ""}, 78 } 79 for _, test := range tests { 80 input := `"` + test.Prefix + strings.Repeat("0", test.Size) + `"` 81 var v Hash 82 err := json.Unmarshal([]byte(input), &v) 83 if err == nil { 84 if test.Error != "" { 85 t.Errorf("%s: error mismatch: have nil, want %q", input, test.Error) 86 } 87 } else { 88 if err.Error() != test.Error { 89 t.Errorf("%s: error mismatch: have %q, want %q", input, err, test.Error) 90 } 91 } 92 } 93 } 94 95 func TestAddressUnmarshalJSON(t *testing.T) { 96 tests := []struct { 97 Input string 98 ShouldErr bool 99 Output *big.Int 100 }{ 101 {"", true, nil}, 102 {`""`, true, nil}, 103 {`"0x"`, true, nil}, 104 {`"0x00"`, true, nil}, 105 {`"0xG000000000000000000000000000000000000000"`, true, nil}, 106 {`"0x0000000000000000000000000000000000000000"`, false, big.NewInt(0)}, 107 {`"0x0000000000000000000000000000000000000010"`, false, big.NewInt(16)}, 108 } 109 for i, test := range tests { 110 var v Address 111 err := json.Unmarshal([]byte(test.Input), &v) 112 if err != nil && !test.ShouldErr { 113 t.Errorf("test #%d: unexpected error: %v", i, err) 114 } 115 if err == nil { 116 if test.ShouldErr { 117 t.Errorf("test #%d: expected error, got none", i) 118 } 119 if got := new(big.Int).SetBytes(v.Bytes()); got.Cmp(test.Output) != 0 { 120 t.Errorf("test #%d: address mismatch: have %v, want %v", i, got, test.Output) 121 } 122 } 123 } 124 } 125 126 func TestAddressHexChecksum(t *testing.T) { 127 tests := []struct { 128 Input string 129 Output string 130 }{ 131 // Test cases from https://github.com/ethereum/EIPs/blob/master/EIPS/eip-55.md#specification 132 {"0x5aaeb6053f3e94c9b9a09f33669435e7ef1beaed", "0x5aAeb6053F3E94C9b9A09f33669435E7Ef1BeAed"}, 133 {"0xfb6916095ca1df60bb79ce92ce3ea74c37c5d359", "0xfB6916095ca1df60bB79Ce92cE3Ea74c37c5d359"}, 134 {"0xdbf03b407c01e7cd3cbea99509d93f8dddc8c6fb", "0xdbF03B407c01E7cD3CBea99509d93f8DDDC8C6FB"}, 135 {"0xd1220a0cf47c7b9be7a2e6ba89f429762e7b9adb", "0xD1220A0cf47c7B9Be7A2E6BA89F429762e7b9aDb"}, 136 // Ensure that non-standard length input values are handled correctly 137 {"0xa", "0x000000000000000000000000000000000000000A"}, 138 {"0x0a", "0x000000000000000000000000000000000000000A"}, 139 {"0x00a", "0x000000000000000000000000000000000000000A"}, 140 {"0x000000000000000000000000000000000000000a", "0x000000000000000000000000000000000000000A"}, 141 } 142 for i, test := range tests { 143 output := HexToAddress(test.Input).Hex() 144 if output != test.Output { 145 t.Errorf("test #%d: failed to match when it should (%s != %s)", i, output, test.Output) 146 } 147 } 148 } 149 150 func BenchmarkAddressHex(b *testing.B) { 151 testAddr := HexToAddress("0x5aaeb6053f3e94c9b9a09f33669435e7ef1beaed") 152 for n := 0; n < b.N; n++ { 153 testAddr.Hex() 154 } 155 } 156 157 // TODO-Klaytn-FailedTest Klaytn doesn't have MixedcaseAddress type 158 /* 159 func TestMixedcaseAccount_Address(t *testing.T) { 160 161 // https://github.com/ethereum/EIPs/blob/master/EIPS/eip-55.md 162 // Note: 0X{checksum_addr} is not valid according to spec above 163 164 var res []struct { 165 A MixedcaseAddress 166 Valid bool 167 } 168 if err := json.Unmarshal([]byte(`[ 169 {"A" : "0xae967917c465db8578ca9024c205720b1a3651A9", "Valid": false}, 170 {"A" : "0xAe967917c465db8578ca9024c205720b1a3651A9", "Valid": true}, 171 {"A" : "0XAe967917c465db8578ca9024c205720b1a3651A9", "Valid": false}, 172 {"A" : "0x1111111111111111111112222222222223333323", "Valid": true} 173 ]`), &res); err != nil { 174 t.Fatal(err) 175 } 176 177 for _, r := range res { 178 if got := r.A.ValidChecksum(); got != r.Valid { 179 t.Errorf("Expected checksum %v, got checksum %v, input %v", r.Valid, got, r.A.String()) 180 } 181 } 182 183 //These should throw exceptions: 184 var r2 []MixedcaseAddress 185 for _, r := range []string{ 186 `["0x11111111111111111111122222222222233333"]`, // Too short 187 `["0x111111111111111111111222222222222333332"]`, // Too short 188 `["0x11111111111111111111122222222222233333234"]`, // Too long 189 `["0x111111111111111111111222222222222333332344"]`, // Too long 190 `["1111111111111111111112222222222223333323"]`, // Missing 0x 191 `["x1111111111111111111112222222222223333323"]`, // Missing 0 192 `["0xG111111111111111111112222222222223333323"]`, //Non-hex 193 } { 194 if err := json.Unmarshal([]byte(r), &r2); err == nil { 195 t.Errorf("Expected failure, input %v", r) 196 } 197 198 } 199 200 } 201 */