| 
									
										
										
										
											2014-10-31 14:43:14 +01:00
										 |  |  | package state | 
					
						
							| 
									
										
										
										
											2014-07-22 11:54:48 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							| 
									
										
										
										
											2014-11-14 15:01:52 -06:00
										 |  |  | 	checker "gopkg.in/check.v1" | 
					
						
							| 
									
										
										
										
											2014-08-04 10:42:40 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-23 15:01:27 +02:00
										 |  |  | 	"github.com/ethereum/go-ethereum/ethdb" | 
					
						
							|  |  |  | 	"github.com/ethereum/go-ethereum/ethutil" | 
					
						
							| 
									
										
										
										
											2014-10-31 18:40:32 +01:00
										 |  |  | 	"github.com/ethereum/go-ethereum/trie" | 
					
						
							| 
									
										
										
										
											2014-07-22 11:54:48 +02:00
										 |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-14 15:01:52 -06:00
										 |  |  | type StateSuite struct { | 
					
						
							| 
									
										
										
										
											2014-12-10 10:57:19 +01:00
										 |  |  | 	state *StateDB | 
					
						
							| 
									
										
										
										
											2014-11-14 15:01:52 -06:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2014-07-22 11:54:48 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-14 15:01:52 -06:00
										 |  |  | var _ = checker.Suite(&StateSuite{}) | 
					
						
							| 
									
										
										
										
											2014-07-22 11:54:48 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-14 15:01:52 -06:00
										 |  |  | // var ZeroHash256 = make([]byte, 32) | 
					
						
							| 
									
										
										
										
											2014-07-22 11:54:48 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-14 15:01:52 -06:00
										 |  |  | func (s *StateSuite) TestDump(c *checker.C) { | 
					
						
							|  |  |  | 	key := []byte{0x01} | 
					
						
							|  |  |  | 	value := "foo" | 
					
						
							|  |  |  | 	node := []interface{}{key, value} | 
					
						
							|  |  |  | 	s.state.Trie.Put(node) | 
					
						
							|  |  |  | 	dump := s.state.Dump() | 
					
						
							|  |  |  | 	c.Assert(dump, checker.NotNil) | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2014-07-22 11:54:48 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-14 15:01:52 -06:00
										 |  |  | func (s *StateSuite) SetUpTest(c *checker.C) { | 
					
						
							|  |  |  | 	db, _ := ethdb.NewMemDatabase() | 
					
						
							|  |  |  | 	ethutil.ReadConfig(".ethtest", "/tmp/ethtest", "") | 
					
						
							|  |  |  | 	ethutil.Config.Db = db | 
					
						
							|  |  |  | 	s.state = New(trie.New(db, "")) | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2014-07-22 11:54:48 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-14 15:01:52 -06:00
										 |  |  | func (s *StateSuite) TestSnapshot(c *checker.C) { | 
					
						
							|  |  |  | 	stateobjaddr := []byte("aa") | 
					
						
							|  |  |  | 	storageaddr := ethutil.Big("0") | 
					
						
							|  |  |  | 	data1 := ethutil.NewValue(42) | 
					
						
							|  |  |  | 	data2 := ethutil.NewValue(43) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// get state object | 
					
						
							|  |  |  | 	stateObject := s.state.GetOrNewStateObject(stateobjaddr) | 
					
						
							|  |  |  | 	// set inital state object value | 
					
						
							|  |  |  | 	stateObject.SetStorage(storageaddr, data1) | 
					
						
							|  |  |  | 	// get snapshot of current state | 
					
						
							|  |  |  | 	snapshot := s.state.Copy() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// get state object. is this strictly necessary? | 
					
						
							|  |  |  | 	stateObject = s.state.GetStateObject(stateobjaddr) | 
					
						
							|  |  |  | 	// set new state object value | 
					
						
							|  |  |  | 	stateObject.SetStorage(storageaddr, data2) | 
					
						
							|  |  |  | 	// restore snapshot | 
					
						
							|  |  |  | 	s.state.Set(snapshot) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// get state object | 
					
						
							|  |  |  | 	stateObject = s.state.GetStateObject(stateobjaddr) | 
					
						
							|  |  |  | 	// get state storage value | 
					
						
							|  |  |  | 	res := stateObject.GetStorage(storageaddr) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	c.Assert(data1, checker.DeepEquals, res) | 
					
						
							| 
									
										
										
										
											2014-07-22 11:54:48 +02:00
										 |  |  | } |