gitee.com/liuxuezhan/go-micro-v1.18.0@v1.0.0/registry/memory/memory_test.go (about)

     1  package memory
     2  
     3  import (
     4  	"fmt"
     5  	"testing"
     6  	"time"
     7  
     8  	"gitee.com/liuxuezhan/go-micro-v1.18.0/registry"
     9  )
    10  
    11  var (
    12  	testData = map[string][]*registry.Service{
    13  		"foo": {
    14  			{
    15  				Name:    "foo",
    16  				Version: "1.0.0",
    17  				Nodes: []*registry.Node{
    18  					{
    19  						Id:      "foo-1.0.0-123",
    20  						Address: "localhost:9999",
    21  					},
    22  					{
    23  						Id:      "foo-1.0.0-321",
    24  						Address: "localhost:9999",
    25  					},
    26  				},
    27  			},
    28  			{
    29  				Name:    "foo",
    30  				Version: "1.0.1",
    31  				Nodes: []*registry.Node{
    32  					{
    33  						Id:      "foo-1.0.1-321",
    34  						Address: "localhost:6666",
    35  					},
    36  				},
    37  			},
    38  			{
    39  				Name:    "foo",
    40  				Version: "1.0.3",
    41  				Nodes: []*registry.Node{
    42  					{
    43  						Id:      "foo-1.0.3-345",
    44  						Address: "localhost:8888",
    45  					},
    46  				},
    47  			},
    48  		},
    49  		"bar": {
    50  			{
    51  				Name:    "bar",
    52  				Version: "default",
    53  				Nodes: []*registry.Node{
    54  					{
    55  						Id:      "bar-1.0.0-123",
    56  						Address: "localhost:9999",
    57  					},
    58  					{
    59  						Id:      "bar-1.0.0-321",
    60  						Address: "localhost:9999",
    61  					},
    62  				},
    63  			},
    64  			{
    65  				Name:    "bar",
    66  				Version: "latest",
    67  				Nodes: []*registry.Node{
    68  					{
    69  						Id:      "bar-1.0.1-321",
    70  						Address: "localhost:6666",
    71  					},
    72  				},
    73  			},
    74  		},
    75  	}
    76  )
    77  
    78  func TestMemoryRegistry(t *testing.T) {
    79  	m := NewRegistry()
    80  
    81  	fn := func(k string, v []*registry.Service) {
    82  		services, err := m.GetService(k)
    83  		if err != nil {
    84  			t.Errorf("Unexpected error getting service %s: %v", k, err)
    85  		}
    86  
    87  		if len(services) != len(v) {
    88  			t.Errorf("Expected %d services for %s, got %d", len(v), k, len(services))
    89  		}
    90  
    91  		for _, service := range v {
    92  			var seen bool
    93  			for _, s := range services {
    94  				if s.Version == service.Version {
    95  					seen = true
    96  					break
    97  				}
    98  			}
    99  			if !seen {
   100  				t.Errorf("expected to find version %s", service.Version)
   101  			}
   102  		}
   103  	}
   104  
   105  	// register data
   106  	for _, v := range testData {
   107  		serviceCount := 0
   108  		for _, service := range v {
   109  			if err := m.Register(service); err != nil {
   110  				t.Errorf("Unexpected register error: %v", err)
   111  			}
   112  			serviceCount++
   113  			// after the service has been registered we should be able to query it
   114  			services, err := m.GetService(service.Name)
   115  			if err != nil {
   116  				t.Errorf("Unexpected error getting service %s: %v", service.Name, err)
   117  			}
   118  			if len(services) != serviceCount {
   119  				t.Errorf("Expected %d services for %s, got %d", serviceCount, service.Name, len(services))
   120  			}
   121  		}
   122  	}
   123  
   124  	// using test data
   125  	for k, v := range testData {
   126  		fn(k, v)
   127  	}
   128  
   129  	services, err := m.ListServices()
   130  	if err != nil {
   131  		t.Errorf("Unexpected error when listing services: %v", err)
   132  	}
   133  
   134  	totalServiceCount := 0
   135  	for _, testSvc := range testData {
   136  		for range testSvc {
   137  			totalServiceCount++
   138  		}
   139  	}
   140  
   141  	if len(services) != totalServiceCount {
   142  		t.Errorf("Expected total service count: %d, got: %d", totalServiceCount, len(services))
   143  	}
   144  
   145  	// deregister
   146  	for _, v := range testData {
   147  		for _, service := range v {
   148  			if err := m.Deregister(service); err != nil {
   149  				t.Errorf("Unexpected deregister error: %v", err)
   150  			}
   151  		}
   152  	}
   153  
   154  	// after all the service nodes have been deregistered we should not get any results
   155  	for _, v := range testData {
   156  		for _, service := range v {
   157  			services, err := m.GetService(service.Name)
   158  			if err != registry.ErrNotFound {
   159  				t.Errorf("Expected error: %v, got: %v", registry.ErrNotFound, err)
   160  			}
   161  			if len(services) != 0 {
   162  				t.Errorf("Expected %d services for %s, got %d", 0, service.Name, len(services))
   163  			}
   164  		}
   165  	}
   166  }
   167  
   168  func TestMemoryRegistryTTL(t *testing.T) {
   169  	m := NewRegistry()
   170  
   171  	for _, v := range testData {
   172  		for _, service := range v {
   173  			if err := m.Register(service, registry.RegisterTTL(time.Millisecond)); err != nil {
   174  				t.Fatal(err)
   175  			}
   176  		}
   177  	}
   178  
   179  	time.Sleep(ttlPruneTime * 2)
   180  
   181  	for name := range testData {
   182  		svcs, err := m.GetService(name)
   183  		if err != nil {
   184  			t.Fatal(err)
   185  		}
   186  
   187  		for _, svc := range svcs {
   188  			if len(svc.Nodes) > 0 {
   189  				t.Fatalf("Service %q still has nodes registered", name)
   190  			}
   191  		}
   192  	}
   193  }
   194  
   195  func TestMemoryRegistryTTLConcurrent(t *testing.T) {
   196  	concurrency := 1000
   197  	waitTime := ttlPruneTime * 2
   198  	m := NewRegistry()
   199  
   200  	for _, v := range testData {
   201  		for _, service := range v {
   202  			if err := m.Register(service, registry.RegisterTTL(waitTime/2)); err != nil {
   203  				t.Fatal(err)
   204  			}
   205  		}
   206  	}
   207  
   208  	t.Logf("test will wait %v, then check TTL timeouts", waitTime)
   209  
   210  	errChan := make(chan error, concurrency)
   211  	syncChan := make(chan struct{})
   212  
   213  	for i := 0; i < concurrency; i++ {
   214  		go func() {
   215  			<-syncChan
   216  			for name := range testData {
   217  				svcs, err := m.GetService(name)
   218  				if err != nil {
   219  					errChan <- err
   220  					return
   221  				}
   222  
   223  				for _, svc := range svcs {
   224  					if len(svc.Nodes) > 0 {
   225  						errChan <- fmt.Errorf("Service %q still has nodes registered", name)
   226  						return
   227  					}
   228  				}
   229  			}
   230  
   231  			errChan <- nil
   232  		}()
   233  	}
   234  
   235  	time.Sleep(waitTime)
   236  	close(syncChan)
   237  
   238  	for i := 0; i < concurrency; i++ {
   239  		if err := <-errChan; err != nil {
   240  			t.Fatal(err)
   241  		}
   242  	}
   243  }