| 
									
										
										
										
											2015-11-05 23:57:57 +02:00
										 |  |  | // Copyright 2015 The go-ethereum Authors | 
					
						
							|  |  |  | // This file is part of the go-ethereum library. | 
					
						
							|  |  |  | // | 
					
						
							|  |  |  | // The go-ethereum library is free software: you can redistribute it and/or modify | 
					
						
							|  |  |  | // 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. | 
					
						
							|  |  |  | // | 
					
						
							|  |  |  | // The go-ethereum library is distributed in the hope that it will be useful, | 
					
						
							|  |  |  | // but WITHOUT ANY WARRANTY; without even the implied warranty of | 
					
						
							|  |  |  | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 
					
						
							|  |  |  | // GNU Lesser General Public License for more details. | 
					
						
							|  |  |  | // | 
					
						
							|  |  |  | // You should have received a copy of the GNU Lesser General Public License | 
					
						
							|  |  |  | // along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | package node | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							| 
									
										
										
										
											2015-11-17 18:33:25 +02:00
										 |  |  | 	"fmt" | 
					
						
							| 
									
										
										
										
											2015-11-05 23:57:57 +02:00
										 |  |  | 	"io/ioutil" | 
					
						
							|  |  |  | 	"os" | 
					
						
							|  |  |  | 	"path/filepath" | 
					
						
							|  |  |  | 	"testing" | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-11-17 18:33:25 +02:00
										 |  |  | // Tests that databases are correctly created persistent or ephemeral based on | 
					
						
							|  |  |  | // the configured service context. | 
					
						
							|  |  |  | func TestContextDatabases(t *testing.T) { | 
					
						
							| 
									
										
										
										
											2015-11-05 23:57:57 +02:00
										 |  |  | 	// Create a temporary folder and ensure no database is contained within | 
					
						
							|  |  |  | 	dir, err := ioutil.TempDir("", "") | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		t.Fatalf("failed to create temporary data directory: %v", err) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	defer os.RemoveAll(dir) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if _, err := os.Stat(filepath.Join(dir, "database")); err == nil { | 
					
						
							|  |  |  | 		t.Fatalf("non-created database already exists") | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	// Request the opening/creation of a database and ensure it persists to disk | 
					
						
							| 
									
										
										
										
											2016-08-18 13:28:17 +02:00
										 |  |  | 	ctx := &ServiceContext{config: &Config{Name: "unit-test", DataDir: dir}} | 
					
						
							| 
									
										
										
										
											2016-02-19 14:29:19 +02:00
										 |  |  | 	db, err := ctx.OpenDatabase("persistent", 0, 0) | 
					
						
							| 
									
										
										
										
											2015-11-05 23:57:57 +02:00
										 |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		t.Fatalf("failed to open persistent database: %v", err) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	db.Close() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-18 13:28:17 +02:00
										 |  |  | 	if _, err := os.Stat(filepath.Join(dir, "unit-test", "persistent")); err != nil { | 
					
						
							| 
									
										
										
										
											2015-11-05 23:57:57 +02:00
										 |  |  | 		t.Fatalf("persistent database doesn't exists: %v", err) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	// Request th opening/creation of an ephemeral database and ensure it's not persisted | 
					
						
							| 
									
										
										
										
											2016-08-18 13:28:17 +02:00
										 |  |  | 	ctx = &ServiceContext{config: &Config{DataDir: ""}} | 
					
						
							| 
									
										
										
										
											2016-02-19 14:29:19 +02:00
										 |  |  | 	db, err = ctx.OpenDatabase("ephemeral", 0, 0) | 
					
						
							| 
									
										
										
										
											2015-11-05 23:57:57 +02:00
										 |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		t.Fatalf("failed to open ephemeral database: %v", err) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	db.Close() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if _, err := os.Stat(filepath.Join(dir, "ephemeral")); err == nil { | 
					
						
							|  |  |  | 		t.Fatalf("ephemeral database exists") | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2015-11-17 18:33:25 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | // Tests that already constructed services can be retrieves by later ones. | 
					
						
							|  |  |  | func TestContextServices(t *testing.T) { | 
					
						
							| 
									
										
										
										
											2016-02-02 19:06:43 +02:00
										 |  |  | 	stack, err := New(testNodeConfig()) | 
					
						
							| 
									
										
										
										
											2015-11-17 18:33:25 +02:00
										 |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		t.Fatalf("failed to create protocol stack: %v", err) | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2015-11-26 18:35:44 +02:00
										 |  |  | 	// Define a verifier that ensures a NoopA is before it and NoopB after | 
					
						
							| 
									
										
										
										
											2015-11-17 18:33:25 +02:00
										 |  |  | 	verifier := func(ctx *ServiceContext) (Service, error) { | 
					
						
							| 
									
										
										
										
											2015-11-26 18:35:44 +02:00
										 |  |  | 		var objA *NoopServiceA | 
					
						
							|  |  |  | 		if ctx.Service(&objA) != nil { | 
					
						
							|  |  |  | 			return nil, fmt.Errorf("former service not found") | 
					
						
							| 
									
										
										
										
											2015-11-17 18:33:25 +02:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2015-11-26 18:35:44 +02:00
										 |  |  | 		var objB *NoopServiceB | 
					
						
							|  |  |  | 		if err := ctx.Service(&objB); err != ErrServiceUnknown { | 
					
						
							|  |  |  | 			return nil, fmt.Errorf("latters lookup error mismatch: have %v, want %v", err, ErrServiceUnknown) | 
					
						
							| 
									
										
										
										
											2015-11-17 18:33:25 +02:00
										 |  |  | 		} | 
					
						
							|  |  |  | 		return new(NoopService), nil | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	// Register the collection of services | 
					
						
							| 
									
										
										
										
											2015-11-26 18:35:44 +02:00
										 |  |  | 	if err := stack.Register(NewNoopServiceA); err != nil { | 
					
						
							|  |  |  | 		t.Fatalf("former failed to register service: %v", err) | 
					
						
							| 
									
										
										
										
											2015-11-17 18:33:25 +02:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2015-11-26 18:35:44 +02:00
										 |  |  | 	if err := stack.Register(verifier); err != nil { | 
					
						
							| 
									
										
										
										
											2015-11-17 18:33:25 +02:00
										 |  |  | 		t.Fatalf("failed to register service verifier: %v", err) | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2015-11-26 18:35:44 +02:00
										 |  |  | 	if err := stack.Register(NewNoopServiceB); err != nil { | 
					
						
							|  |  |  | 		t.Fatalf("latter failed to register service: %v", err) | 
					
						
							| 
									
										
										
										
											2015-11-17 18:33:25 +02:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	// Start the protocol stack and ensure services are constructed in order | 
					
						
							|  |  |  | 	if err := stack.Start(); err != nil { | 
					
						
							|  |  |  | 		t.Fatalf("failed to start stack: %v", err) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	defer stack.Stop() | 
					
						
							|  |  |  | } |