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.doNothing;
14 import static org.mockito.Mockito.doReturn;
15 import static org.mockito.Mockito.mock;
16 import static org.mockito.Mockito.never;
17 import static org.mockito.Mockito.verify;
18 import static org.mockito.Mockito.verifyNoMoreInteractions;
20 import com.google.common.primitives.UnsignedLong;
21 import com.google.common.util.concurrent.FutureCallback;
22 import com.google.common.util.concurrent.ListenableFuture;
23 import java.util.Collections;
24 import java.util.Optional;
25 import org.junit.Before;
26 import org.junit.Test;
27 import org.mockito.Mock;
28 import org.mockito.MockitoAnnotations;
29 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
30 import org.opendaylight.yangtools.yang.data.api.schema.tree.ConflictingModificationAppliedException;
31 import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeCandidate;
32 import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeCandidateTip;
33 import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeModification;
34 import org.opendaylight.yangtools.yang.data.api.schema.tree.DataValidationFailedException;
35 import scala.concurrent.Promise;
38 * Unit tests for SimpleShardDataTreeCohort.
40 * @author Thomas Pantelis
42 public class SimpleShardDataTreeCohortTest extends AbstractTest {
44 private ShardDataTree mockShardDataTree;
47 private DataTreeModification mockModification;
50 private CompositeDataTreeCohort mockUserCohorts;
53 private FutureCallback<DataTreeCandidate> mockPreCallback;
55 private SimpleShardDataTreeCohort cohort;
58 public void setup() throws Exception {
59 MockitoAnnotations.initMocks(this);
61 doNothing().when(mockUserCohorts).commit();
62 doReturn(Optional.empty()).when(mockUserCohorts).abort();
64 cohort = new SimpleShardDataTreeCohort(mockShardDataTree, mockModification, nextTransactionId(),
69 public void testCanCommitSuccess() throws Exception {
73 private void canCommitSuccess() {
74 doAnswer(invocation -> {
75 invocation.getArgumentAt(0, SimpleShardDataTreeCohort.class).successfulCanCommit();
77 }).when(mockShardDataTree).startCanCommit(cohort);
79 @SuppressWarnings("unchecked")
80 final FutureCallback<Void> callback = mock(FutureCallback.class);
81 cohort.canCommit(callback);
83 verify(callback).onSuccess(null);
84 verifyNoMoreInteractions(callback);
87 private void testValidatationPropagates(final Exception cause) throws DataValidationFailedException {
88 doAnswer(invocation -> {
89 invocation.getArgumentAt(0, SimpleShardDataTreeCohort.class).failedCanCommit(cause);
91 }).when(mockShardDataTree).startCanCommit(cohort);
93 @SuppressWarnings("unchecked")
94 final FutureCallback<Void> callback = mock(FutureCallback.class);
95 cohort.canCommit(callback);
97 verify(callback).onFailure(cause);
98 verifyNoMoreInteractions(callback);
102 public void testCanCommitWithConflictingModEx() throws DataValidationFailedException {
103 testValidatationPropagates(new ConflictingModificationAppliedException(YangInstanceIdentifier.EMPTY, "mock"));
107 public void testCanCommitWithDataValidationEx() throws DataValidationFailedException {
108 testValidatationPropagates(new DataValidationFailedException(YangInstanceIdentifier.EMPTY, "mock"));
112 public void testCanCommitWithIllegalArgumentEx() throws DataValidationFailedException {
113 testValidatationPropagates(new IllegalArgumentException("mock"));
116 private DataTreeCandidateTip preCommitSuccess() {
117 final DataTreeCandidateTip mockCandidate = mock(DataTreeCandidateTip.class);
118 doAnswer(invocation -> {
119 invocation.getArgumentAt(0, SimpleShardDataTreeCohort.class).successfulPreCommit(mockCandidate);
121 }).when(mockShardDataTree).startPreCommit(cohort);
123 @SuppressWarnings("unchecked")
124 final FutureCallback<DataTreeCandidate> callback = mock(FutureCallback.class);
125 cohort.preCommit(callback);
127 verify(callback).onSuccess(mockCandidate);
128 verifyNoMoreInteractions(callback);
130 assertSame("getCandidate", mockCandidate, cohort.getCandidate());
132 return mockCandidate;
136 public void testPreCommitAndCommitSuccess() throws Exception {
138 final DataTreeCandidateTip candidate = preCommitSuccess();
140 doAnswer(invocation -> {
141 invocation.getArgumentAt(0, SimpleShardDataTreeCohort.class).successfulCommit(UnsignedLong.valueOf(0));
143 }).when(mockShardDataTree).startCommit(cohort, candidate);
145 @SuppressWarnings("unchecked")
146 final FutureCallback<UnsignedLong> mockCommitCallback = mock(FutureCallback.class);
147 cohort.commit(mockCommitCallback);
149 verify(mockCommitCallback).onSuccess(any(UnsignedLong.class));
150 verifyNoMoreInteractions(mockCommitCallback);
152 verify(mockUserCohorts).commit();
156 public void testPreCommitWithIllegalArgumentEx() throws Exception {
159 final Exception cause = new IllegalArgumentException("mock");
160 doAnswer(invocation -> {
161 invocation.getArgumentAt(0, SimpleShardDataTreeCohort.class).failedPreCommit(cause);
163 }).when(mockShardDataTree).startPreCommit(cohort);
165 @SuppressWarnings("unchecked")
166 final FutureCallback<DataTreeCandidate> callback = mock(FutureCallback.class);
167 cohort.preCommit(callback);
169 verify(callback).onFailure(cause);
170 verifyNoMoreInteractions(callback);
172 verify(mockUserCohorts).abort();
176 public void testPreCommitWithReportedFailure() throws Exception {
179 final Exception cause = new IllegalArgumentException("mock");
180 cohort.reportFailure(cause);
182 @SuppressWarnings("unchecked")
183 final FutureCallback<DataTreeCandidate> callback = mock(FutureCallback.class);
184 cohort.preCommit(callback);
186 verify(callback).onFailure(cause);
187 verifyNoMoreInteractions(callback);
189 verify(mockShardDataTree, never()).startPreCommit(cohort);
193 public void testCommitWithIllegalArgumentEx() {
195 final DataTreeCandidateTip candidate = preCommitSuccess();
197 final Exception cause = new IllegalArgumentException("mock");
198 doAnswer(invocation -> {
199 invocation.getArgumentAt(0, SimpleShardDataTreeCohort.class).failedCommit(cause);
201 }).when(mockShardDataTree).startCommit(cohort, candidate);
203 @SuppressWarnings("unchecked")
204 final FutureCallback<UnsignedLong> callback = mock(FutureCallback.class);
205 cohort.commit(callback);
207 verify(callback).onFailure(cause);
208 verifyNoMoreInteractions(callback);
210 verify(mockUserCohorts).abort();
214 public void testAbort() throws Exception {
215 doNothing().when(mockShardDataTree).startAbort(cohort);
217 cohort.abort().get();
219 verify(mockShardDataTree).startAbort(cohort);
223 public void testAbortWithCohorts() throws Exception {
224 doNothing().when(mockShardDataTree).startAbort(cohort);
226 final Promise<Iterable<Object>> cohortFuture = akka.dispatch.Futures.promise();
227 doReturn(Optional.of(cohortFuture.future())).when(mockUserCohorts).abort();
229 final ListenableFuture<Void> abortFuture = cohort.abort();
231 cohortFuture.success(Collections.emptyList());
234 verify(mockShardDataTree).startAbort(cohort);