Notify listeners on applySnapshot
[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 import com.google.common.primitives.UnsignedLong;
19 import com.google.common.util.concurrent.FutureCallback;
20 import org.mockito.InOrder;
21 import org.mockito.invocation.InvocationOnMock;
22 import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeCandidate;
23
24 public final class ShardDataTreeMocking {
25
26     private ShardDataTreeMocking() {
27         throw new UnsupportedOperationException();
28     }
29
30     @SuppressWarnings("unchecked")
31     private static <T> FutureCallback<T> mockCallback() {
32         return mock(FutureCallback.class);
33     }
34
35     public static ShardDataTreeCohort immediateCanCommit(final ShardDataTreeCohort cohort) {
36         final FutureCallback<Void> callback = mockCallback();
37         doNothing().when(callback).onSuccess(null);
38         cohort.canCommit(callback);
39
40         verify(callback).onSuccess(null);
41         verifyNoMoreInteractions(callback);
42         return cohort;
43     }
44
45     public static ShardDataTreeCohort immediatePreCommit(final ShardDataTreeCohort cohort) {
46         final FutureCallback<DataTreeCandidate> callback = mockCallback();
47         doNothing().when(callback).onSuccess(any(DataTreeCandidate.class));
48         cohort.preCommit(callback);
49
50         verify(callback).onSuccess(any(DataTreeCandidate.class));
51         verifyNoMoreInteractions(callback);
52         return cohort;
53     }
54
55     public static ShardDataTreeCohort immediateCommit(final ShardDataTreeCohort cohort) {
56         final FutureCallback<UnsignedLong> callback = mockCallback();
57         doNothing().when(callback).onSuccess(any(UnsignedLong.class));
58         cohort.commit(callback);
59
60         verify(callback, timeout(5000)).onSuccess(any(UnsignedLong.class));
61         verifyNoMoreInteractions(callback);
62         return cohort;
63     }
64
65     @SuppressWarnings("unchecked")
66     private static <T> Object invokeSuccess(final InvocationOnMock invocation, final T value) {
67         invocation.getArgumentAt(0, FutureCallback.class).onSuccess(value);
68         return null;
69     }
70
71     private static Object invokeFailure(final InvocationOnMock invocation) {
72         invocation.getArgumentAt(0, FutureCallback.class).onFailure(mock(Exception.class));
73         return null;
74     }
75
76     @SuppressWarnings("unchecked")
77     public static ShardDataTreeCohort failedCanCommit(final ShardDataTreeCohort mock) {
78         doAnswer(invocation -> {
79             return invokeFailure(invocation);
80         }).when(mock).canCommit(any(FutureCallback.class));
81         return mock;
82     }
83
84     @SuppressWarnings("unchecked")
85     public static ShardDataTreeCohort failedPreCommit(final ShardDataTreeCohort mock) {
86         doAnswer(invocation -> {
87             return invokeFailure(invocation);
88         }).when(mock).preCommit(any(FutureCallback.class));
89         return mock;
90     }
91
92     @SuppressWarnings("unchecked")
93     public static ShardDataTreeCohort failedCommit(final ShardDataTreeCohort mock) {
94         doAnswer(invocation -> {
95             return invokeFailure(invocation);
96         }).when(mock).commit(any(FutureCallback.class));
97         return mock;
98     }
99
100     @SuppressWarnings("unchecked")
101     public static ShardDataTreeCohort successfulCanCommit(final ShardDataTreeCohort mock) {
102         doAnswer(invocation -> {
103             return invokeSuccess(invocation, null);
104         }).when(mock).canCommit(any(FutureCallback.class));
105
106         return mock;
107     }
108
109     public static ShardDataTreeCohort successfulPreCommit(final ShardDataTreeCohort mock) {
110         return successfulPreCommit(mock, mock(DataTreeCandidate.class));
111     }
112
113     @SuppressWarnings("unchecked")
114     public static ShardDataTreeCohort successfulPreCommit(final ShardDataTreeCohort mock, final DataTreeCandidate candidate) {
115         doAnswer(invocation -> {
116             return invokeSuccess(invocation, candidate);
117         }).when(mock).preCommit(any(FutureCallback.class));
118
119         return mock;
120     }
121
122     public static ShardDataTreeCohort successfulCommit(final ShardDataTreeCohort mock) {
123         return successfulCommit(mock, UnsignedLong.ZERO);
124     }
125
126     @SuppressWarnings("unchecked")
127     public static ShardDataTreeCohort successfulCommit(final ShardDataTreeCohort mock, final UnsignedLong index) {
128         doAnswer(invocation -> {
129             return invokeSuccess(invocation, index);
130         }).when(mock).commit(any(FutureCallback.class));
131
132         return mock;
133     }
134
135     @SuppressWarnings("unchecked")
136     public static void assertSequencedCommit(final ShardDataTreeCohort mock) {
137         final InOrder inOrder = inOrder(mock);
138         inOrder.verify(mock).canCommit(any(FutureCallback.class));
139         inOrder.verify(mock).preCommit(any(FutureCallback.class));
140         inOrder.verify(mock).commit(any(FutureCallback.class));
141     }
142 }