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