// Code generated by counterfeiter. DO NOT EDIT.
package monitfakes

import (
	"net/http"
	"sync"

	"github.com/cloudfoundry/bosh-agent/v2/jobsupervisor/monit"
)

type FakeRequestRetryable struct {
	AttemptStub        func() (bool, error)
	attemptMutex       sync.RWMutex
	attemptArgsForCall []struct {
	}
	attemptReturns struct {
		result1 bool
		result2 error
	}
	attemptReturnsOnCall map[int]struct {
		result1 bool
		result2 error
	}
	ResponseStub        func() *http.Response
	responseMutex       sync.RWMutex
	responseArgsForCall []struct {
	}
	responseReturns struct {
		result1 *http.Response
	}
	responseReturnsOnCall map[int]struct {
		result1 *http.Response
	}
	invocations      map[string][][]interface{}
	invocationsMutex sync.RWMutex
}

func (fake *FakeRequestRetryable) Attempt() (bool, error) {
	fake.attemptMutex.Lock()
	ret, specificReturn := fake.attemptReturnsOnCall[len(fake.attemptArgsForCall)]
	fake.attemptArgsForCall = append(fake.attemptArgsForCall, struct {
	}{})
	stub := fake.AttemptStub
	fakeReturns := fake.attemptReturns
	fake.recordInvocation("Attempt", []interface{}{})
	fake.attemptMutex.Unlock()
	if stub != nil {
		return stub()
	}
	if specificReturn {
		return ret.result1, ret.result2
	}
	return fakeReturns.result1, fakeReturns.result2
}

func (fake *FakeRequestRetryable) AttemptCallCount() int {
	fake.attemptMutex.RLock()
	defer fake.attemptMutex.RUnlock()
	return len(fake.attemptArgsForCall)
}

func (fake *FakeRequestRetryable) AttemptCalls(stub func() (bool, error)) {
	fake.attemptMutex.Lock()
	defer fake.attemptMutex.Unlock()
	fake.AttemptStub = stub
}

func (fake *FakeRequestRetryable) AttemptReturns(result1 bool, result2 error) {
	fake.attemptMutex.Lock()
	defer fake.attemptMutex.Unlock()
	fake.AttemptStub = nil
	fake.attemptReturns = struct {
		result1 bool
		result2 error
	}{result1, result2}
}

func (fake *FakeRequestRetryable) AttemptReturnsOnCall(i int, result1 bool, result2 error) {
	fake.attemptMutex.Lock()
	defer fake.attemptMutex.Unlock()
	fake.AttemptStub = nil
	if fake.attemptReturnsOnCall == nil {
		fake.attemptReturnsOnCall = make(map[int]struct {
			result1 bool
			result2 error
		})
	}
	fake.attemptReturnsOnCall[i] = struct {
		result1 bool
		result2 error
	}{result1, result2}
}

func (fake *FakeRequestRetryable) Response() *http.Response {
	fake.responseMutex.Lock()
	ret, specificReturn := fake.responseReturnsOnCall[len(fake.responseArgsForCall)]
	fake.responseArgsForCall = append(fake.responseArgsForCall, struct {
	}{})
	stub := fake.ResponseStub
	fakeReturns := fake.responseReturns
	fake.recordInvocation("Response", []interface{}{})
	fake.responseMutex.Unlock()
	if stub != nil {
		return stub()
	}
	if specificReturn {
		return ret.result1
	}
	return fakeReturns.result1
}

func (fake *FakeRequestRetryable) ResponseCallCount() int {
	fake.responseMutex.RLock()
	defer fake.responseMutex.RUnlock()
	return len(fake.responseArgsForCall)
}

func (fake *FakeRequestRetryable) ResponseCalls(stub func() *http.Response) {
	fake.responseMutex.Lock()
	defer fake.responseMutex.Unlock()
	fake.ResponseStub = stub
}

func (fake *FakeRequestRetryable) ResponseReturns(result1 *http.Response) {
	fake.responseMutex.Lock()
	defer fake.responseMutex.Unlock()
	fake.ResponseStub = nil
	fake.responseReturns = struct {
		result1 *http.Response
	}{result1}
}

func (fake *FakeRequestRetryable) ResponseReturnsOnCall(i int, result1 *http.Response) {
	fake.responseMutex.Lock()
	defer fake.responseMutex.Unlock()
	fake.ResponseStub = nil
	if fake.responseReturnsOnCall == nil {
		fake.responseReturnsOnCall = make(map[int]struct {
			result1 *http.Response
		})
	}
	fake.responseReturnsOnCall[i] = struct {
		result1 *http.Response
	}{result1}
}

func (fake *FakeRequestRetryable) Invocations() map[string][][]interface{} {
	fake.invocationsMutex.RLock()
	defer fake.invocationsMutex.RUnlock()
	fake.attemptMutex.RLock()
	defer fake.attemptMutex.RUnlock()
	fake.responseMutex.RLock()
	defer fake.responseMutex.RUnlock()
	copiedInvocations := map[string][][]interface{}{}
	for key, value := range fake.invocations {
		copiedInvocations[key] = value
	}
	return copiedInvocations
}

func (fake *FakeRequestRetryable) recordInvocation(key string, args []interface{}) {
	fake.invocationsMutex.Lock()
	defer fake.invocationsMutex.Unlock()
	if fake.invocations == nil {
		fake.invocations = map[string][][]interface{}{}
	}
	if fake.invocations[key] == nil {
		fake.invocations[key] = [][]interface{}{}
	}
	fake.invocations[key] = append(fake.invocations[key], args)
}

var _ monit.RequestRetryable = new(FakeRequestRetryable)
