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