/*
 *
 * Copyright 2018 gRPC authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 */

package health

import (
	"context"
	"errors"
	"reflect"
	"testing"
	"time"

	"google.golang.org/grpc/connectivity"
)

func (s) TestClientHealthCheckBackoff(t *testing.T) {
	const maxRetries = 5

	var want []time.Duration
	for i := 0; i < maxRetries; i++ {
		want = append(want, time.Duration(i+1)*time.Second)
	}

	var got []time.Duration
	newStream := func(string) (interface{}, error) {
		if len(got) < maxRetries {
			return nil, errors.New("backoff")
		}
		return nil, nil
	}

	oldBackoffFunc := backoffFunc
	backoffFunc = func(ctx context.Context, retries int) bool {
		got = append(got, time.Duration(retries+1)*time.Second)
		return true
	}
	defer func() { backoffFunc = oldBackoffFunc }()

	clientHealthCheck(context.Background(), newStream, func(connectivity.State, error) {}, "test")

	if !reflect.DeepEqual(got, want) {
		t.Fatalf("Backoff durations for %v retries are %v. (expected: %v)", maxRetries, got, want)
	}
}
