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  }