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