diff --git a/registry/mock/helper.go b/registry/mock/helper.go new file mode 100644 index 00000000..aadb3839 --- /dev/null +++ b/registry/mock/helper.go @@ -0,0 +1,76 @@ +package mock + +import ( + "github.com/micro/go-micro/registry" +) + +func addNodes(old, neu []*registry.Node) []*registry.Node { + for _, n := range neu { + var seen bool + for i, o := range old { + if o.Id == n.Id { + seen = true + old[i] = n + break + } + } + if !seen { + old = append(old, n) + } + } + return old +} + +func addServices(old, neu []*registry.Service) []*registry.Service { + for _, s := range neu { + var seen bool + for i, o := range old { + if o.Version == s.Version { + s.Nodes = addNodes(o.Nodes, s.Nodes) + seen = true + old[i] = s + break + } + } + if !seen { + old = append(old, s) + } + } + return old +} + +func delNodes(old, del []*registry.Node) []*registry.Node { + var nodes []*registry.Node + for _, o := range old { + var rem bool + for _, n := range del { + if o.Id == n.Id { + rem = true + break + } + } + if !rem { + nodes = append(nodes, o) + } + } + return nodes +} + +func delServices(old, del []*registry.Service) []*registry.Service { + var services []*registry.Service + for i, o := range old { + var rem bool + for _, s := range del { + if o.Version == s.Version { + old[i].Nodes = delNodes(o.Nodes, s.Nodes) + if len(old[i].Nodes) == 0 { + rem = true + } + } + } + if !rem { + services = append(services, o) + } + } + return services +} diff --git a/registry/mock/helper_test.go b/registry/mock/helper_test.go new file mode 100644 index 00000000..a9571d1a --- /dev/null +++ b/registry/mock/helper_test.go @@ -0,0 +1,78 @@ +package mock + +import ( + "testing" + + "github.com/micro/go-micro/registry" +) + +func TestDelServices(t *testing.T) { + services := []*registry.Service{ + { + Name: "foo", + Version: "1.0.0", + Nodes: []*registry.Node{ + { + Id: "foo-123", + Address: "localhost", + Port: 9999, + }, + }, + }, + { + Name: "foo", + Version: "1.0.0", + Nodes: []*registry.Node{ + { + Id: "foo-123", + Address: "localhost", + Port: 6666, + }, + }, + }, + } + + servs := delServices([]*registry.Service{services[0]}, []*registry.Service{services[1]}) + if i := len(servs); i > 0 { + t.Errorf("Expected 0 nodes, got %d: %+v", i, servs) + } + t.Logf("Services %+v", servs) +} + +func TestDelNodes(t *testing.T) { + services := []*registry.Service{ + { + Name: "foo", + Version: "1.0.0", + Nodes: []*registry.Node{ + { + Id: "foo-123", + Address: "localhost", + Port: 9999, + }, + { + Id: "foo-321", + Address: "localhost", + Port: 6666, + }, + }, + }, + { + Name: "foo", + Version: "1.0.0", + Nodes: []*registry.Node{ + { + Id: "foo-123", + Address: "localhost", + Port: 6666, + }, + }, + }, + } + + nodes := delNodes(services[0].Nodes, services[1].Nodes) + if i := len(nodes); i != 1 { + t.Errorf("Expected only 1 node, got %d: %+v", i, nodes) + } + t.Logf("Nodes %+v", nodes) +} diff --git a/registry/mock/mock.go b/registry/mock/mock.go index ced5f308..2478bf3f 100644 --- a/registry/mock/mock.go +++ b/registry/mock/mock.go @@ -8,48 +8,54 @@ type MockRegistry struct { Services map[string][]*registry.Service } -func (m *MockRegistry) init() { - // add some mock data - m.Services["foo"] = []*registry.Service{ - { - Name: "foo", - Version: "1.0.0", - Nodes: []*registry.Node{ - { - Id: "foo-1.0.0-123", - Address: "localhost", - Port: 9999, - }, - { - Id: "foo-1.0.0-321", - Address: "localhost", - Port: 9999, +var ( + mockData = map[string][]*registry.Service{ + "foo": []*registry.Service{ + { + Name: "foo", + Version: "1.0.0", + Nodes: []*registry.Node{ + { + Id: "foo-1.0.0-123", + Address: "localhost", + Port: 9999, + }, + { + Id: "foo-1.0.0-321", + Address: "localhost", + Port: 9999, + }, }, }, - }, - { - Name: "foo", - Version: "1.0.1", - Nodes: []*registry.Node{ - { - Id: "foo-1.0.1-321", - Address: "localhost", - Port: 6666, + { + Name: "foo", + Version: "1.0.1", + Nodes: []*registry.Node{ + { + Id: "foo-1.0.1-321", + Address: "localhost", + Port: 6666, + }, }, }, - }, - { - Name: "foo", - Version: "1.0.3", - Nodes: []*registry.Node{ - { - Id: "foo-1.0.3-345", - Address: "localhost", - Port: 8888, + { + Name: "foo", + Version: "1.0.3", + Nodes: []*registry.Node{ + { + Id: "foo-1.0.3-345", + Address: "localhost", + Port: 8888, + }, }, }, }, } +) + +func (m *MockRegistry) init() { + // add some mock data + m.Services = mockData } func (m *MockRegistry) GetService(service string) ([]*registry.Service, error) { @@ -70,10 +76,14 @@ func (m *MockRegistry) ListServices() ([]*registry.Service, error) { } func (m *MockRegistry) Register(s *registry.Service, opts ...registry.RegisterOption) error { + services := addServices(m.Services[s.Name], []*registry.Service{s}) + m.Services[s.Name] = services return nil } func (m *MockRegistry) Deregister(s *registry.Service) error { + services := delServices(m.Services[s.Name], []*registry.Service{s}) + m.Services[s.Name] = services return nil } diff --git a/registry/mock/mock_test.go b/registry/mock/mock_test.go new file mode 100644 index 00000000..212599d7 --- /dev/null +++ b/registry/mock/mock_test.go @@ -0,0 +1,138 @@ +package mock + +import ( + "testing" + + "github.com/micro/go-micro/registry" +) + +var ( + testData = map[string][]*registry.Service{ + "foo": []*registry.Service{ + { + Name: "foo", + Version: "1.0.0", + Nodes: []*registry.Node{ + { + Id: "foo-1.0.0-123", + Address: "localhost", + Port: 9999, + }, + { + Id: "foo-1.0.0-321", + Address: "localhost", + Port: 9999, + }, + }, + }, + { + Name: "foo", + Version: "1.0.1", + Nodes: []*registry.Node{ + { + Id: "foo-1.0.1-321", + Address: "localhost", + Port: 6666, + }, + }, + }, + { + Name: "foo", + Version: "1.0.3", + Nodes: []*registry.Node{ + { + Id: "foo-1.0.3-345", + Address: "localhost", + Port: 8888, + }, + }, + }, + }, + "bar": []*registry.Service{ + { + Name: "bar", + Version: "default", + Nodes: []*registry.Node{ + { + Id: "bar-1.0.0-123", + Address: "localhost", + Port: 9999, + }, + { + Id: "bar-1.0.0-321", + Address: "localhost", + Port: 9999, + }, + }, + }, + { + Name: "bar", + Version: "latest", + Nodes: []*registry.Node{ + { + Id: "bar-1.0.1-321", + Address: "localhost", + Port: 6666, + }, + }, + }, + }, + } +) + +func TestMockRegistry(t *testing.T) { + m := NewRegistry() + + fn := func(k string, v []*registry.Service) { + services, err := m.GetService(k) + if err != nil { + t.Errorf("Unexpected error getting service %s: %v", k, err) + } + + if len(services) != len(v) { + t.Errorf("Expected %d services for %s, got %d", len(v), k, len(services)) + } + + for _, service := range v { + var seen bool + for _, s := range services { + if s.Version == service.Version { + seen = true + break + } + } + if !seen { + t.Errorf("expected to find version %s", service.Version) + } + } + } + + // test existing mock data + for k, v := range mockData { + fn(k, v) + } + + // register data + for _, v := range testData { + for _, service := range v { + if err := m.Register(service); err != nil { + t.Errorf("Unexpected register error: %v", err) + } + } + } + + // using test data + for k, v := range testData { + + fn(k, v) + } + + // deregister + for _, v := range testData { + for _, service := range v { + if err := m.Deregister(service); err != nil { + t.Errorf("Unexpected deregister error: %v", err) + } + } + } +}