108 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			108 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package blacklist
 | |
| 
 | |
| import (
 | |
| 	"errors"
 | |
| 	"testing"
 | |
| 	"time"
 | |
| 
 | |
| 	"github.com/micro/go-micro/registry"
 | |
| )
 | |
| 
 | |
| func TestBlackList(t *testing.T) {
 | |
| 	bl := &BlackList{
 | |
| 		ttl:  1,
 | |
| 		bl:   make(map[string]blackListNode),
 | |
| 		exit: make(chan bool),
 | |
| 	}
 | |
| 
 | |
| 	go bl.run()
 | |
| 	defer bl.Close()
 | |
| 
 | |
| 	services := []*registry.Service{
 | |
| 		®istry.Service{
 | |
| 			Name: "foo",
 | |
| 			Nodes: []*registry.Node{
 | |
| 				®istry.Node{
 | |
| 					Id:      "foo-1",
 | |
| 					Address: "localhost",
 | |
| 					Port:    10001,
 | |
| 				},
 | |
| 				®istry.Node{
 | |
| 					Id:      "foo-2",
 | |
| 					Address: "localhost",
 | |
| 					Port:    10002,
 | |
| 				},
 | |
| 				®istry.Node{
 | |
| 					Id:      "foo-3",
 | |
| 					Address: "localhost",
 | |
| 					Port:    10002,
 | |
| 				},
 | |
| 			},
 | |
| 		},
 | |
| 	}
 | |
| 
 | |
| 	// check nothing is filtered on clean run
 | |
| 	filterTest := func() {
 | |
| 		for i := 0; i < 3; i++ {
 | |
| 			srvs, err := bl.Filter(services)
 | |
| 			if err != nil {
 | |
| 				t.Fatal(err)
 | |
| 			}
 | |
| 
 | |
| 			if len(srvs) != len(services) {
 | |
| 				t.Fatal("nodes were filtered when they shouldn't be")
 | |
| 			}
 | |
| 
 | |
| 			for _, node := range srvs[0].Nodes {
 | |
| 				var seen bool
 | |
| 				for _, n := range srvs[0].Nodes {
 | |
| 					if n.Id == node.Id {
 | |
| 						seen = true
 | |
| 						break
 | |
| 					}
 | |
| 				}
 | |
| 				if !seen {
 | |
| 					t.Fatalf("Missing node %s", node.Id)
 | |
| 				}
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	// run filter test
 | |
| 	filterTest()
 | |
| 
 | |
| 	blacklistTest := func() {
 | |
| 		// test blacklisting
 | |
| 		// mark until failure
 | |
| 		for i := 0; i < count+1; i++ {
 | |
| 			for _, node := range services[0].Nodes {
 | |
| 				bl.Mark("foo", node, errors.New("blacklist"))
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		filtered, err := bl.Filter(services)
 | |
| 		if err != nil {
 | |
| 			t.Fatal(err)
 | |
| 		}
 | |
| 
 | |
| 		if len(filtered) > 0 {
 | |
| 			t.Fatalf("Expected zero nodes got %+v", filtered)
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	// sleep the ttl duration
 | |
| 	time.Sleep(time.Second * time.Duration(bl.ttl) * 2)
 | |
| 
 | |
| 	// now run filterTest again
 | |
| 	filterTest()
 | |
| 
 | |
| 	// run the blacklist test
 | |
| 	blacklistTest()
 | |
| 
 | |
| 	// reset
 | |
| 	bl.Reset("foo")
 | |
| 
 | |
| 	// check again
 | |
| 	filterTest()
 | |
| }
 |