github.com/tickoalcantara12/micro/v3@v3.0.0-20221007104245-9d75b9bcbab9/service/server/mock/mock.go (about) 1 // Copyright 2020 Asim Aslam 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // https://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 // 15 // Original source: github.com/micro/go-micro/v3/server/mock/mock.go 16 17 package mock 18 19 import ( 20 "errors" 21 "sync" 22 23 "github.com/google/uuid" 24 "github.com/tickoalcantara12/micro/v3/service/server" 25 ) 26 27 type MockServer struct { 28 sync.Mutex 29 Running bool 30 Opts server.Options 31 Handlers map[string]server.Handler 32 Subscribers map[string][]server.Subscriber 33 } 34 35 var ( 36 _ server.Server = NewServer() 37 ) 38 39 func newMockServer(opts ...server.Option) *MockServer { 40 var options server.Options 41 42 for _, o := range opts { 43 o(&options) 44 } 45 46 return &MockServer{ 47 Opts: options, 48 Handlers: make(map[string]server.Handler), 49 Subscribers: make(map[string][]server.Subscriber), 50 } 51 } 52 53 func (m *MockServer) Options() server.Options { 54 m.Lock() 55 defer m.Unlock() 56 57 return m.Opts 58 } 59 60 func (m *MockServer) Init(opts ...server.Option) error { 61 m.Lock() 62 defer m.Unlock() 63 64 for _, o := range opts { 65 o(&m.Opts) 66 } 67 return nil 68 } 69 70 func (m *MockServer) Handle(h server.Handler) error { 71 m.Lock() 72 defer m.Unlock() 73 74 if _, ok := m.Handlers[h.Name()]; ok { 75 return errors.New("Handler " + h.Name() + " already exists") 76 } 77 m.Handlers[h.Name()] = h 78 return nil 79 } 80 81 func (m *MockServer) NewHandler(h interface{}, opts ...server.HandlerOption) server.Handler { 82 var options server.HandlerOptions 83 for _, o := range opts { 84 o(&options) 85 } 86 87 return &MockHandler{ 88 Id: uuid.New().String(), 89 Hdlr: h, 90 Opts: options, 91 } 92 } 93 94 func (m *MockServer) NewSubscriber(topic string, fn interface{}, opts ...server.SubscriberOption) server.Subscriber { 95 var options server.SubscriberOptions 96 for _, o := range opts { 97 o(&options) 98 } 99 100 return &MockSubscriber{ 101 Id: topic, 102 Sub: fn, 103 Opts: options, 104 } 105 } 106 107 func (m *MockServer) Subscribe(sub server.Subscriber) error { 108 m.Lock() 109 defer m.Unlock() 110 111 subs := m.Subscribers[sub.Topic()] 112 subs = append(subs, sub) 113 m.Subscribers[sub.Topic()] = subs 114 return nil 115 } 116 117 func (m *MockServer) Register() error { 118 return nil 119 } 120 121 func (m *MockServer) Deregister() error { 122 return nil 123 } 124 125 func (m *MockServer) Start() error { 126 m.Lock() 127 defer m.Unlock() 128 129 if m.Running { 130 return errors.New("already running") 131 } 132 133 m.Running = true 134 return nil 135 } 136 137 func (m *MockServer) Stop() error { 138 m.Lock() 139 defer m.Unlock() 140 141 if !m.Running { 142 return errors.New("not running") 143 } 144 145 m.Running = false 146 return nil 147 } 148 149 func (m *MockServer) String() string { 150 return "mock" 151 } 152 153 func NewServer(opts ...server.Option) *MockServer { 154 return newMockServer(opts...) 155 }