github.com/linapex/ethereum-go-chinese@v0.0.0-20190316121929-f8b7a73c3fa1/rpc/server_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:42</date> 10 //</624450109513404416> 11 12 13 package rpc 14 15 import ( 16 "context" 17 "encoding/json" 18 "net" 19 "reflect" 20 "testing" 21 "time" 22 ) 23 24 type Service struct{} 25 26 type Args struct { 27 S string 28 } 29 30 func (s *Service) NoArgsRets() { 31 } 32 33 type Result struct { 34 String string 35 Int int 36 Args *Args 37 } 38 39 func (s *Service) Echo(str string, i int, args *Args) Result { 40 return Result{str, i, args} 41 } 42 43 func (s *Service) EchoWithCtx(ctx context.Context, str string, i int, args *Args) Result { 44 return Result{str, i, args} 45 } 46 47 func (s *Service) Sleep(ctx context.Context, duration time.Duration) { 48 select { 49 case <-time.After(duration): 50 case <-ctx.Done(): 51 } 52 } 53 54 func (s *Service) Rets() (string, error) { 55 return "", nil 56 } 57 58 func (s *Service) InvalidRets1() (error, string) { 59 return nil, "" 60 } 61 62 func (s *Service) InvalidRets2() (string, string) { 63 return "", "" 64 } 65 66 func (s *Service) InvalidRets3() (string, string, error) { 67 return "", "", nil 68 } 69 70 func (s *Service) Subscription(ctx context.Context) (*Subscription, error) { 71 return nil, nil 72 } 73 74 func TestServerRegisterName(t *testing.T) { 75 server := NewServer() 76 service := new(Service) 77 78 if err := server.RegisterName("calc", service); err != nil { 79 t.Fatalf("%v", err) 80 } 81 82 if len(server.services) != 2 { 83 t.Fatalf("Expected 2 service entries, got %d", len(server.services)) 84 } 85 86 svc, ok := server.services["calc"] 87 if !ok { 88 t.Fatalf("Expected service calc to be registered") 89 } 90 91 if len(svc.callbacks) != 5 { 92 t.Errorf("Expected 5 callbacks for service 'calc', got %d", len(svc.callbacks)) 93 } 94 95 if len(svc.subscriptions) != 1 { 96 t.Errorf("Expected 1 subscription for service 'calc', got %d", len(svc.subscriptions)) 97 } 98 } 99 100 func testServerMethodExecution(t *testing.T, method string) { 101 server := NewServer() 102 service := new(Service) 103 104 if err := server.RegisterName("test", service); err != nil { 105 t.Fatalf("%v", err) 106 } 107 108 stringArg := "string arg" 109 intArg := 1122 110 argsArg := &Args{"abcde"} 111 params := []interface{}{stringArg, intArg, argsArg} 112 113 request := map[string]interface{}{ 114 "id": 12345, 115 "method": "test_" + method, 116 "version": "2.0", 117 "params": params, 118 } 119 120 clientConn, serverConn := net.Pipe() 121 defer clientConn.Close() 122 123 go server.ServeCodec(NewJSONCodec(serverConn), OptionMethodInvocation) 124 125 out := json.NewEncoder(clientConn) 126 in := json.NewDecoder(clientConn) 127 128 if err := out.Encode(request); err != nil { 129 t.Fatal(err) 130 } 131 132 response := jsonSuccessResponse{Result: &Result{}} 133 if err := in.Decode(&response); err != nil { 134 t.Fatal(err) 135 } 136 137 if result, ok := response.Result.(*Result); ok { 138 if result.String != stringArg { 139 t.Errorf("expected %s, got : %s\n", stringArg, result.String) 140 } 141 if result.Int != intArg { 142 t.Errorf("expected %d, got %d\n", intArg, result.Int) 143 } 144 if !reflect.DeepEqual(result.Args, argsArg) { 145 t.Errorf("expected %v, got %v\n", argsArg, result) 146 } 147 } else { 148 t.Fatalf("invalid response: expected *Result - got: %T", response.Result) 149 } 150 } 151 152 func TestServerMethodExecution(t *testing.T) { 153 testServerMethodExecution(t, "echo") 154 } 155 156 func TestServerMethodWithCtx(t *testing.T) { 157 testServerMethodExecution(t, "echoWithCtx") 158 } 159