github.com/micro/go-micro/v2@v2.9.1/registry/mdns_test.go (about)

     1  package registry
     2  
     3  import (
     4  	"os"
     5  	"testing"
     6  	"time"
     7  )
     8  
     9  func TestMDNS(t *testing.T) {
    10  	// skip test in travis because of sendto: operation not permitted error
    11  	if travis := os.Getenv("TRAVIS"); travis == "true" {
    12  		t.Skip()
    13  	}
    14  
    15  	testData := []*Service{
    16  		{
    17  			Name:    "test1",
    18  			Version: "1.0.1",
    19  			Nodes: []*Node{
    20  				{
    21  					Id:      "test1-1",
    22  					Address: "10.0.0.1:10001",
    23  					Metadata: map[string]string{
    24  						"foo": "bar",
    25  					},
    26  				},
    27  			},
    28  		},
    29  		{
    30  			Name:    "test2",
    31  			Version: "1.0.2",
    32  			Nodes: []*Node{
    33  				{
    34  					Id:      "test2-1",
    35  					Address: "10.0.0.2:10002",
    36  					Metadata: map[string]string{
    37  						"foo2": "bar2",
    38  					},
    39  				},
    40  			},
    41  		},
    42  		{
    43  			Name:    "test3",
    44  			Version: "1.0.3",
    45  			Nodes: []*Node{
    46  				{
    47  					Id:      "test3-1",
    48  					Address: "10.0.0.3:10003",
    49  					Metadata: map[string]string{
    50  						"foo3": "bar3",
    51  					},
    52  				},
    53  			},
    54  		},
    55  	}
    56  
    57  	travis := os.Getenv("TRAVIS")
    58  
    59  	var opts []Option
    60  
    61  	if travis == "true" {
    62  		opts = append(opts, Timeout(time.Millisecond*100))
    63  	}
    64  
    65  	// new registry
    66  	r := NewRegistry(opts...)
    67  
    68  	for _, service := range testData {
    69  		// register service
    70  		if err := r.Register(service); err != nil {
    71  			t.Fatal(err)
    72  		}
    73  
    74  		// get registered service
    75  		s, err := r.GetService(service.Name)
    76  		if err != nil {
    77  			t.Fatal(err)
    78  		}
    79  
    80  		if len(s) != 1 {
    81  			t.Fatalf("Expected one result for %s got %d", service.Name, len(s))
    82  
    83  		}
    84  
    85  		if s[0].Name != service.Name {
    86  			t.Fatalf("Expected name %s got %s", service.Name, s[0].Name)
    87  		}
    88  
    89  		if s[0].Version != service.Version {
    90  			t.Fatalf("Expected version %s got %s", service.Version, s[0].Version)
    91  		}
    92  
    93  		if len(s[0].Nodes) != 1 {
    94  			t.Fatalf("Expected 1 node, got %d", len(s[0].Nodes))
    95  		}
    96  
    97  		node := s[0].Nodes[0]
    98  
    99  		if node.Id != service.Nodes[0].Id {
   100  			t.Fatalf("Expected node id %s got %s", service.Nodes[0].Id, node.Id)
   101  		}
   102  
   103  		if node.Address != service.Nodes[0].Address {
   104  			t.Fatalf("Expected node address %s got %s", service.Nodes[0].Address, node.Address)
   105  		}
   106  	}
   107  
   108  	services, err := r.ListServices()
   109  	if err != nil {
   110  		t.Fatal(err)
   111  	}
   112  
   113  	for _, service := range testData {
   114  		var seen bool
   115  		for _, s := range services {
   116  			if s.Name == service.Name {
   117  				seen = true
   118  				break
   119  			}
   120  		}
   121  		if !seen {
   122  			t.Fatalf("Expected service %s got nothing", service.Name)
   123  		}
   124  
   125  		// deregister
   126  		if err := r.Deregister(service); err != nil {
   127  			t.Fatal(err)
   128  		}
   129  
   130  		time.Sleep(time.Millisecond * 5)
   131  
   132  		// check its gone
   133  		s, _ := r.GetService(service.Name)
   134  		if len(s) > 0 {
   135  			t.Fatalf("Expected nothing got %+v", s[0])
   136  		}
   137  	}
   138  
   139  }
   140  
   141  func TestEncoding(t *testing.T) {
   142  	testData := []*mdnsTxt{
   143  		{
   144  			Version: "1.0.0",
   145  			Metadata: map[string]string{
   146  				"foo": "bar",
   147  			},
   148  			Endpoints: []*Endpoint{
   149  				{
   150  					Name: "endpoint1",
   151  					Request: &Value{
   152  						Name: "request",
   153  						Type: "request",
   154  					},
   155  					Response: &Value{
   156  						Name: "response",
   157  						Type: "response",
   158  					},
   159  					Metadata: map[string]string{
   160  						"foo1": "bar1",
   161  					},
   162  				},
   163  			},
   164  		},
   165  	}
   166  
   167  	for _, d := range testData {
   168  		encoded, err := encode(d)
   169  		if err != nil {
   170  			t.Fatal(err)
   171  		}
   172  
   173  		for _, txt := range encoded {
   174  			if len(txt) > 255 {
   175  				t.Fatalf("One of parts for txt is %d characters", len(txt))
   176  			}
   177  		}
   178  
   179  		decoded, err := decode(encoded)
   180  		if err != nil {
   181  			t.Fatal(err)
   182  		}
   183  
   184  		if decoded.Version != d.Version {
   185  			t.Fatalf("Expected version %s got %s", d.Version, decoded.Version)
   186  		}
   187  
   188  		if len(decoded.Endpoints) != len(d.Endpoints) {
   189  			t.Fatalf("Expected %d endpoints, got %d", len(d.Endpoints), len(decoded.Endpoints))
   190  		}
   191  
   192  		for k, v := range d.Metadata {
   193  			if val := decoded.Metadata[k]; val != v {
   194  				t.Fatalf("Expected %s=%s got %s=%s", k, v, k, val)
   195  			}
   196  		}
   197  	}
   198  
   199  }
   200  
   201  func TestWatcher(t *testing.T) {
   202  	if travis := os.Getenv("TRAVIS"); travis == "true" {
   203  		t.Skip()
   204  	}
   205  
   206  	testData := []*Service{
   207  		{
   208  			Name:    "test1",
   209  			Version: "1.0.1",
   210  			Nodes: []*Node{
   211  				{
   212  					Id:      "test1-1",
   213  					Address: "10.0.0.1:10001",
   214  					Metadata: map[string]string{
   215  						"foo": "bar",
   216  					},
   217  				},
   218  			},
   219  		},
   220  		{
   221  			Name:    "test2",
   222  			Version: "1.0.2",
   223  			Nodes: []*Node{
   224  				{
   225  					Id:      "test2-1",
   226  					Address: "10.0.0.2:10002",
   227  					Metadata: map[string]string{
   228  						"foo2": "bar2",
   229  					},
   230  				},
   231  			},
   232  		},
   233  		{
   234  			Name:    "test3",
   235  			Version: "1.0.3",
   236  			Nodes: []*Node{
   237  				{
   238  					Id:      "test3-1",
   239  					Address: "10.0.0.3:10003",
   240  					Metadata: map[string]string{
   241  						"foo3": "bar3",
   242  					},
   243  				},
   244  			},
   245  		},
   246  	}
   247  
   248  	testFn := func(service, s *Service) {
   249  		if s == nil {
   250  			t.Fatalf("Expected one result for %s got nil", service.Name)
   251  
   252  		}
   253  
   254  		if s.Name != service.Name {
   255  			t.Fatalf("Expected name %s got %s", service.Name, s.Name)
   256  		}
   257  
   258  		if s.Version != service.Version {
   259  			t.Fatalf("Expected version %s got %s", service.Version, s.Version)
   260  		}
   261  
   262  		if len(s.Nodes) != 1 {
   263  			t.Fatalf("Expected 1 node, got %d", len(s.Nodes))
   264  		}
   265  
   266  		node := s.Nodes[0]
   267  
   268  		if node.Id != service.Nodes[0].Id {
   269  			t.Fatalf("Expected node id %s got %s", service.Nodes[0].Id, node.Id)
   270  		}
   271  
   272  		if node.Address != service.Nodes[0].Address {
   273  			t.Fatalf("Expected node address %s got %s", service.Nodes[0].Address, node.Address)
   274  		}
   275  	}
   276  
   277  	travis := os.Getenv("TRAVIS")
   278  
   279  	var opts []Option
   280  
   281  	if travis == "true" {
   282  		opts = append(opts, Timeout(time.Millisecond*100))
   283  	}
   284  
   285  	// new registry
   286  	r := NewRegistry(opts...)
   287  
   288  	w, err := r.Watch()
   289  	if err != nil {
   290  		t.Fatal(err)
   291  	}
   292  	defer w.Stop()
   293  
   294  	for _, service := range testData {
   295  		// register service
   296  		if err := r.Register(service); err != nil {
   297  			t.Fatal(err)
   298  		}
   299  
   300  		for {
   301  			res, err := w.Next()
   302  			if err != nil {
   303  				t.Fatal(err)
   304  			}
   305  
   306  			if res.Service.Name != service.Name {
   307  				continue
   308  			}
   309  
   310  			if res.Action != "create" {
   311  				t.Fatalf("Expected create event got %s for %s", res.Action, res.Service.Name)
   312  			}
   313  
   314  			testFn(service, res.Service)
   315  			break
   316  		}
   317  
   318  		// deregister
   319  		if err := r.Deregister(service); err != nil {
   320  			t.Fatal(err)
   321  		}
   322  
   323  		for {
   324  			res, err := w.Next()
   325  			if err != nil {
   326  				t.Fatal(err)
   327  			}
   328  
   329  			if res.Service.Name != service.Name {
   330  				continue
   331  			}
   332  
   333  			if res.Action != "delete" {
   334  				continue
   335  			}
   336  
   337  			testFn(service, res.Service)
   338  			break
   339  		}
   340  	}
   341  }