| 
									
										
										
										
											2015-07-07 02:54:22 +02:00
										 |  |  | // Copyright 2014 The go-ethereum Authors | 
					
						
							| 
									
										
										
										
											2015-07-22 18:48:40 +02:00
										 |  |  | // This file is part of the go-ethereum library. | 
					
						
							| 
									
										
										
										
											2015-07-07 02:54:22 +02:00
										 |  |  | // | 
					
						
							| 
									
										
										
										
											2015-07-23 18:35:11 +02:00
										 |  |  | // The go-ethereum library is free software: you can redistribute it and/or modify | 
					
						
							| 
									
										
										
										
											2015-07-07 02:54:22 +02:00
										 |  |  | // it under the terms of the GNU Lesser General Public License as published by | 
					
						
							|  |  |  | // the Free Software Foundation, either version 3 of the License, or | 
					
						
							|  |  |  | // (at your option) any later version. | 
					
						
							|  |  |  | // | 
					
						
							| 
									
										
										
										
											2015-07-22 18:48:40 +02:00
										 |  |  | // The go-ethereum library is distributed in the hope that it will be useful, | 
					
						
							| 
									
										
										
										
											2015-07-07 02:54:22 +02:00
										 |  |  | // but WITHOUT ANY WARRANTY; without even the implied warranty of | 
					
						
							| 
									
										
										
										
											2015-07-22 18:48:40 +02:00
										 |  |  | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 
					
						
							| 
									
										
										
										
											2015-07-07 02:54:22 +02:00
										 |  |  | // GNU Lesser General Public License for more details. | 
					
						
							|  |  |  | // | 
					
						
							|  |  |  | // You should have received a copy of the GNU Lesser General Public License | 
					
						
							| 
									
										
										
										
											2015-07-22 18:48:40 +02:00
										 |  |  | // along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>. | 
					
						
							| 
									
										
										
										
											2015-07-07 02:54:22 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-31 14:45:03 +01:00
										 |  |  | package trie | 
					
						
							| 
									
										
										
										
											2014-02-14 23:56:09 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							| 
									
										
										
										
											2017-04-18 13:25:07 +02:00
										 |  |  | 	"bytes" | 
					
						
							| 
									
										
										
										
											2020-09-29 17:38:13 +02:00
										 |  |  | 	"encoding/hex" | 
					
						
							|  |  |  | 	"math/rand" | 
					
						
							| 
									
										
										
										
											2015-08-06 12:39:07 -04:00
										 |  |  | 	"testing" | 
					
						
							| 
									
										
										
										
											2014-02-14 23:56:09 +01:00
										 |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-18 13:25:07 +02:00
										 |  |  | func TestHexCompact(t *testing.T) { | 
					
						
							|  |  |  | 	tests := []struct{ hex, compact []byte }{ | 
					
						
							|  |  |  | 		// empty keys, with and without terminator. | 
					
						
							|  |  |  | 		{hex: []byte{}, compact: []byte{0x00}}, | 
					
						
							|  |  |  | 		{hex: []byte{16}, compact: []byte{0x20}}, | 
					
						
							|  |  |  | 		// odd length, no terminator | 
					
						
							|  |  |  | 		{hex: []byte{1, 2, 3, 4, 5}, compact: []byte{0x11, 0x23, 0x45}}, | 
					
						
							|  |  |  | 		// even length, no terminator | 
					
						
							|  |  |  | 		{hex: []byte{0, 1, 2, 3, 4, 5}, compact: []byte{0x00, 0x01, 0x23, 0x45}}, | 
					
						
							|  |  |  | 		// odd length, terminator | 
					
						
							|  |  |  | 		{hex: []byte{15, 1, 12, 11, 8, 16 /*term*/}, compact: []byte{0x3f, 0x1c, 0xb8}}, | 
					
						
							|  |  |  | 		// even length, terminator | 
					
						
							|  |  |  | 		{hex: []byte{0, 15, 1, 12, 11, 8, 16 /*term*/}, compact: []byte{0x20, 0x0f, 0x1c, 0xb8}}, | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	for _, test := range tests { | 
					
						
							|  |  |  | 		if c := hexToCompact(test.hex); !bytes.Equal(c, test.compact) { | 
					
						
							|  |  |  | 			t.Errorf("hexToCompact(%x) -> %x, want %x", test.hex, c, test.compact) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		if h := compactToHex(test.compact); !bytes.Equal(h, test.hex) { | 
					
						
							|  |  |  | 			t.Errorf("compactToHex(%x) -> %x, want %x", test.compact, h, test.hex) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2014-06-26 18:45:57 +01:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2015-08-06 12:39:07 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-18 13:25:07 +02:00
										 |  |  | func TestHexKeybytes(t *testing.T) { | 
					
						
							|  |  |  | 	tests := []struct{ key, hexIn, hexOut []byte }{ | 
					
						
							|  |  |  | 		{key: []byte{}, hexIn: []byte{16}, hexOut: []byte{16}}, | 
					
						
							|  |  |  | 		{key: []byte{}, hexIn: []byte{}, hexOut: []byte{16}}, | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			key:    []byte{0x12, 0x34, 0x56}, | 
					
						
							|  |  |  | 			hexIn:  []byte{1, 2, 3, 4, 5, 6, 16}, | 
					
						
							|  |  |  | 			hexOut: []byte{1, 2, 3, 4, 5, 6, 16}, | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			key:    []byte{0x12, 0x34, 0x5}, | 
					
						
							|  |  |  | 			hexIn:  []byte{1, 2, 3, 4, 0, 5, 16}, | 
					
						
							|  |  |  | 			hexOut: []byte{1, 2, 3, 4, 0, 5, 16}, | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			key:    []byte{0x12, 0x34, 0x56}, | 
					
						
							|  |  |  | 			hexIn:  []byte{1, 2, 3, 4, 5, 6}, | 
					
						
							|  |  |  | 			hexOut: []byte{1, 2, 3, 4, 5, 6, 16}, | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	for _, test := range tests { | 
					
						
							|  |  |  | 		if h := keybytesToHex(test.key); !bytes.Equal(h, test.hexOut) { | 
					
						
							|  |  |  | 			t.Errorf("keybytesToHex(%x) -> %x, want %x", test.key, h, test.hexOut) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		if k := hexToKeybytes(test.hexIn); !bytes.Equal(k, test.key) { | 
					
						
							|  |  |  | 			t.Errorf("hexToKeybytes(%x) -> %x, want %x", test.hexIn, k, test.key) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2015-08-06 12:39:07 -04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-29 17:38:13 +02:00
										 |  |  | func TestHexToCompactInPlace(t *testing.T) { | 
					
						
							|  |  |  | 	for i, keyS := range []string{ | 
					
						
							|  |  |  | 		"00", | 
					
						
							|  |  |  | 		"060a040c0f000a090b040803010801010900080d090a0a0d0903000b10", | 
					
						
							|  |  |  | 		"10", | 
					
						
							|  |  |  | 	} { | 
					
						
							|  |  |  | 		hexBytes, _ := hex.DecodeString(keyS) | 
					
						
							|  |  |  | 		exp := hexToCompact(hexBytes) | 
					
						
							|  |  |  | 		sz := hexToCompactInPlace(hexBytes) | 
					
						
							|  |  |  | 		got := hexBytes[:sz] | 
					
						
							|  |  |  | 		if !bytes.Equal(exp, got) { | 
					
						
							|  |  |  | 			t.Fatalf("test %d: encoding err\ninp %v\ngot %x\nexp %x\n", i, keyS, got, exp) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func TestHexToCompactInPlaceRandom(t *testing.T) { | 
					
						
							|  |  |  | 	for i := 0; i < 10000; i++ { | 
					
						
							|  |  |  | 		l := rand.Intn(128) | 
					
						
							|  |  |  | 		key := make([]byte, l) | 
					
						
							|  |  |  | 		rand.Read(key) | 
					
						
							|  |  |  | 		hexBytes := keybytesToHex(key) | 
					
						
							|  |  |  | 		hexOrig := []byte(string(hexBytes)) | 
					
						
							|  |  |  | 		exp := hexToCompact(hexBytes) | 
					
						
							|  |  |  | 		sz := hexToCompactInPlace(hexBytes) | 
					
						
							|  |  |  | 		got := hexBytes[:sz] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		if !bytes.Equal(exp, got) { | 
					
						
							|  |  |  | 			t.Fatalf("encoding err \ncpt %x\nhex %x\ngot %x\nexp %x\n", | 
					
						
							|  |  |  | 				key, hexOrig, got, exp) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-18 13:25:07 +02:00
										 |  |  | func BenchmarkHexToCompact(b *testing.B) { | 
					
						
							|  |  |  | 	testBytes := []byte{0, 15, 1, 12, 11, 8, 16 /*term*/} | 
					
						
							| 
									
										
										
										
											2015-08-06 12:39:07 -04:00
										 |  |  | 	for i := 0; i < b.N; i++ { | 
					
						
							| 
									
										
										
										
											2017-04-18 13:25:07 +02:00
										 |  |  | 		hexToCompact(testBytes) | 
					
						
							| 
									
										
										
										
											2015-08-06 12:39:07 -04:00
										 |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-18 13:25:07 +02:00
										 |  |  | func BenchmarkCompactToHex(b *testing.B) { | 
					
						
							|  |  |  | 	testBytes := []byte{0, 15, 1, 12, 11, 8, 16 /*term*/} | 
					
						
							| 
									
										
										
										
											2015-08-06 12:39:07 -04:00
										 |  |  | 	for i := 0; i < b.N; i++ { | 
					
						
							| 
									
										
										
										
											2017-04-18 13:25:07 +02:00
										 |  |  | 		compactToHex(testBytes) | 
					
						
							| 
									
										
										
										
											2015-08-06 12:39:07 -04:00
										 |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-18 13:25:07 +02:00
										 |  |  | func BenchmarkKeybytesToHex(b *testing.B) { | 
					
						
							| 
									
										
										
										
											2015-08-06 12:39:07 -04:00
										 |  |  | 	testBytes := []byte{7, 6, 6, 5, 7, 2, 6, 2, 16} | 
					
						
							|  |  |  | 	for i := 0; i < b.N; i++ { | 
					
						
							| 
									
										
										
										
											2017-04-18 13:25:07 +02:00
										 |  |  | 		keybytesToHex(testBytes) | 
					
						
							| 
									
										
										
										
											2015-08-06 12:39:07 -04:00
										 |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-18 13:25:07 +02:00
										 |  |  | func BenchmarkHexToKeybytes(b *testing.B) { | 
					
						
							| 
									
										
										
										
											2015-08-06 12:39:07 -04:00
										 |  |  | 	testBytes := []byte{7, 6, 6, 5, 7, 2, 6, 2, 16} | 
					
						
							|  |  |  | 	for i := 0; i < b.N; i++ { | 
					
						
							| 
									
										
										
										
											2017-04-18 13:25:07 +02:00
										 |  |  | 		hexToKeybytes(testBytes) | 
					
						
							| 
									
										
										
										
											2015-08-06 12:39:07 -04:00
										 |  |  | 	} | 
					
						
							|  |  |  | } |