+ @Test
+ public void testPreCommitWithIllegalArgumentEx() {
+ canCommitSuccess();
+
+ final Exception cause = new IllegalArgumentException("mock");
+ doAnswer(invocation -> {
+ invocation.<SimpleShardDataTreeCohort>getArgument(0).failedPreCommit(cause);
+ return null;
+ }).when(mockShardDataTree).startPreCommit(cohort);
+
+ @SuppressWarnings("unchecked")
+ final FutureCallback<DataTreeCandidate> callback = mock(FutureCallback.class);
+ cohort.preCommit(callback);
+
+ verify(callback).onFailure(cause);
+ verifyNoMoreInteractions(callback);
+
+ verify(mockUserCohorts).abort();
+ }
+
+ @Test
+ public void testPreCommitWithReportedFailure() {
+ canCommitSuccess();
+
+ final Exception cause = new IllegalArgumentException("mock");
+ cohort.reportFailure(cause);
+
+ @SuppressWarnings("unchecked")
+ final FutureCallback<DataTreeCandidate> callback = mock(FutureCallback.class);
+ cohort.preCommit(callback);
+
+ verify(callback).onFailure(cause);
+ verifyNoMoreInteractions(callback);
+
+ verify(mockShardDataTree, never()).startPreCommit(cohort);
+ }
+
+ @Test
+ public void testCommitWithIllegalArgumentEx() {
+ canCommitSuccess();
+ final DataTreeCandidateTip candidate = preCommitSuccess();
+
+ final Exception cause = new IllegalArgumentException("mock");
+ doAnswer(invocation -> {
+ invocation.<SimpleShardDataTreeCohort>getArgument(0).failedCommit(cause);
+ return null;
+ }).when(mockShardDataTree).startCommit(cohort, candidate);
+
+ @SuppressWarnings("unchecked")
+ final FutureCallback<UnsignedLong> callback = mock(FutureCallback.class);
+ cohort.commit(callback);
+
+ verify(callback).onFailure(cause);
+ verifyNoMoreInteractions(callback);
+
+ verify(mockUserCohorts).abort();
+ }
+
+ private static Future<?> abort(final ShardDataTreeCohort cohort) {
+ final CompletableFuture<Void> f = new CompletableFuture<>();
+ cohort.abort(new FutureCallback<Void>() {
+ @Override
+ public void onSuccess(final Void result) {
+ f.complete(null);
+ }
+
+ @Override
+ public void onFailure(final Throwable failure) {
+ f.completeExceptionally(failure);
+ }
+ });
+
+ return f;