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 }