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  }