gitee.com/sasukebo/go-micro/v4@v4.7.1/registry/memory_test.go (about)

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