backoff: set default values on BackoffConfig

Because most of the fields on `BackoffConfig` are unexported, correctly
using the config requires copying from the default. This sets the
defaults appropriately and falls back to a default if MaxDelay is
negative or zero.

Tests are added to ensure that the backoff is set correctly in common
use cases.

Signedroff-by: Stephen J Day <stephen.day@docker.com>
Signed-off-by: Stephen J Day <stephen.day@docker.com>
This commit is contained in:
Stephen J Day
2016-04-14 18:40:32 -07:00
parent 9ac074585f
commit 9ff38e9093
4 changed files with 71 additions and 0 deletions

View File

@ -80,3 +80,42 @@ func TestCredentialsMisuse(t *testing.T) {
t.Fatalf("Dial(_, _) = _, %v, want _, %v", err, ErrCredentialsMisuse)
}
}
func TestWithBackoffConfigDefault(t *testing.T) {
testBackoffConfigSet(t, DefaultBackoffConfig)
}
func TestWithBackoffConfig(t *testing.T) {
b := BackoffConfig{MaxDelay: DefaultBackoffConfig.MaxDelay / 2}
expected := b
expected.setDefaults() // defaults should be set
testBackoffConfigSet(t, &expected, WithBackoffConfig(&b))
}
func TestWithBackoffMaxDelay(t *testing.T) {
md := DefaultBackoffConfig.MaxDelay / 2
expected := BackoffConfig{MaxDelay: md}
expected.setDefaults()
testBackoffConfigSet(t, &expected, WithBackoffMaxDelay(md))
}
func testBackoffConfigSet(t *testing.T, expected *BackoffConfig, opts ...DialOption) {
opts = append(opts, WithInsecure())
conn, err := Dial("foo:80", opts...)
if err != nil {
t.Fatalf("unexpected error dialing connection: %v", err)
}
if conn.dopts.bs == nil {
t.Fatalf("backoff config not set")
}
actual, ok := conn.dopts.bs.(*BackoffConfig)
if !ok {
t.Fatalf("unexpected type of backoff config: %v", conn.dopts.bs)
}
if *actual != *expected {
t.Fatalf("unexpected backoff config on connection: %v, want %v", actual, expected)
}
}