package discovery // import "github.com/docker/docker/daemon/discovery" import ( "fmt" "testing" "time" "gotest.tools/v3/assert" is "gotest.tools/v3/assert/cmp" ) func TestDiscoveryOptsErrors(t *testing.T) { var testcases = []struct { doc string opts map[string]string }{ { doc: "discovery.ttl < discovery.heartbeat", opts: map[string]string{"discovery.heartbeat": "10", "discovery.ttl": "5"}, }, { doc: "discovery.ttl == discovery.heartbeat", opts: map[string]string{"discovery.heartbeat": "10", "discovery.ttl": "10"}, }, { doc: "negative discovery.heartbeat", opts: map[string]string{"discovery.heartbeat": "-10", "discovery.ttl": "10"}, }, { doc: "negative discovery.ttl", opts: map[string]string{"discovery.heartbeat": "10", "discovery.ttl": "-10"}, }, { doc: "invalid discovery.heartbeat", opts: map[string]string{"discovery.heartbeat": "invalid"}, }, { doc: "invalid discovery.ttl", opts: map[string]string{"discovery.ttl": "invalid"}, }, } for _, testcase := range testcases { _, _, err := discoveryOpts(testcase.opts) assert.Check(t, is.ErrorContains(err, ""), testcase.doc) } } func TestDiscoveryOpts(t *testing.T) { clusterOpts := map[string]string{"discovery.heartbeat": "10", "discovery.ttl": "20"} heartbeat, ttl, err := discoveryOpts(clusterOpts) assert.NilError(t, err) assert.Check(t, is.Equal(10*time.Second, heartbeat)) assert.Check(t, is.Equal(20*time.Second, ttl)) clusterOpts = map[string]string{"discovery.heartbeat": "10"} heartbeat, ttl, err = discoveryOpts(clusterOpts) assert.NilError(t, err) assert.Check(t, is.Equal(10*time.Second, heartbeat)) assert.Check(t, is.Equal(10*defaultDiscoveryTTLFactor*time.Second, ttl)) clusterOpts = map[string]string{"discovery.ttl": "30"} heartbeat, ttl, err = discoveryOpts(clusterOpts) assert.NilError(t, err) if ttl != 30*time.Second { t.Fatalf("TTL - Expected : %v, Actual : %v", 30*time.Second, ttl) } expected := 30 * time.Second / defaultDiscoveryTTLFactor if heartbeat != expected { t.Fatalf("Heartbeat - Expected : %v, Actual : %v", expected, heartbeat) } discoveryTTL := fmt.Sprintf("%d", defaultDiscoveryTTLFactor-1) clusterOpts = map[string]string{"discovery.ttl": discoveryTTL} heartbeat, _, err = discoveryOpts(clusterOpts) if err == nil && heartbeat == 0 { t.Fatal("discovery.heartbeat must be positive") } clusterOpts = map[string]string{} heartbeat, ttl, err = discoveryOpts(clusterOpts) if err != nil { t.Fatal(err) } if heartbeat != defaultDiscoveryHeartbeat { t.Fatalf("Heartbeat - Expected : %v, Actual : %v", defaultDiscoveryHeartbeat, heartbeat) } expected = defaultDiscoveryHeartbeat * defaultDiscoveryTTLFactor if ttl != expected { t.Fatalf("TTL - Expected : %v, Actual : %v", expected, ttl) } }