github.com/linapex/ethereum-go-chinese@v0.0.0-20190316121929-f8b7a73c3fa1/node/service_test.go (about) 1 2 //<developer> 3 // <name>linapex 曹一峰</name> 4 // <email>linapex@163.com</email> 5 // <wx>superexc</wx> 6 // <qqgroup>128148617</qqgroup> 7 // <url>https://jsq.ink</url> 8 // <role>pku engineer</role> 9 // <date>2019-03-16 19:16:40</date> 10 //</624450102689271808> 11 12 13 package node 14 15 import ( 16 "fmt" 17 "io/ioutil" 18 "os" 19 "path/filepath" 20 "testing" 21 ) 22 23 //测试数据库是否基于 24 //配置的服务上下文。 25 func TestContextDatabases(t *testing.T) { 26 //创建临时文件夹并确保其中不包含任何数据库 27 dir, err := ioutil.TempDir("", "") 28 if err != nil { 29 t.Fatalf("failed to create temporary data directory: %v", err) 30 } 31 defer os.RemoveAll(dir) 32 33 if _, err := os.Stat(filepath.Join(dir, "database")); err == nil { 34 t.Fatalf("non-created database already exists") 35 } 36 //请求打开/创建一个数据库,并确保它一直存在于磁盘上 37 ctx := &ServiceContext{config: &Config{Name: "unit-test", DataDir: dir}} 38 db, err := ctx.OpenDatabase("persistent", 0, 0) 39 if err != nil { 40 t.Fatalf("failed to open persistent database: %v", err) 41 } 42 db.Close() 43 44 if _, err := os.Stat(filepath.Join(dir, "unit-test", "persistent")); err != nil { 45 t.Fatalf("persistent database doesn't exists: %v", err) 46 } 47 //请求打开/创建临时数据库,并确保它不会持久化。 48 ctx = &ServiceContext{config: &Config{DataDir: ""}} 49 db, err = ctx.OpenDatabase("ephemeral", 0, 0) 50 if err != nil { 51 t.Fatalf("failed to open ephemeral database: %v", err) 52 } 53 db.Close() 54 55 if _, err := os.Stat(filepath.Join(dir, "ephemeral")); err == nil { 56 t.Fatalf("ephemeral database exists") 57 } 58 } 59 60 //已经构造了服务的测试可以由以后的测试检索。 61 func TestContextServices(t *testing.T) { 62 stack, err := New(testNodeConfig()) 63 if err != nil { 64 t.Fatalf("failed to create protocol stack: %v", err) 65 } 66 //定义一个验证器,确保noopa在它之前,noopb在它之后。 67 verifier := func(ctx *ServiceContext) (Service, error) { 68 var objA *NoopServiceA 69 if ctx.Service(&objA) != nil { 70 return nil, fmt.Errorf("former service not found") 71 } 72 var objB *NoopServiceB 73 if err := ctx.Service(&objB); err != ErrServiceUnknown { 74 return nil, fmt.Errorf("latters lookup error mismatch: have %v, want %v", err, ErrServiceUnknown) 75 } 76 return new(NoopService), nil 77 } 78 //注册服务集合 79 if err := stack.Register(NewNoopServiceA); err != nil { 80 t.Fatalf("former failed to register service: %v", err) 81 } 82 if err := stack.Register(verifier); err != nil { 83 t.Fatalf("failed to register service verifier: %v", err) 84 } 85 if err := stack.Register(NewNoopServiceB); err != nil { 86 t.Fatalf("latter failed to register service: %v", err) 87 } 88 //启动协议栈并确保服务按顺序构造 89 if err := stack.Start(); err != nil { 90 t.Fatalf("failed to start stack: %v", err) 91 } 92 defer stack.Stop() 93 } 94