| 
									
										
										
										
											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" | 
					
						
							| 
									
										
										
										
											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
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											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
										 |  |  | 	} | 
					
						
							|  |  |  | } |