Add mock server
This commit is contained in:
		
							
								
								
									
										139
									
								
								server/mock/mock.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										139
									
								
								server/mock/mock.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,139 @@ | ||||
| package mock | ||||
|  | ||||
| import ( | ||||
| 	"errors" | ||||
| 	"sync" | ||||
|  | ||||
| 	"github.com/micro/go-micro/server" | ||||
| 	"github.com/pborman/uuid" | ||||
| ) | ||||
|  | ||||
| type MockServer struct { | ||||
| 	sync.Mutex | ||||
| 	Running     bool | ||||
| 	Opts        server.Options | ||||
| 	Handlers    map[string]server.Handler | ||||
| 	Subscribers map[string][]server.Subscriber | ||||
| } | ||||
|  | ||||
| var ( | ||||
| 	_ server.Server = NewServer() | ||||
| ) | ||||
|  | ||||
| func newMockServer(opts ...server.Option) *MockServer { | ||||
| 	var options server.Options | ||||
|  | ||||
| 	for _, o := range opts { | ||||
| 		o(&options) | ||||
| 	} | ||||
|  | ||||
| 	return &MockServer{ | ||||
| 		Opts:        options, | ||||
| 		Handlers:    make(map[string]server.Handler), | ||||
| 		Subscribers: make(map[string][]server.Subscriber), | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func (m *MockServer) Options() server.Options { | ||||
| 	m.Lock() | ||||
| 	defer m.Unlock() | ||||
|  | ||||
| 	return m.Opts | ||||
| } | ||||
|  | ||||
| func (m *MockServer) Init(opts ...server.Option) error { | ||||
| 	m.Lock() | ||||
| 	defer m.Unlock() | ||||
|  | ||||
| 	for _, o := range opts { | ||||
| 		o(&m.Opts) | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func (m *MockServer) Handle(h server.Handler) error { | ||||
| 	m.Lock() | ||||
| 	defer m.Unlock() | ||||
|  | ||||
| 	if _, ok := m.Handlers[h.Name()]; ok { | ||||
| 		return errors.New("Handler " + h.Name() + " already exists") | ||||
| 	} | ||||
| 	m.Handlers[h.Name()] = h | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func (m *MockServer) NewHandler(h interface{}, opts ...server.HandlerOption) server.Handler { | ||||
| 	var options server.HandlerOptions | ||||
| 	for _, o := range opts { | ||||
| 		o(&options) | ||||
| 	} | ||||
|  | ||||
| 	return &MockHandler{ | ||||
| 		Id:   uuid.NewUUID().String(), | ||||
| 		Hdlr: h, | ||||
| 		Opts: options, | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func (m *MockServer) NewSubscriber(topic string, fn interface{}, opts ...server.SubscriberOption) server.Subscriber { | ||||
| 	var options server.SubscriberOptions | ||||
| 	for _, o := range opts { | ||||
| 		o(&options) | ||||
| 	} | ||||
|  | ||||
| 	return &MockSubscriber{ | ||||
| 		Id:   topic, | ||||
| 		Sub:  fn, | ||||
| 		Opts: options, | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func (m *MockServer) Subscribe(sub server.Subscriber) error { | ||||
| 	m.Lock() | ||||
| 	defer m.Unlock() | ||||
|  | ||||
| 	subs := m.Subscribers[sub.Topic()] | ||||
| 	subs = append(subs, sub) | ||||
| 	m.Subscribers[sub.Topic()] = subs | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func (m *MockServer) Register() error { | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func (m *MockServer) Deregister() error { | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func (m *MockServer) Start() error { | ||||
| 	m.Lock() | ||||
| 	defer m.Unlock() | ||||
|  | ||||
| 	if m.Running { | ||||
| 		return errors.New("already running") | ||||
| 	} | ||||
|  | ||||
| 	m.Running = true | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func (m *MockServer) Stop() error { | ||||
| 	m.Lock() | ||||
| 	defer m.Unlock() | ||||
|  | ||||
| 	if !m.Running { | ||||
| 		return errors.New("not running") | ||||
| 	} | ||||
|  | ||||
| 	m.Running = false | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func (m *MockServer) String() string { | ||||
| 	return "mock" | ||||
| } | ||||
|  | ||||
| func NewServer(opts ...server.Option) *MockServer { | ||||
| 	return newMockServer(opts...) | ||||
| } | ||||
							
								
								
									
										28
									
								
								server/mock/mock_handler.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								server/mock/mock_handler.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,28 @@ | ||||
| package mock | ||||
|  | ||||
| import ( | ||||
| 	"github.com/micro/go-micro/registry" | ||||
| 	"github.com/micro/go-micro/server" | ||||
| ) | ||||
|  | ||||
| type MockHandler struct { | ||||
| 	Id   string | ||||
| 	Opts server.HandlerOptions | ||||
| 	Hdlr interface{} | ||||
| } | ||||
|  | ||||
| func (m *MockHandler) Name() string { | ||||
| 	return m.Id | ||||
| } | ||||
|  | ||||
| func (m *MockHandler) Handler() interface{} { | ||||
| 	return m.Hdlr | ||||
| } | ||||
|  | ||||
| func (m *MockHandler) Endpoints() []*registry.Endpoint { | ||||
| 	return []*registry.Endpoint{} | ||||
| } | ||||
|  | ||||
| func (m *MockHandler) Options() server.HandlerOptions { | ||||
| 	return m.Opts | ||||
| } | ||||
							
								
								
									
										28
									
								
								server/mock/mock_subscriber.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								server/mock/mock_subscriber.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,28 @@ | ||||
| package mock | ||||
|  | ||||
| import ( | ||||
| 	"github.com/micro/go-micro/registry" | ||||
| 	"github.com/micro/go-micro/server" | ||||
| ) | ||||
|  | ||||
| type MockSubscriber struct { | ||||
| 	Id   string | ||||
| 	Opts server.SubscriberOptions | ||||
| 	Sub  interface{} | ||||
| } | ||||
|  | ||||
| func (m *MockSubscriber) Topic() string { | ||||
| 	return m.Id | ||||
| } | ||||
|  | ||||
| func (m *MockSubscriber) Subscriber() interface{} { | ||||
| 	return m.Sub | ||||
| } | ||||
|  | ||||
| func (m *MockSubscriber) Endpoints() []*registry.Endpoint { | ||||
| 	return []*registry.Endpoint{} | ||||
| } | ||||
|  | ||||
| func (m *MockSubscriber) Options() server.SubscriberOptions { | ||||
| 	return m.Opts | ||||
| } | ||||
							
								
								
									
										57
									
								
								server/mock/mock_test.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										57
									
								
								server/mock/mock_test.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,57 @@ | ||||
| package mock | ||||
|  | ||||
| import ( | ||||
| 	"testing" | ||||
|  | ||||
| 	"github.com/micro/go-micro/server" | ||||
| ) | ||||
|  | ||||
| func TestMockServer(t *testing.T) { | ||||
| 	srv := NewServer( | ||||
| 		server.Name("mock"), | ||||
| 		server.Version("latest"), | ||||
| 	) | ||||
|  | ||||
| 	if srv.Options().Name != "mock" { | ||||
| 		t.Fatalf("Expected name mock, got %s", srv.Options().Name) | ||||
| 	} | ||||
|  | ||||
| 	if srv.Options().Version != "latest" { | ||||
| 		t.Fatalf("Expected version latest, got %s", srv.Options().Version) | ||||
| 	} | ||||
|  | ||||
| 	srv.Init(server.Version("test")) | ||||
| 	if srv.Options().Version != "test" { | ||||
| 		t.Fatalf("Expected version test, got %s", srv.Options().Version) | ||||
| 	} | ||||
|  | ||||
| 	h := srv.NewHandler(func() string { return "foo" }) | ||||
| 	if err := srv.Handle(h); err != nil { | ||||
| 		t.Fatal(err) | ||||
| 	} | ||||
|  | ||||
| 	sub := srv.NewSubscriber("test", func() string { return "foo" }) | ||||
| 	if err := srv.Subscribe(sub); err != nil { | ||||
| 		t.Fatal(err) | ||||
| 	} | ||||
|  | ||||
| 	if sub.Topic() != "test" { | ||||
| 		t.Fatalf("Expected topic test got %s", sub.Topic()) | ||||
| 	} | ||||
|  | ||||
| 	if err := srv.Start(); err != nil { | ||||
| 		t.Fatal(err) | ||||
| 	} | ||||
|  | ||||
| 	if err := srv.Register(); err != nil { | ||||
| 		t.Fatal(err) | ||||
| 	} | ||||
|  | ||||
| 	if err := srv.Deregister(); err != nil { | ||||
| 		t.Fatal(err) | ||||
| 	} | ||||
|  | ||||
| 	if err := srv.Stop(); err != nil { | ||||
| 		t.Fatal(err) | ||||
| 	} | ||||
| } | ||||
		Reference in New Issue
	
	Block a user