package hostdiscovery import ( "net" "testing" "time" mapset "github.com/deckarep/golang-set" _ "github.com/docker/libnetwork/netutils" "github.com/docker/libnetwork/config" "github.com/docker/swarm/discovery" ) func TestDiscovery(t *testing.T) { _, err := net.Dial("tcp", "discovery-stage.hub.docker.com:80") if err != nil { t.Skip("Skipping Discovery test which need connectivity to discovery-stage.hub.docker.com") } hd := NewHostDiscovery() config, err := config.ParseConfig("libnetwork.toml") if err != nil { t.Fatal(err) } err = hd.StartDiscovery(&config.Cluster, func(hosts []net.IP) {}, func(hosts []net.IP) {}) if err != nil { t.Fatal(err) } time.Sleep(time.Duration(config.Cluster.Heartbeat*2) * time.Second) hosts, err := hd.Fetch() if err != nil { t.Fatal(err) } found := false for _, ip := range hosts { if ip.Equal(net.ParseIP(config.Cluster.Address)) { found = true } } if !found { t.Fatalf("Expecting hosts. But none discovered ") } err = hd.StopDiscovery() if err != nil { t.Fatal(err) } } func TestBadDiscovery(t *testing.T) { _, err := net.Dial("tcp", "discovery-stage.hub.docker.com:80") if err != nil { t.Skip("Skipping Discovery test which need connectivity to discovery-stage.hub.docker.com") } hd := NewHostDiscovery() cfg := &config.Config{} cfg.Cluster.Discovery = "" err = hd.StartDiscovery(&cfg.Cluster, func(hosts []net.IP) {}, func(hosts []net.IP) {}) if err == nil { t.Fatal("Invalid discovery configuration must fail") } cfg, err = config.ParseConfig("libnetwork.toml") if err != nil { t.Fatal(err) } cfg.Cluster.Address = "invalid" err = hd.StartDiscovery(&cfg.Cluster, func(hosts []net.IP) {}, func(hosts []net.IP) {}) if err == nil { t.Fatal("Invalid discovery address configuration must fail") } } func TestDiff(t *testing.T) { existing := mapset.NewSetFromSlice([]interface{}{"1.1.1.1", "2.2.2.2"}) addedIP := "3.3.3.3" updated := existing.Clone() updated.Add(addedIP) added, removed := diff(existing, updated) if len(added) != 1 { t.Fatalf("Diff failed for an Add update. Expecting 1 element, but got %d elements", len(added)) } if added[0].String() != addedIP { t.Fatalf("Expecting : %v, Got : %v", addedIP, added[0]) } if len(removed) > 0 { t.Fatalf("Diff failed for remove use-case. Expecting 0 element, but got %d elements", len(removed)) } updated = mapset.NewSetFromSlice([]interface{}{addedIP}) added, removed = diff(existing, updated) if len(removed) != 2 { t.Fatalf("Diff failed for an remove update. Expecting 2 element, but got %d elements", len(removed)) } if len(added) != 1 { t.Fatalf("Diff failed for add use-case. Expecting 1 element, but got %d elements", len(added)) } } func TestAddedCallback(t *testing.T) { hd := hostDiscovery{} hd.nodes = mapset.NewSetFromSlice([]interface{}{"1.1.1.1"}) update := []*discovery.Entry{&discovery.Entry{Host: "1.1.1.1", Port: "0"}, &discovery.Entry{Host: "2.2.2.2", Port: "0"}} added := false removed := false hd.processCallback(update, func(hosts []net.IP) { added = true }, func(hosts []net.IP) { removed = true }) if !added { t.Fatalf("Expecting a Added callback notification. But none received") } } func TestRemovedCallback(t *testing.T) { hd := hostDiscovery{} hd.nodes = mapset.NewSetFromSlice([]interface{}{"1.1.1.1", "2.2.2.2"}) update := []*discovery.Entry{&discovery.Entry{Host: "1.1.1.1", Port: "0"}} added := false removed := false hd.processCallback(update, func(hosts []net.IP) { added = true }, func(hosts []net.IP) { removed = true }) if !removed { t.Fatalf("Expecting a Removed callback notification. But none received") } } func TestNoCallback(t *testing.T) { hd := hostDiscovery{} hd.nodes = mapset.NewSetFromSlice([]interface{}{"1.1.1.1", "2.2.2.2"}) update := []*discovery.Entry{&discovery.Entry{Host: "1.1.1.1", Port: "0"}, &discovery.Entry{Host: "2.2.2.2", Port: "0"}} added := false removed := false hd.processCallback(update, func(hosts []net.IP) { added = true }, func(hosts []net.IP) { removed = true }) if added || removed { t.Fatalf("Not expecting any callback notification. But received a callback") } }