2 * Copyright (c) 2015 Brocade Communications Systems, Inc. and others. All rights reserved.
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
8 package org.opendaylight.controller.cluster.datastore;
10 import static org.junit.Assert.assertSame;
11 import static org.mockito.Matchers.any;
12 import static org.mockito.Mockito.doAnswer;
13 import static org.mockito.Mockito.doReturn;
14 import static org.mockito.Mockito.mock;
15 import static org.mockito.Mockito.never;
16 import static org.mockito.Mockito.verify;
17 import static org.mockito.Mockito.verifyNoMoreInteractions;
19 import com.google.common.primitives.UnsignedLong;
20 import com.google.common.util.concurrent.FutureCallback;
21 import java.util.Optional;
22 import java.util.concurrent.CompletableFuture;
23 import java.util.concurrent.Future;
24 import org.junit.Before;
25 import org.junit.Test;
26 import org.mockito.Mock;
27 import org.mockito.MockitoAnnotations;
28 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
29 import org.opendaylight.yangtools.yang.data.api.schema.tree.ConflictingModificationAppliedException;
30 import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeCandidate;
31 import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeCandidateTip;
32 import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeModification;
33 import org.opendaylight.yangtools.yang.data.api.schema.tree.DataValidationFailedException;
36 * Unit tests for SimpleShardDataTreeCohort.
38 * @author Thomas Pantelis
40 public class SimpleShardDataTreeCohortTest extends AbstractTest {
42 private ShardDataTree mockShardDataTree;
45 private DataTreeModification mockModification;
48 private CompositeDataTreeCohort mockUserCohorts;
51 private FutureCallback<DataTreeCandidate> mockPreCallback;
53 private SimpleShardDataTreeCohort cohort;
56 public void setup() throws Exception {
57 MockitoAnnotations.initMocks(this);
59 doReturn(Optional.empty()).when(mockUserCohorts).commit();
60 doReturn(Optional.empty()).when(mockUserCohorts).abort();
62 cohort = new SimpleShardDataTreeCohort(mockShardDataTree, mockModification, nextTransactionId(),
63 mockUserCohorts, Optional.empty());
67 public void testCanCommitSuccess() throws Exception {
71 private void canCommitSuccess() {
72 doAnswer(invocation -> {
73 invocation.getArgumentAt(0, SimpleShardDataTreeCohort.class).successfulCanCommit();
75 }).when(mockShardDataTree).startCanCommit(cohort);
77 @SuppressWarnings("unchecked")
78 final FutureCallback<Void> callback = mock(FutureCallback.class);
79 cohort.canCommit(callback);
81 verify(callback).onSuccess(null);
82 verifyNoMoreInteractions(callback);
85 private void testValidatationPropagates(final Exception cause) throws DataValidationFailedException {
86 doAnswer(invocation -> {
87 invocation.getArgumentAt(0, SimpleShardDataTreeCohort.class).failedCanCommit(cause);
89 }).when(mockShardDataTree).startCanCommit(cohort);
91 @SuppressWarnings("unchecked")
92 final FutureCallback<Void> callback = mock(FutureCallback.class);
93 cohort.canCommit(callback);
95 verify(callback).onFailure(cause);
96 verifyNoMoreInteractions(callback);
100 public void testCanCommitWithConflictingModEx() throws DataValidationFailedException {
101 testValidatationPropagates(new ConflictingModificationAppliedException(YangInstanceIdentifier.EMPTY, "mock"));
105 public void testCanCommitWithDataValidationEx() throws DataValidationFailedException {
106 testValidatationPropagates(new DataValidationFailedException(YangInstanceIdentifier.EMPTY, "mock"));
110 public void testCanCommitWithIllegalArgumentEx() throws DataValidationFailedException {
111 testValidatationPropagates(new IllegalArgumentException("mock"));
114 private DataTreeCandidateTip preCommitSuccess() {
115 final DataTreeCandidateTip mockCandidate = mock(DataTreeCandidateTip.class);
116 doAnswer(invocation -> {
117 invocation.getArgumentAt(0, SimpleShardDataTreeCohort.class).successfulPreCommit(mockCandidate);
119 }).when(mockShardDataTree).startPreCommit(cohort);
121 @SuppressWarnings("unchecked")
122 final FutureCallback<DataTreeCandidate> callback = mock(FutureCallback.class);
123 cohort.preCommit(callback);
125 verify(callback).onSuccess(mockCandidate);
126 verifyNoMoreInteractions(callback);
128 assertSame("getCandidate", mockCandidate, cohort.getCandidate());
130 return mockCandidate;
134 public void testPreCommitAndCommitSuccess() throws Exception {
136 final DataTreeCandidateTip candidate = preCommitSuccess();
138 doAnswer(invocation -> {
139 invocation.getArgumentAt(0, SimpleShardDataTreeCohort.class).successfulCommit(UnsignedLong.valueOf(0),
142 }).when(mockShardDataTree).startCommit(cohort, candidate);
144 @SuppressWarnings("unchecked")
145 final FutureCallback<UnsignedLong> mockCommitCallback = mock(FutureCallback.class);
146 cohort.commit(mockCommitCallback);
148 verify(mockCommitCallback).onSuccess(any(UnsignedLong.class));
149 verifyNoMoreInteractions(mockCommitCallback);
151 verify(mockUserCohorts).commit();
155 public void testPreCommitWithIllegalArgumentEx() throws Exception {
158 final Exception cause = new IllegalArgumentException("mock");
159 doAnswer(invocation -> {
160 invocation.getArgumentAt(0, SimpleShardDataTreeCohort.class).failedPreCommit(cause);
162 }).when(mockShardDataTree).startPreCommit(cohort);
164 @SuppressWarnings("unchecked")
165 final FutureCallback<DataTreeCandidate> callback = mock(FutureCallback.class);
166 cohort.preCommit(callback);
168 verify(callback).onFailure(cause);
169 verifyNoMoreInteractions(callback);
171 verify(mockUserCohorts).abort();
175 public void testPreCommitWithReportedFailure() throws Exception {
178 final Exception cause = new IllegalArgumentException("mock");
179 cohort.reportFailure(cause);
181 @SuppressWarnings("unchecked")
182 final FutureCallback<DataTreeCandidate> callback = mock(FutureCallback.class);
183 cohort.preCommit(callback);
185 verify(callback).onFailure(cause);
186 verifyNoMoreInteractions(callback);
188 verify(mockShardDataTree, never()).startPreCommit(cohort);
192 public void testCommitWithIllegalArgumentEx() {
194 final DataTreeCandidateTip candidate = preCommitSuccess();
196 final Exception cause = new IllegalArgumentException("mock");
197 doAnswer(invocation -> {
198 invocation.getArgumentAt(0, SimpleShardDataTreeCohort.class).failedCommit(cause);
200 }).when(mockShardDataTree).startCommit(cohort, candidate);
202 @SuppressWarnings("unchecked")
203 final FutureCallback<UnsignedLong> callback = mock(FutureCallback.class);
204 cohort.commit(callback);
206 verify(callback).onFailure(cause);
207 verifyNoMoreInteractions(callback);
209 verify(mockUserCohorts).abort();
212 private static Future<?> abort(final ShardDataTreeCohort cohort) {
213 final CompletableFuture<Void> f = new CompletableFuture<>();
214 cohort.abort(new FutureCallback<Void>() {
216 public void onSuccess(final Void result) {
221 public void onFailure(final Throwable failure) {
222 f.completeExceptionally(failure);
230 public void testAbort() throws Exception {
231 doReturn(Boolean.TRUE).when(mockShardDataTree).startAbort(cohort);
234 verify(mockShardDataTree).startAbort(cohort);
238 public void testAbortWithCohorts() throws Exception {
239 doReturn(true).when(mockShardDataTree).startAbort(cohort);
241 doReturn(Optional.of(CompletableFuture.completedFuture(null))).when(mockUserCohorts).abort();
243 final Future<?> abortFuture = abort(cohort);
246 verify(mockShardDataTree).startAbort(cohort);