github.com/line/ostracon@v1.0.10-0.20230328032236-7f20145f065d/rpc/jsonrpc/server/common_test.go (about)

     1  package server
     2  
     3  import (
     4  	"encoding/json"
     5  	"errors"
     6  	"fmt"
     7  	"net/http"
     8  	"strconv"
     9  
    10  	"github.com/line/ostracon/libs/log"
    11  	"github.com/line/ostracon/rpc/jsonrpc/types"
    12  )
    13  
    14  var (
    15  	TestJSONIntID = types.JSONRPCIntID(-1)
    16  	TestRPCError  = &types.RPCError{}
    17  	TestRawMSG    = json.RawMessage(`{"p1":"v1"}`)
    18  	TestText      = "foo"
    19  	ErrFoo        = errors.New(TestText)
    20  
    21  	TestRPCFunc = NewRPCFunc(
    22  		func(ctx *types.Context, s string, i int) (string, error) { return TestText, nil }, "s,i")
    23  	TestRPCErrorFunc = NewRPCFunc(
    24  		func(ctx *types.Context, s string, i int) (string, error) { return "", ErrFoo }, "s,i")
    25  	TestWSRPCFunc = NewWSRPCFunc(
    26  		func(ctx *types.Context, s string, i int) (string, error) { return TestText, nil }, "s,i")
    27  
    28  	TestFuncMap   = map[string]*RPCFunc{"c": TestRPCFunc}
    29  	TestGoodBody  = `{"jsonrpc": "2.0", "method": "c", "id": "0", "params": null}`
    30  	TestBadParams = `{"jsonrpc": "2.0", "method": "c", "id": "0", "params": "s=a,i=b"}`
    31  )
    32  
    33  type FailManager struct {
    34  	counter       int
    35  	failedCounter int
    36  	throwPanic    bool
    37  }
    38  
    39  func (fm *FailManager) checkAndDo(
    40  	encounter func() (int, error),
    41  	throwing func(),
    42  ) (int, error) {
    43  	if fm.counter == fm.failedCounter {
    44  		fmt.Println("FailManager:do encounter")
    45  		return encounter()
    46  	}
    47  	fm.counter++
    48  	if fm.throwPanic {
    49  		fmt.Println("FailManager:do throwing")
    50  		throwing()
    51  	}
    52  	return 0, nil
    53  }
    54  
    55  type FailedWriteResponseWriter struct {
    56  	header http.Header
    57  	fm     *FailManager
    58  	code   int
    59  	error  error
    60  }
    61  
    62  func NewFailedWriteResponseWriter() FailedWriteResponseWriter {
    63  	return FailedWriteResponseWriter{
    64  		header: make(http.Header),
    65  		fm:     &FailManager{},
    66  		code:   -1,
    67  		error:  fmt.Errorf("error"),
    68  	}
    69  }
    70  func (frw FailedWriteResponseWriter) Header() http.Header {
    71  	return frw.header
    72  }
    73  func (frw FailedWriteResponseWriter) Write(buf []byte) (int, error) {
    74  	fmt.Println("FailedWriteResponseWriter:" + strconv.Itoa(frw.fm.counter) + ":" + string(buf))
    75  	return frw.fm.checkAndDo(
    76  		func() (int, error) {
    77  			return frw.code, frw.error
    78  		},
    79  		func() {
    80  			res := types.RPCResponse{}
    81  			res.UnmarshalJSON(buf) // nolint: errcheck
    82  			panic(res)
    83  		},
    84  	)
    85  }
    86  func (frw FailedWriteResponseWriter) WriteHeader(code int) {
    87  	frw.header.Set(http.StatusText(code), strconv.Itoa(code))
    88  }
    89  
    90  type FailedLogger struct {
    91  	fm *FailManager
    92  }
    93  
    94  func NewFailedLogger() FailedLogger {
    95  	return FailedLogger{
    96  		fm: &FailManager{},
    97  	}
    98  }
    99  func (l *FailedLogger) Info(msg string, keyvals ...interface{}) {
   100  	fmt.Println("FailedLogger.Info:" + msg)
   101  }
   102  func (l *FailedLogger) Debug(msg string, keyvals ...interface{}) {
   103  	fmt.Println("FailedLogger.Debug:" + msg)
   104  }
   105  func (l *FailedLogger) Error(msg string, keyvals ...interface{}) {
   106  	fmt.Println("FailedLogger.Error:" + strconv.Itoa(l.fm.counter) + ":" + msg)
   107  	l.fm.checkAndDo( // nolint: errcheck
   108  		func() (int, error) { panic(l.fm.counter) },
   109  		func() {},
   110  	)
   111  }
   112  func (l *FailedLogger) With(keyvals ...interface{}) log.Logger {
   113  	return l
   114  }