BUG-7033: Implement pipe-lining in ShardDataTree
[controller.git] / opendaylight / md-sal / sal-distributed-datastore / src / test / java / org / opendaylight / controller / cluster / datastore / ShardDataTreeMocking.java
1 /*
2  * Copyright (c) 2016 Cisco Systems, Inc. and others.  All rights reserved.
3  *
4  * This program and the accompanying materials are made available under the
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6  * and is available at http://www.eclipse.org/legal/epl-v10.html
7  */
8 package org.opendaylight.controller.cluster.datastore;
9
10 import static org.mockito.Matchers.any;
11 import static org.mockito.Mockito.doAnswer;
12 import static org.mockito.Mockito.doNothing;
13 import static org.mockito.Mockito.inOrder;
14 import static org.mockito.Mockito.mock;
15 import static org.mockito.Mockito.timeout;
16 import static org.mockito.Mockito.verify;
17 import static org.mockito.Mockito.verifyNoMoreInteractions;
18
19 import com.google.common.primitives.UnsignedLong;
20 import com.google.common.util.concurrent.FutureCallback;
21 import org.mockito.InOrder;
22 import org.mockito.invocation.InvocationOnMock;
23 import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeCandidate;
24
25 public final class ShardDataTreeMocking {
26
27     private ShardDataTreeMocking() {
28         throw new UnsupportedOperationException();
29     }
30
31     @SuppressWarnings("unchecked")
32     private static <T> FutureCallback<T> mockCallback() {
33         return mock(FutureCallback.class);
34     }
35
36     public static ShardDataTreeCohort immediateCanCommit(final ShardDataTreeCohort cohort) {
37         final FutureCallback<Void> callback = mockCallback();
38         doNothing().when(callback).onSuccess(null);
39         cohort.canCommit(callback);
40
41         verify(callback).onSuccess(null);
42         verifyNoMoreInteractions(callback);
43         return cohort;
44     }
45
46     public static FutureCallback<Void> coordinatedCanCommit(final ShardDataTreeCohort cohort) {
47         final FutureCallback<Void> callback = mockCallback();
48         doNothing().when(callback).onSuccess(null);
49         doNothing().when(callback).onFailure(any(Throwable.class));
50         cohort.canCommit(callback);
51         return callback;
52     }
53
54     public static ShardDataTreeCohort immediatePreCommit(final ShardDataTreeCohort cohort) {
55         final FutureCallback<DataTreeCandidate> callback = mockCallback();
56         doNothing().when(callback).onSuccess(any(DataTreeCandidate.class));
57         cohort.preCommit(callback);
58
59         verify(callback).onSuccess(any(DataTreeCandidate.class));
60         verifyNoMoreInteractions(callback);
61         return cohort;
62     }
63
64     public static FutureCallback<DataTreeCandidate> coordinatedPreCommit(final ShardDataTreeCohort cohort) {
65         final FutureCallback<DataTreeCandidate> callback = mockCallback();
66         doNothing().when(callback).onSuccess(any(DataTreeCandidate.class));
67         doNothing().when(callback).onFailure(any(Throwable.class));
68         cohort.preCommit(callback);
69         return callback;
70     }
71
72     public static ShardDataTreeCohort immediateCommit(final ShardDataTreeCohort cohort) {
73         final FutureCallback<UnsignedLong> callback = mockCallback();
74         doNothing().when(callback).onSuccess(any(UnsignedLong.class));
75         cohort.commit(callback);
76
77         verify(callback, timeout(5000)).onSuccess(any(UnsignedLong.class));
78         verifyNoMoreInteractions(callback);
79         return cohort;
80     }
81
82     public static FutureCallback<UnsignedLong> coordinatedCommit(final ShardDataTreeCohort cohort) {
83         final FutureCallback<UnsignedLong> callback = mockCallback();
84         doNothing().when(callback).onSuccess(any(UnsignedLong.class));
85         doNothing().when(callback).onFailure(any(Throwable.class));
86         cohort.commit(callback);
87         return callback;
88     }
89
90     @SuppressWarnings("unchecked")
91     private static <T> Object invokeSuccess(final InvocationOnMock invocation, final T value) {
92         invocation.getArgumentAt(0, FutureCallback.class).onSuccess(value);
93         return null;
94     }
95
96     private static Object invokeFailure(final InvocationOnMock invocation) {
97         invocation.getArgumentAt(0, FutureCallback.class).onFailure(mock(Exception.class));
98         return null;
99     }
100
101     @SuppressWarnings("unchecked")
102     public static ShardDataTreeCohort failedCanCommit(final ShardDataTreeCohort mock) {
103         doAnswer(invocation -> {
104             return invokeFailure(invocation);
105         }).when(mock).canCommit(any(FutureCallback.class));
106         return mock;
107     }
108
109     @SuppressWarnings("unchecked")
110     public static ShardDataTreeCohort failedPreCommit(final ShardDataTreeCohort mock) {
111         doAnswer(invocation -> {
112             return invokeFailure(invocation);
113         }).when(mock).preCommit(any(FutureCallback.class));
114         return mock;
115     }
116
117     @SuppressWarnings("unchecked")
118     public static ShardDataTreeCohort failedCommit(final ShardDataTreeCohort mock) {
119         doAnswer(invocation -> {
120             return invokeFailure(invocation);
121         }).when(mock).commit(any(FutureCallback.class));
122         return mock;
123     }
124
125     @SuppressWarnings("unchecked")
126     public static ShardDataTreeCohort successfulCanCommit(final ShardDataTreeCohort mock) {
127         doAnswer(invocation -> {
128             return invokeSuccess(invocation, null);
129         }).when(mock).canCommit(any(FutureCallback.class));
130
131         return mock;
132     }
133
134     public static ShardDataTreeCohort successfulPreCommit(final ShardDataTreeCohort mock) {
135         return successfulPreCommit(mock, mock(DataTreeCandidate.class));
136     }
137
138     @SuppressWarnings("unchecked")
139     public static ShardDataTreeCohort successfulPreCommit(final ShardDataTreeCohort mock,
140             final DataTreeCandidate candidate) {
141         doAnswer(invocation -> {
142             return invokeSuccess(invocation, candidate);
143         }).when(mock).preCommit(any(FutureCallback.class));
144
145         return mock;
146     }
147
148     public static ShardDataTreeCohort successfulCommit(final ShardDataTreeCohort mock) {
149         return successfulCommit(mock, UnsignedLong.ZERO);
150     }
151
152     @SuppressWarnings("unchecked")
153     public static ShardDataTreeCohort successfulCommit(final ShardDataTreeCohort mock, final UnsignedLong index) {
154         doAnswer(invocation -> {
155             return invokeSuccess(invocation, index);
156         }).when(mock).commit(any(FutureCallback.class));
157
158         return mock;
159     }
160
161     @SuppressWarnings("unchecked")
162     public static void assertSequencedCommit(final ShardDataTreeCohort mock) {
163         final InOrder inOrder = inOrder(mock);
164         inOrder.verify(mock).canCommit(any(FutureCallback.class));
165         inOrder.verify(mock).preCommit(any(FutureCallback.class));
166         inOrder.verify(mock).commit(any(FutureCallback.class));
167     }
168 }