Improve segmented journal actor metrics
[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.ArgumentMatchers.any;
11 import static org.mockito.ArgumentMatchers.anyBoolean;
12 import static org.mockito.Mockito.doAnswer;
13 import static org.mockito.Mockito.doNothing;
14 import static org.mockito.Mockito.inOrder;
15 import static org.mockito.Mockito.mock;
16 import static org.mockito.Mockito.timeout;
17 import static org.mockito.Mockito.verify;
18 import static org.mockito.Mockito.verifyNoMoreInteractions;
19
20 import com.google.common.primitives.UnsignedLong;
21 import com.google.common.util.concurrent.FutureCallback;
22 import org.mockito.InOrder;
23 import org.mockito.invocation.InvocationOnMock;
24 import org.opendaylight.controller.cluster.access.concepts.TransactionIdentifier;
25 import org.opendaylight.controller.cluster.datastore.persisted.CommitTransactionPayload;
26 import org.opendaylight.yangtools.yang.common.Empty;
27 import org.opendaylight.yangtools.yang.data.tree.api.DataTreeCandidate;
28
29 public final class ShardDataTreeMocking {
30
31     private ShardDataTreeMocking() {
32         throw new UnsupportedOperationException();
33     }
34
35     @SuppressWarnings("unchecked")
36     private static <T> FutureCallback<T> mockCallback() {
37         return mock(FutureCallback.class);
38     }
39
40     public static ShardDataTreeCohort immediateCanCommit(final ShardDataTreeCohort cohort) {
41         final FutureCallback<Empty> callback = mockCallback();
42         doNothing().when(callback).onSuccess(Empty.value());
43         cohort.canCommit(callback);
44
45         verify(callback).onSuccess(Empty.value());
46         verifyNoMoreInteractions(callback);
47         return cohort;
48     }
49
50     public static FutureCallback<Empty> coordinatedCanCommit(final ShardDataTreeCohort cohort) {
51         final FutureCallback<Empty> callback = mockCallback();
52         doNothing().when(callback).onSuccess(Empty.value());
53         doNothing().when(callback).onFailure(any(Throwable.class));
54         cohort.canCommit(callback);
55         return callback;
56     }
57
58     public static ShardDataTreeCohort immediatePreCommit(final ShardDataTreeCohort cohort) {
59         final FutureCallback<DataTreeCandidate> callback = mockCallback();
60         doNothing().when(callback).onSuccess(any(DataTreeCandidate.class));
61         cohort.preCommit(callback);
62
63         verify(callback).onSuccess(any(DataTreeCandidate.class));
64         verifyNoMoreInteractions(callback);
65         return cohort;
66     }
67
68     public static FutureCallback<DataTreeCandidate> coordinatedPreCommit(final ShardDataTreeCohort cohort) {
69         final FutureCallback<DataTreeCandidate> callback = mockCallback();
70         doNothing().when(callback).onSuccess(any(DataTreeCandidate.class));
71         doNothing().when(callback).onFailure(any(Throwable.class));
72         cohort.preCommit(callback);
73         return callback;
74     }
75
76     public static ShardDataTreeCohort immediateCommit(final ShardDataTreeCohort cohort) {
77         final FutureCallback<UnsignedLong> callback = mockCallback();
78         doNothing().when(callback).onSuccess(any(UnsignedLong.class));
79         cohort.commit(callback);
80
81         verify(callback, timeout(5000)).onSuccess(any(UnsignedLong.class));
82         verifyNoMoreInteractions(callback);
83         return cohort;
84     }
85
86     public static FutureCallback<UnsignedLong> coordinatedCommit(final ShardDataTreeCohort cohort) {
87         final FutureCallback<UnsignedLong> callback = mockCallback();
88         doNothing().when(callback).onSuccess(any(UnsignedLong.class));
89         doNothing().when(callback).onFailure(any(Throwable.class));
90         cohort.commit(callback);
91         return callback;
92     }
93
94     public static FutureCallback<UnsignedLong> immediate3PhaseCommit(final ShardDataTreeCohort cohort) {
95         final FutureCallback<UnsignedLong> commitCallback = mockCallback();
96         doNothing().when(commitCallback).onSuccess(any(UnsignedLong.class));
97         doNothing().when(commitCallback).onFailure(any(Throwable.class));
98
99         final FutureCallback<DataTreeCandidate> preCommitCallback = mockCallback();
100         doAnswer(invocation -> {
101             cohort.commit(commitCallback);
102             return null;
103         }).when(preCommitCallback).onSuccess(any(DataTreeCandidate.class));
104         doNothing().when(preCommitCallback).onFailure(any(Throwable.class));
105
106         final FutureCallback<Empty> canCommit = mockCallback();
107         doAnswer(invocation -> {
108             cohort.preCommit(preCommitCallback);
109             return null;
110         }).when(canCommit).onSuccess(Empty.value());
111         doNothing().when(canCommit).onFailure(any(Throwable.class));
112
113         cohort.canCommit(canCommit);
114         return commitCallback;
115     }
116
117     private static <T> Object invokeSuccess(final InvocationOnMock invocation, final T value) {
118         invocation.<FutureCallback<T>>getArgument(0).onSuccess(value);
119         return null;
120     }
121
122     private static Object invokeFailure(final InvocationOnMock invocation) {
123         invocation.<FutureCallback<?>>getArgument(0).onFailure(mock(Exception.class));
124         return null;
125     }
126
127     @SuppressWarnings("unchecked")
128     public static ShardDataTreeCohort failedCanCommit(final ShardDataTreeCohort mock) {
129         doAnswer(ShardDataTreeMocking::invokeFailure).when(mock).canCommit(any(FutureCallback.class));
130         return mock;
131     }
132
133     @SuppressWarnings("unchecked")
134     public static ShardDataTreeCohort failedPreCommit(final ShardDataTreeCohort mock) {
135         doAnswer(ShardDataTreeMocking::invokeFailure).when(mock).preCommit(any(FutureCallback.class));
136         return mock;
137     }
138
139     @SuppressWarnings("unchecked")
140     public static ShardDataTreeCohort failedCommit(final ShardDataTreeCohort mock) {
141         doAnswer(ShardDataTreeMocking::invokeFailure).when(mock).commit(any(FutureCallback.class));
142         return mock;
143     }
144
145     @SuppressWarnings("unchecked")
146     public static ShardDataTreeCohort successfulCanCommit(final ShardDataTreeCohort mock) {
147         doAnswer(invocation -> invokeSuccess(invocation, null)).when(mock).canCommit(any(FutureCallback.class));
148
149         return mock;
150     }
151
152     public static ShardDataTreeCohort successfulPreCommit(final ShardDataTreeCohort mock) {
153         return successfulPreCommit(mock, mock(DataTreeCandidate.class));
154     }
155
156     @SuppressWarnings("unchecked")
157     public static ShardDataTreeCohort successfulPreCommit(final ShardDataTreeCohort mock,
158             final DataTreeCandidate candidate) {
159         doAnswer(invocation -> invokeSuccess(invocation, candidate)).when(mock).preCommit(any(FutureCallback.class));
160
161         return mock;
162     }
163
164     public static ShardDataTreeCohort successfulCommit(final ShardDataTreeCohort mock) {
165         return successfulCommit(mock, UnsignedLong.ZERO);
166     }
167
168     @SuppressWarnings("unchecked")
169     public static ShardDataTreeCohort successfulCommit(final ShardDataTreeCohort mock, final UnsignedLong index) {
170         doAnswer(invocation -> invokeSuccess(invocation, index)).when(mock).commit(any(FutureCallback.class));
171
172         return mock;
173     }
174
175     @SuppressWarnings("unchecked")
176     public static void assertSequencedCommit(final ShardDataTreeCohort mock) {
177         final InOrder inOrder = inOrder(mock);
178         inOrder.verify(mock).canCommit(any(FutureCallback.class));
179         inOrder.verify(mock).preCommit(any(FutureCallback.class));
180         inOrder.verify(mock).commit(any(FutureCallback.class));
181     }
182
183     public static void immediatePayloadReplication(final ShardDataTree shardDataTree, final Shard mockShard) {
184         doAnswer(invocation -> {
185             shardDataTree.applyReplicatedPayload(invocation.getArgument(0), invocation.getArgument(1));
186             return null;
187         }).when(mockShard).persistPayload(any(TransactionIdentifier.class), any(CommitTransactionPayload.class),
188                 anyBoolean());
189     }
190 }