github.com/Night-mk/quorum@v21.1.0+incompatible/common/types_test.go (about)

     1  // Copyright 2015 The go-ethereum Authors
     2  // This file is part of the go-ethereum library.
     3  //
     4  // The go-ethereum library is free software: you can redistribute it and/or modify
     5  // it under the terms of the GNU Lesser General Public License as published by
     6  // the Free Software Foundation, either version 3 of the License, or
     7  // (at your option) any later version.
     8  //
     9  // The go-ethereum library is distributed in the hope that it will be useful,
    10  // but WITHOUT ANY WARRANTY; without even the implied warranty of
    11  // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
    12  // GNU Lesser General Public License for more details.
    13  //
    14  // You should have received a copy of the GNU Lesser General Public License
    15  // along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
    16  
    17  package common
    18  
    19  import (
    20  	"database/sql/driver"
    21  	"encoding/base64"
    22  	"encoding/json"
    23  	"math/big"
    24  	"reflect"
    25  	"strings"
    26  	"testing"
    27  
    28  	"github.com/stretchr/testify/assert"
    29  )
    30  
    31  func TestBytesConversion(t *testing.T) {
    32  	bytes := []byte{5}
    33  	hash := BytesToHash(bytes)
    34  
    35  	var exp Hash
    36  	exp[31] = 5
    37  
    38  	if hash != exp {
    39  		t.Errorf("expected %x got %x", exp, hash)
    40  	}
    41  }
    42  
    43  func TestIsHexAddress(t *testing.T) {
    44  	tests := []struct {
    45  		str string
    46  		exp bool
    47  	}{
    48  		{"0x5aaeb6053f3e94c9b9a09f33669435e7ef1beaed", true},
    49  		{"5aaeb6053f3e94c9b9a09f33669435e7ef1beaed", true},
    50  		{"0X5aaeb6053f3e94c9b9a09f33669435e7ef1beaed", true},
    51  		{"0XAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", true},
    52  		{"0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", true},
    53  		{"0x5aaeb6053f3e94c9b9a09f33669435e7ef1beaed1", false},
    54  		{"0x5aaeb6053f3e94c9b9a09f33669435e7ef1beae", false},
    55  		{"5aaeb6053f3e94c9b9a09f33669435e7ef1beaed11", false},
    56  		{"0xxaaeb6053f3e94c9b9a09f33669435e7ef1beaed", false},
    57  	}
    58  
    59  	for _, test := range tests {
    60  		if result := IsHexAddress(test.str); result != test.exp {
    61  			t.Errorf("IsHexAddress(%s) == %v; expected %v",
    62  				test.str, result, test.exp)
    63  		}
    64  	}
    65  }
    66  
    67  func TestHashJsonValidation(t *testing.T) {
    68  	var tests = []struct {
    69  		Prefix string
    70  		Size   int
    71  		Error  string
    72  	}{
    73  		{"", 62, "json: cannot unmarshal hex string without 0x prefix into Go value of type common.Hash"},
    74  		{"0x", 66, "hex string has length 66, want 64 for common.Hash"},
    75  		{"0x", 63, "json: cannot unmarshal hex string of odd length into Go value of type common.Hash"},
    76  		{"0x", 0, "hex string has length 0, want 64 for common.Hash"},
    77  		{"0x", 64, ""},
    78  		{"0X", 64, ""},
    79  	}
    80  	for _, test := range tests {
    81  		input := `"` + test.Prefix + strings.Repeat("0", test.Size) + `"`
    82  		var v Hash
    83  		err := json.Unmarshal([]byte(input), &v)
    84  		if err == nil {
    85  			if test.Error != "" {
    86  				t.Errorf("%s: error mismatch: have nil, want %q", input, test.Error)
    87  			}
    88  		} else {
    89  			if err.Error() != test.Error {
    90  				t.Errorf("%s: error mismatch: have %q, want %q", input, err, test.Error)
    91  			}
    92  		}
    93  	}
    94  }
    95  
    96  func TestAddressUnmarshalJSON(t *testing.T) {
    97  	var tests = []struct {
    98  		Input     string
    99  		ShouldErr bool
   100  		Output    *big.Int
   101  	}{
   102  		{"", true, nil},
   103  		{`""`, true, nil},
   104  		{`"0x"`, true, nil},
   105  		{`"0x00"`, true, nil},
   106  		{`"0xG000000000000000000000000000000000000000"`, true, nil},
   107  		{`"0x0000000000000000000000000000000000000000"`, false, big.NewInt(0)},
   108  		{`"0x0000000000000000000000000000000000000010"`, false, big.NewInt(16)},
   109  	}
   110  	for i, test := range tests {
   111  		var v Address
   112  		err := json.Unmarshal([]byte(test.Input), &v)
   113  		if err != nil && !test.ShouldErr {
   114  			t.Errorf("test #%d: unexpected error: %v", i, err)
   115  		}
   116  		if err == nil {
   117  			if test.ShouldErr {
   118  				t.Errorf("test #%d: expected error, got none", i)
   119  			}
   120  			if got := new(big.Int).SetBytes(v.Bytes()); got.Cmp(test.Output) != 0 {
   121  				t.Errorf("test #%d: address mismatch: have %v, want %v", i, got, test.Output)
   122  			}
   123  		}
   124  	}
   125  }
   126  
   127  func TestAddressHexChecksum(t *testing.T) {
   128  	var tests = []struct {
   129  		Input  string
   130  		Output string
   131  	}{
   132  		// Test cases from https://github.com/ethereum/EIPs/blob/master/EIPS/eip-55.md#specification
   133  		{"0x5aaeb6053f3e94c9b9a09f33669435e7ef1beaed", "0x5aAeb6053F3E94C9b9A09f33669435E7Ef1BeAed"},
   134  		{"0xfb6916095ca1df60bb79ce92ce3ea74c37c5d359", "0xfB6916095ca1df60bB79Ce92cE3Ea74c37c5d359"},
   135  		{"0xdbf03b407c01e7cd3cbea99509d93f8dddc8c6fb", "0xdbF03B407c01E7cD3CBea99509d93f8DDDC8C6FB"},
   136  		{"0xd1220a0cf47c7b9be7a2e6ba89f429762e7b9adb", "0xD1220A0cf47c7B9Be7A2E6BA89F429762e7b9aDb"},
   137  		// Ensure that non-standard length input values are handled correctly
   138  		{"0xa", "0x000000000000000000000000000000000000000A"},
   139  		{"0x0a", "0x000000000000000000000000000000000000000A"},
   140  		{"0x00a", "0x000000000000000000000000000000000000000A"},
   141  		{"0x000000000000000000000000000000000000000a", "0x000000000000000000000000000000000000000A"},
   142  	}
   143  	for i, test := range tests {
   144  		output := HexToAddress(test.Input).Hex()
   145  		if output != test.Output {
   146  			t.Errorf("test #%d: failed to match when it should (%s != %s)", i, output, test.Output)
   147  		}
   148  	}
   149  }
   150  
   151  func BenchmarkAddressHex(b *testing.B) {
   152  	testAddr := HexToAddress("0x5aaeb6053f3e94c9b9a09f33669435e7ef1beaed")
   153  	for n := 0; n < b.N; n++ {
   154  		testAddr.Hex()
   155  	}
   156  }
   157  
   158  func TestMixedcaseAccount_Address(t *testing.T) {
   159  
   160  	// https://github.com/ethereum/EIPs/blob/master/EIPS/eip-55.md
   161  	// Note: 0X{checksum_addr} is not valid according to spec above
   162  
   163  	var res []struct {
   164  		A     MixedcaseAddress
   165  		Valid bool
   166  	}
   167  	if err := json.Unmarshal([]byte(`[
   168  		{"A" : "0xae967917c465db8578ca9024c205720b1a3651A9", "Valid": false},
   169  		{"A" : "0xAe967917c465db8578ca9024c205720b1a3651A9", "Valid": true},
   170  		{"A" : "0XAe967917c465db8578ca9024c205720b1a3651A9", "Valid": false},
   171  		{"A" : "0x1111111111111111111112222222222223333323", "Valid": true}
   172  		]`), &res); err != nil {
   173  		t.Fatal(err)
   174  	}
   175  
   176  	for _, r := range res {
   177  		if got := r.A.ValidChecksum(); got != r.Valid {
   178  			t.Errorf("Expected checksum %v, got checksum %v, input %v", r.Valid, got, r.A.String())
   179  		}
   180  	}
   181  
   182  	//These should throw exceptions:
   183  	var r2 []MixedcaseAddress
   184  	for _, r := range []string{
   185  		`["0x11111111111111111111122222222222233333"]`,     // Too short
   186  		`["0x111111111111111111111222222222222333332"]`,    // Too short
   187  		`["0x11111111111111111111122222222222233333234"]`,  // Too long
   188  		`["0x111111111111111111111222222222222333332344"]`, // Too long
   189  		`["1111111111111111111112222222222223333323"]`,     // Missing 0x
   190  		`["x1111111111111111111112222222222223333323"]`,    // Missing 0
   191  		`["0xG111111111111111111112222222222223333323"]`,   //Non-hex
   192  	} {
   193  		if err := json.Unmarshal([]byte(r), &r2); err == nil {
   194  			t.Errorf("Expected failure, input %v", r)
   195  		}
   196  
   197  	}
   198  
   199  }
   200  
   201  func TestBytesToEncryptedPayloadHash_whenTypical(t *testing.T) {
   202  	arbitraryBytes := []byte{10}
   203  	var expected EncryptedPayloadHash
   204  	expected[EncryptedPayloadHashLength-1] = 10
   205  
   206  	actual := BytesToEncryptedPayloadHash(arbitraryBytes)
   207  
   208  	assert.Equal(t, expected, actual)
   209  }
   210  
   211  func TestEncryptedPayloadHash_Bytes(t *testing.T) {
   212  	arbitraryBytes := []byte{10}
   213  	h := BytesToEncryptedPayloadHash(arbitraryBytes)
   214  
   215  	actual := h.Bytes()
   216  
   217  	assert.Equal(t, arbitraryBytes[0], actual[EncryptedPayloadHashLength-1])
   218  }
   219  
   220  func TestEncryptedPayloadHash_BytesTypeRef(t *testing.T) {
   221  	arbitraryBytes := []byte{10}
   222  	h := BytesToEncryptedPayloadHash(arbitraryBytes)
   223  	expected := h.Hex()
   224  
   225  	bt := h.BytesTypeRef()
   226  	actual := bt.String()
   227  
   228  	assert.Equal(t, expected, actual)
   229  }
   230  
   231  func TestEncryptedPayloadHash_ToBase64(t *testing.T) {
   232  	arbitraryBytes := []byte{10}
   233  	h := BytesToEncryptedPayloadHash(arbitraryBytes)
   234  	expected := base64.StdEncoding.EncodeToString(h.Bytes())
   235  
   236  	actual := h.ToBase64()
   237  
   238  	assert.Equal(t, expected, actual)
   239  }
   240  
   241  func TestEmptyEncryptedPayloadHash(t *testing.T) {
   242  
   243  	emptyHash := EncryptedPayloadHash{}
   244  
   245  	assert.True(t, EmptyEncryptedPayloadHash(emptyHash))
   246  }
   247  
   248  func TestEncryptedPayloadHashes_whenTypical(t *testing.T) {
   249  	arbitraryBytes1 := []byte{10}
   250  	arbitraryBytes2 := []byte{5}
   251  	h, err := Base64sToEncryptedPayloadHashes([]string{base64.StdEncoding.EncodeToString(arbitraryBytes1), base64.StdEncoding.EncodeToString(arbitraryBytes2)})
   252  	if err != nil {
   253  		t.Fatalf("must be able to convert but fail due to %s", err)
   254  	}
   255  
   256  	arbitraryBytes3 := []byte{7}
   257  	newItem := BytesToEncryptedPayloadHash(arbitraryBytes3)
   258  	h.Add(newItem)
   259  
   260  	assert.False(t, h.NotExist(newItem))
   261  }
   262  
   263  func TestHash_Scan(t *testing.T) {
   264  	type args struct {
   265  		src interface{}
   266  	}
   267  	tests := []struct {
   268  		name    string
   269  		args    args
   270  		wantErr bool
   271  	}{
   272  		{
   273  			name: "working scan",
   274  			args: args{src: []byte{
   275  				0xb2, 0x6f, 0x2b, 0x34, 0x2a, 0xab, 0x24, 0xbc, 0xf6, 0x3e,
   276  				0xa2, 0x18, 0xc6, 0xa9, 0x27, 0x4d, 0x30, 0xab, 0x9a, 0x15,
   277  				0xa2, 0x18, 0xc6, 0xa9, 0x27, 0x4d, 0x30, 0xab, 0x9a, 0x15,
   278  				0x10, 0x00,
   279  			}},
   280  			wantErr: false,
   281  		},
   282  		{
   283  			name:    "non working scan",
   284  			args:    args{src: int64(1234567890)},
   285  			wantErr: true,
   286  		},
   287  		{
   288  			name: "invalid length scan",
   289  			args: args{src: []byte{
   290  				0xb2, 0x6f, 0x2b, 0x34, 0x2a, 0xab, 0x24, 0xbc, 0xf6, 0x3e,
   291  				0xa2, 0x18, 0xc6, 0xa9, 0x27, 0x4d, 0x30, 0xab, 0x9a, 0x15,
   292  				0xa2, 0x18, 0xc6, 0xa9, 0x27, 0x4d, 0x30, 0xab, 0x9a, 0x15,
   293  			}},
   294  			wantErr: true,
   295  		},
   296  	}
   297  	for _, tt := range tests {
   298  		t.Run(tt.name, func(t *testing.T) {
   299  			h := &Hash{}
   300  			if err := h.Scan(tt.args.src); (err != nil) != tt.wantErr {
   301  				t.Errorf("Hash.Scan() error = %v, wantErr %v", err, tt.wantErr)
   302  			}
   303  
   304  			if !tt.wantErr {
   305  				for i := range h {
   306  					if h[i] != tt.args.src.([]byte)[i] {
   307  						t.Errorf(
   308  							"Hash.Scan() didn't scan the %d src correctly (have %X, want %X)",
   309  							i, h[i], tt.args.src.([]byte)[i],
   310  						)
   311  					}
   312  				}
   313  			}
   314  		})
   315  	}
   316  }
   317  
   318  func TestHash_Value(t *testing.T) {
   319  	b := []byte{
   320  		0xb2, 0x6f, 0x2b, 0x34, 0x2a, 0xab, 0x24, 0xbc, 0xf6, 0x3e,
   321  		0xa2, 0x18, 0xc6, 0xa9, 0x27, 0x4d, 0x30, 0xab, 0x9a, 0x15,
   322  		0xa2, 0x18, 0xc6, 0xa9, 0x27, 0x4d, 0x30, 0xab, 0x9a, 0x15,
   323  		0x10, 0x00,
   324  	}
   325  	var usedH Hash
   326  	usedH.SetBytes(b)
   327  	tests := []struct {
   328  		name    string
   329  		h       Hash
   330  		want    driver.Value
   331  		wantErr bool
   332  	}{
   333  		{
   334  			name:    "Working value",
   335  			h:       usedH,
   336  			want:    b,
   337  			wantErr: false,
   338  		},
   339  	}
   340  	for _, tt := range tests {
   341  		t.Run(tt.name, func(t *testing.T) {
   342  			got, err := tt.h.Value()
   343  			if (err != nil) != tt.wantErr {
   344  				t.Errorf("Hash.Value() error = %v, wantErr %v", err, tt.wantErr)
   345  				return
   346  			}
   347  			if !reflect.DeepEqual(got, tt.want) {
   348  				t.Errorf("Hash.Value() = %v, want %v", got, tt.want)
   349  			}
   350  		})
   351  	}
   352  }
   353  
   354  func TestAddress_Scan(t *testing.T) {
   355  	type args struct {
   356  		src interface{}
   357  	}
   358  	tests := []struct {
   359  		name    string
   360  		args    args
   361  		wantErr bool
   362  	}{
   363  		{
   364  			name: "working scan",
   365  			args: args{src: []byte{
   366  				0xb2, 0x6f, 0x2b, 0x34, 0x2a, 0xab, 0x24, 0xbc, 0xf6, 0x3e,
   367  				0xa2, 0x18, 0xc6, 0xa9, 0x27, 0x4d, 0x30, 0xab, 0x9a, 0x15,
   368  			}},
   369  			wantErr: false,
   370  		},
   371  		{
   372  			name:    "non working scan",
   373  			args:    args{src: int64(1234567890)},
   374  			wantErr: true,
   375  		},
   376  		{
   377  			name: "invalid length scan",
   378  			args: args{src: []byte{
   379  				0xb2, 0x6f, 0x2b, 0x34, 0x2a, 0xab, 0x24, 0xbc, 0xf6, 0x3e,
   380  				0xa2, 0x18, 0xc6, 0xa9, 0x27, 0x4d, 0x30, 0xab, 0x9a,
   381  			}},
   382  			wantErr: true,
   383  		},
   384  	}
   385  	for _, tt := range tests {
   386  		t.Run(tt.name, func(t *testing.T) {
   387  			a := &Address{}
   388  			if err := a.Scan(tt.args.src); (err != nil) != tt.wantErr {
   389  				t.Errorf("Address.Scan() error = %v, wantErr %v", err, tt.wantErr)
   390  			}
   391  
   392  			if !tt.wantErr {
   393  				for i := range a {
   394  					if a[i] != tt.args.src.([]byte)[i] {
   395  						t.Errorf(
   396  							"Address.Scan() didn't scan the %d src correctly (have %X, want %X)",
   397  							i, a[i], tt.args.src.([]byte)[i],
   398  						)
   399  					}
   400  				}
   401  			}
   402  		})
   403  	}
   404  }
   405  
   406  func TestAddress_Value(t *testing.T) {
   407  	b := []byte{
   408  		0xb2, 0x6f, 0x2b, 0x34, 0x2a, 0xab, 0x24, 0xbc, 0xf6, 0x3e,
   409  		0xa2, 0x18, 0xc6, 0xa9, 0x27, 0x4d, 0x30, 0xab, 0x9a, 0x15,
   410  	}
   411  	var usedA Address
   412  	usedA.SetBytes(b)
   413  	tests := []struct {
   414  		name    string
   415  		a       Address
   416  		want    driver.Value
   417  		wantErr bool
   418  	}{
   419  		{
   420  			name:    "Working value",
   421  			a:       usedA,
   422  			want:    b,
   423  			wantErr: false,
   424  		},
   425  	}
   426  	for _, tt := range tests {
   427  		t.Run(tt.name, func(t *testing.T) {
   428  			got, err := tt.a.Value()
   429  			if (err != nil) != tt.wantErr {
   430  				t.Errorf("Address.Value() error = %v, wantErr %v", err, tt.wantErr)
   431  				return
   432  			}
   433  			if !reflect.DeepEqual(got, tt.want) {
   434  				t.Errorf("Address.Value() = %v, want %v", got, tt.want)
   435  			}
   436  		})
   437  	}
   438  }
   439  
   440  func TestFormatTerminalString_Value(t *testing.T) {
   441  	assert.Equal(t, "", FormatTerminalString(nil))
   442  	assert.Equal(t, "", FormatTerminalString([]byte{}))
   443  	b := []byte{
   444  		0x12, 0x34, 0x56, 0x78, 0x90, 0xab, 0xcd,
   445  	}
   446  	str := FormatTerminalString(b)
   447  	assert.Equal(t, "123456…90abcd", str)
   448  	str = FormatTerminalString(b[1:])
   449  	assert.Equal(t, "34567890abcd", str)
   450  }