1e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson/*
2e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson * Copyright (c) 2007 Mockito contributors
3e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson * This program is made available under the terms of the MIT License.
4e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson */
5e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonpackage org.mockito.internal.verification;
6e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
7e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonimport org.mockito.exceptions.base.MockitoAssertionError;
8e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonimport org.mockito.internal.verification.api.VerificationData;
9e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonimport org.mockito.verification.VerificationMode;
10e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
11e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonpublic class VerificationWithTimeoutImpl {
12e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
13e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    VerificationMode delegate;
14e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    int timeout;
15e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    int treshhold;
16e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
17e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    public VerificationWithTimeoutImpl(int treshhold, int millis, VerificationMode delegate) {
18e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        this.treshhold = treshhold;
19e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        this.timeout = millis;
20e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        this.delegate = delegate;
21e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    }
22e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
23e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    public void verify(VerificationData data) {
24e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        int soFar = 0;
25e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        MockitoAssertionError error = null;
26e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        while (soFar <= timeout) {
27e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson            try {
28e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                delegate.verify(data);
29e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                return;
30e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson            } catch (MockitoAssertionError e) {
31e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                error = e;
32e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                soFar += treshhold;
33e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                sleep(treshhold);
34e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson            }
35e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        }
36e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        if (error != null) {
37e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson            throw error;
38e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        }
39e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    }
40e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
41e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    void sleep(int sleep) {
42e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        try {
43e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson            Thread.sleep(sleep);
44e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        } catch (InterruptedException ie) {
45e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson            // oups. not much luck.
46e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        }
47e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    }
48e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
49e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    public VerificationMode getDelegate() {
50e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        return delegate;
51e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    }
52e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
53e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    public int getTimeout() {
54e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        return timeout;
55e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    }
56e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
57e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    public int getTreshhold() {
58e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        return treshhold;
59e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    }
60e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson}