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