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