| 
									
										
										
										
											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 ( | 
					
						
							| 
									
										
										
										
											2015-08-06 12:39:07 -04:00
										 |  |  | 	"encoding/hex" | 
					
						
							|  |  |  | 	"testing" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-14 15:01:52 -06:00
										 |  |  | 	checker "gopkg.in/check.v1" | 
					
						
							| 
									
										
										
										
											2014-02-14 23:56:09 +01:00
										 |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-06 01:19:48 +02:00
										 |  |  | func TestEncoding(t *testing.T) { checker.TestingT(t) } | 
					
						
							| 
									
										
										
										
											2015-08-06 12:39:07 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-14 15:01:52 -06:00
										 |  |  | type TrieEncodingSuite struct{} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | var _ = checker.Suite(&TrieEncodingSuite{}) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (s *TrieEncodingSuite) TestCompactEncode(c *checker.C) { | 
					
						
							|  |  |  | 	// even compact encode | 
					
						
							| 
									
										
										
										
											2014-10-10 17:00:06 +02:00
										 |  |  | 	test1 := []byte{1, 2, 3, 4, 5} | 
					
						
							| 
									
										
										
										
											2015-07-06 01:19:48 +02:00
										 |  |  | 	res1 := compactEncode(test1) | 
					
						
							| 
									
										
										
										
											2015-08-06 12:39:07 -04:00
										 |  |  | 	c.Assert(res1, checker.DeepEquals, []byte("\x11\x23\x45")) | 
					
						
							| 
									
										
										
										
											2014-02-14 23:56:09 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-14 15:01:52 -06:00
										 |  |  | 	// odd compact encode | 
					
						
							| 
									
										
										
										
											2014-10-10 17:00:06 +02:00
										 |  |  | 	test2 := []byte{0, 1, 2, 3, 4, 5} | 
					
						
							| 
									
										
										
										
											2015-07-06 01:19:48 +02:00
										 |  |  | 	res2 := compactEncode(test2) | 
					
						
							| 
									
										
										
										
											2015-08-06 12:39:07 -04:00
										 |  |  | 	c.Assert(res2, checker.DeepEquals, []byte("\x00\x01\x23\x45")) | 
					
						
							| 
									
										
										
										
											2014-02-14 23:56:09 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-14 15:01:52 -06:00
										 |  |  | 	//odd terminated compact encode | 
					
						
							| 
									
										
										
										
											2014-10-10 17:00:06 +02:00
										 |  |  | 	test3 := []byte{0, 15, 1, 12, 11, 8 /*term*/, 16} | 
					
						
							| 
									
										
										
										
											2015-07-06 01:19:48 +02:00
										 |  |  | 	res3 := compactEncode(test3) | 
					
						
							| 
									
										
										
										
											2015-08-06 12:39:07 -04:00
										 |  |  | 	c.Assert(res3, checker.DeepEquals, []byte("\x20\x0f\x1c\xb8")) | 
					
						
							| 
									
										
										
										
											2014-02-14 23:56:09 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-14 15:01:52 -06:00
										 |  |  | 	// even terminated compact encode | 
					
						
							| 
									
										
										
										
											2014-10-10 17:00:06 +02:00
										 |  |  | 	test4 := []byte{15, 1, 12, 11, 8 /*term*/, 16} | 
					
						
							| 
									
										
										
										
											2015-07-06 01:19:48 +02:00
										 |  |  | 	res4 := compactEncode(test4) | 
					
						
							| 
									
										
										
										
											2015-08-06 12:39:07 -04:00
										 |  |  | 	c.Assert(res4, checker.DeepEquals, []byte("\x3f\x1c\xb8")) | 
					
						
							| 
									
										
										
										
											2014-02-14 23:56:09 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-14 15:01:52 -06:00
										 |  |  | func (s *TrieEncodingSuite) TestCompactHexDecode(c *checker.C) { | 
					
						
							| 
									
										
										
										
											2014-10-10 17:00:06 +02:00
										 |  |  | 	exp := []byte{7, 6, 6, 5, 7, 2, 6, 2, 16} | 
					
						
							| 
									
										
										
										
											2015-07-06 01:19:48 +02:00
										 |  |  | 	res := compactHexDecode([]byte("verb")) | 
					
						
							| 
									
										
										
										
											2014-11-14 15:01:52 -06:00
										 |  |  | 	c.Assert(res, checker.DeepEquals, exp) | 
					
						
							| 
									
										
										
										
											2014-02-14 23:56:09 +01:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2014-02-17 15:46:16 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-11-30 13:34:19 +01:00
										 |  |  | func (s *TrieEncodingSuite) TestCompactHexEncode(c *checker.C) { | 
					
						
							|  |  |  | 	exp := []byte("verb") | 
					
						
							|  |  |  | 	res := compactHexEncode([]byte{7, 6, 6, 5, 7, 2, 6, 2, 16}) | 
					
						
							|  |  |  | 	c.Assert(res, checker.DeepEquals, exp) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-14 15:01:52 -06:00
										 |  |  | func (s *TrieEncodingSuite) TestCompactDecode(c *checker.C) { | 
					
						
							|  |  |  | 	// odd compact decode | 
					
						
							| 
									
										
										
										
											2014-10-10 17:00:06 +02:00
										 |  |  | 	exp := []byte{1, 2, 3, 4, 5} | 
					
						
							| 
									
										
										
										
											2015-07-06 01:19:48 +02:00
										 |  |  | 	res := compactDecode([]byte("\x11\x23\x45")) | 
					
						
							| 
									
										
										
										
											2014-11-14 15:01:52 -06:00
										 |  |  | 	c.Assert(res, checker.DeepEquals, exp) | 
					
						
							| 
									
										
										
										
											2014-02-17 15:46:16 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-14 15:01:52 -06:00
										 |  |  | 	// even compact decode | 
					
						
							| 
									
										
										
										
											2014-10-10 17:00:06 +02:00
										 |  |  | 	exp = []byte{0, 1, 2, 3, 4, 5} | 
					
						
							| 
									
										
										
										
											2015-07-06 01:19:48 +02:00
										 |  |  | 	res = compactDecode([]byte("\x00\x01\x23\x45")) | 
					
						
							| 
									
										
										
										
											2014-11-14 15:01:52 -06:00
										 |  |  | 	c.Assert(res, checker.DeepEquals, exp) | 
					
						
							| 
									
										
										
										
											2014-02-17 15:46:16 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-14 15:01:52 -06:00
										 |  |  | 	// even terminated compact decode | 
					
						
							| 
									
										
										
										
											2014-10-10 17:00:06 +02:00
										 |  |  | 	exp = []byte{0, 15, 1, 12, 11, 8 /*term*/, 16} | 
					
						
							| 
									
										
										
										
											2015-07-06 01:19:48 +02:00
										 |  |  | 	res = compactDecode([]byte("\x20\x0f\x1c\xb8")) | 
					
						
							| 
									
										
										
										
											2014-11-14 15:01:52 -06:00
										 |  |  | 	c.Assert(res, checker.DeepEquals, exp) | 
					
						
							| 
									
										
										
										
											2014-02-17 15:46:16 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-14 15:01:52 -06:00
										 |  |  | 	// even terminated compact decode | 
					
						
							| 
									
										
										
										
											2014-10-10 17:00:06 +02:00
										 |  |  | 	exp = []byte{15, 1, 12, 11, 8 /*term*/, 16} | 
					
						
							| 
									
										
										
										
											2015-07-06 01:19:48 +02:00
										 |  |  | 	res = compactDecode([]byte("\x3f\x1c\xb8")) | 
					
						
							| 
									
										
										
										
											2014-11-14 15:01:52 -06:00
										 |  |  | 	c.Assert(res, checker.DeepEquals, exp) | 
					
						
							| 
									
										
										
										
											2014-06-26 18:45:57 +01:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2015-08-06 12:39:07 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | func (s *TrieEncodingSuite) TestDecodeCompact(c *checker.C) { | 
					
						
							|  |  |  | 	exp, _ := hex.DecodeString("012345") | 
					
						
							| 
									
										
										
										
											2015-07-06 01:19:48 +02:00
										 |  |  | 	res := decodeCompact([]byte{0, 1, 2, 3, 4, 5}) | 
					
						
							| 
									
										
										
										
											2015-08-06 12:39:07 -04:00
										 |  |  | 	c.Assert(res, checker.DeepEquals, exp) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	exp, _ = hex.DecodeString("012345") | 
					
						
							| 
									
										
										
										
											2015-07-06 01:19:48 +02:00
										 |  |  | 	res = decodeCompact([]byte{0, 1, 2, 3, 4, 5, 16}) | 
					
						
							| 
									
										
										
										
											2015-08-06 12:39:07 -04:00
										 |  |  | 	c.Assert(res, checker.DeepEquals, exp) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	exp, _ = hex.DecodeString("abcdef") | 
					
						
							| 
									
										
										
										
											2015-07-06 01:19:48 +02:00
										 |  |  | 	res = decodeCompact([]byte{10, 11, 12, 13, 14, 15}) | 
					
						
							| 
									
										
										
										
											2015-08-06 12:39:07 -04:00
										 |  |  | 	c.Assert(res, checker.DeepEquals, exp) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func BenchmarkCompactEncode(b *testing.B) { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	testBytes := []byte{0, 15, 1, 12, 11, 8 /*term*/, 16} | 
					
						
							|  |  |  | 	for i := 0; i < b.N; i++ { | 
					
						
							| 
									
										
										
										
											2015-07-06 01:19:48 +02:00
										 |  |  | 		compactEncode(testBytes) | 
					
						
							| 
									
										
										
										
											2015-08-06 12:39:07 -04:00
										 |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func BenchmarkCompactDecode(b *testing.B) { | 
					
						
							|  |  |  | 	testBytes := []byte{0, 15, 1, 12, 11, 8 /*term*/, 16} | 
					
						
							|  |  |  | 	for i := 0; i < b.N; i++ { | 
					
						
							| 
									
										
										
										
											2015-07-06 01:19:48 +02:00
										 |  |  | 		compactDecode(testBytes) | 
					
						
							| 
									
										
										
										
											2015-08-06 12:39:07 -04:00
										 |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func BenchmarkCompactHexDecode(b *testing.B) { | 
					
						
							|  |  |  | 	testBytes := []byte{7, 6, 6, 5, 7, 2, 6, 2, 16} | 
					
						
							|  |  |  | 	for i := 0; i < b.N; i++ { | 
					
						
							| 
									
										
										
										
											2015-07-06 01:19:48 +02:00
										 |  |  | 		compactHexDecode(testBytes) | 
					
						
							| 
									
										
										
										
											2015-08-06 12:39:07 -04:00
										 |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func BenchmarkDecodeCompact(b *testing.B) { | 
					
						
							|  |  |  | 	testBytes := []byte{7, 6, 6, 5, 7, 2, 6, 2, 16} | 
					
						
							|  |  |  | 	for i := 0; i < b.N; i++ { | 
					
						
							| 
									
										
										
										
											2015-07-06 01:19:48 +02:00
										 |  |  | 		decodeCompact(testBytes) | 
					
						
							| 
									
										
										
										
											2015-08-06 12:39:07 -04:00
										 |  |  | 	} | 
					
						
							|  |  |  | } |