CSIT Fix for SDC-2585
[sdc.git] / catalog-be / src / test / java / org / openecomp / sdc / common / transaction / mngr / SdncTransactionTest.java
1 /*-
2  * ============LICENSE_START=======================================================
3  * SDC
4  * ================================================================================
5  * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
6  * ================================================================================
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  * 
11  *      http://www.apache.org/licenses/LICENSE-2.0
12  * 
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  * ============LICENSE_END=========================================================
19  */
20
21 package org.openecomp.sdc.common.transaction.mngr;
22
23 import fj.data.Either;
24 import org.junit.Before;
25 import org.junit.BeforeClass;
26 import org.junit.Test;
27 import org.mockito.Mockito;
28 import org.openecomp.sdc.be.config.ConfigurationManager;
29 import org.openecomp.sdc.be.dao.api.ResourceUploadStatus;
30 import org.openecomp.sdc.be.dao.impl.ESCatalogDAO;
31 import org.openecomp.sdc.be.dao.janusgraph.JanusGraphGenericDao;
32 import org.openecomp.sdc.be.dao.janusgraph.JanusGraphOperationStatus;
33 import org.openecomp.sdc.be.resources.data.ESArtifactData;
34 import org.openecomp.sdc.common.api.ConfigurationSource;
35 import org.openecomp.sdc.common.impl.ExternalConfiguration;
36 import org.openecomp.sdc.common.impl.FSConfigurationSource;
37 import org.openecomp.sdc.common.log.wrappers.Logger;
38 import org.openecomp.sdc.common.transaction.api.IDBAction;
39 import org.openecomp.sdc.common.transaction.api.RollbackHandler;
40 import org.openecomp.sdc.common.transaction.api.TransactionUtils;
41 import org.openecomp.sdc.common.transaction.api.TransactionUtils.*;
42
43 import static org.junit.Assert.assertNotSame;
44 import static org.junit.Assert.assertSame;
45 import static org.junit.Assert.assertTrue;
46 import static org.mockito.Mockito.*;
47 import static org.mockito.Mockito.when;
48
49 public class SdncTransactionTest {
50     private static ESCatalogDAO esCatalogDao = Mockito.mock(ESCatalogDAO.class);
51     private static JanusGraphGenericDao janusGraphGenericDao = Mockito.mock(JanusGraphGenericDao.class);
52     private static final Logger log = Mockito.spy(Logger.getLogger(SdncTransactionTest.class));
53     private static int transactionId = 0;
54     private static ConfigurationManager configurationManager;
55
56     public enum TestAction {
57         JanusGraphAction, Rollback, GeneralAction
58     }
59
60     public enum TestResponse {
61         JanusGraphResponseSuccess, GeneralSuccess
62     }
63
64     @BeforeClass
65     public static void beforeClass() {
66         TransactionSdncImpl.setLog(log);
67         CommitManager.setLog(log);
68         RollbackHandler.setLog(log);
69         String appConfigDir = "src/test/resources/config/catalog-be";
70         ConfigurationSource configurationSource = new FSConfigurationSource(ExternalConfiguration.getChangeListener(), appConfigDir);
71         configurationManager = new ConfigurationManager(configurationSource);
72     }
73
74     @Before
75     public void beforeTest() {
76         reset(log);
77         reset(esCatalogDao);
78         reset(janusGraphGenericDao);
79     }
80
81     @Test
82     public void testInvokeJanusGraphAction() {
83         int transactionId = getNextTransactionId();
84         TransactionSdncImpl tx = new TransactionSdncImpl(transactionId, TransactionUtils.DUMMY_USER, ActionTypeEnum.ADD_ARTIFACT, esCatalogDao,
85             janusGraphGenericDao);
86
87         doBasicJanusGraphAction(transactionId, tx, false, true);
88         assertSame(TransactionStatusEnum.OPEN, tx.getStatus());
89     }
90
91     @Test
92     public void testInvokeESAction() {
93         int transactionId = getNextTransactionId();
94         TransactionSdncImpl tx = new TransactionSdncImpl(transactionId, TransactionUtils.DUMMY_USER, ActionTypeEnum.ADD_ARTIFACT, esCatalogDao,
95             janusGraphGenericDao);
96
97         doESAddArtifactAction(transactionId, tx, true, true);
98         assertSame(TransactionStatusEnum.OPEN, tx.getStatus());
99     }
100
101     @Test
102     public void testfinishTransaction() {
103         int transactionId = getNextTransactionId();
104         TransactionSdncImpl tx = new TransactionSdncImpl(transactionId, TransactionUtils.DUMMY_USER, ActionTypeEnum.ADD_ARTIFACT, esCatalogDao,
105             janusGraphGenericDao);
106         doFinishTransaction(transactionId, tx, true);
107         assertSame(TransactionStatusEnum.CLOSED, tx.getStatus());
108     }
109
110     @Test
111     public void testFinishOnClosedTransaction() {
112         int transactionId = getNextTransactionId();
113         TransactionSdncImpl tx = new TransactionSdncImpl(transactionId, TransactionUtils.DUMMY_USER, ActionTypeEnum.ADD_ARTIFACT, esCatalogDao,
114             janusGraphGenericDao);
115         doFinishTransaction(transactionId, tx, true);
116
117         TransactionCodeEnum finishTransaction = tx.finishTransaction();
118         assertSame(TransactionCodeEnum.TRANSACTION_CLOSED, finishTransaction);
119         verify(log).info(TransactionUtils.TRANSACTION_MARKER, LogMessages.COMMIT_ON_CLOSED_TRANSACTION, transactionId, TransactionStatusEnum.CLOSED.name(), TransactionUtils.DUMMY_USER, ActionTypeEnum.ADD_ARTIFACT.name());
120         assertSame(TransactionStatusEnum.CLOSED, tx.getStatus());
121
122     }
123
124     @Test
125     public void testCallingLastActionTwice() {
126         int transactionId = getNextTransactionId();
127         TransactionSdncImpl tx = new TransactionSdncImpl(transactionId, TransactionUtils.DUMMY_USER, ActionTypeEnum.ADD_ARTIFACT, esCatalogDao,
128             janusGraphGenericDao);
129         doBasicJanusGraphAction(transactionId, tx, true, true);
130         Either<TestResponse, TransactionCodeEnum> doBasicJanusGraphAction = doBasicJanusGraphAction(transactionId, tx, true, false);
131         assertTrue(doBasicJanusGraphAction.isRight());
132         assertNotSame(TransactionStatusEnum.OPEN, tx.getStatus());
133         verify(log).info(TransactionUtils.TRANSACTION_MARKER, LogMessages.DOUBLE_FINISH_FLAG_ACTION, transactionId, DBTypeEnum.JANUSGRAPH
134             .name(), TransactionUtils.DUMMY_USER, ActionTypeEnum.ADD_ARTIFACT.name());
135     }
136
137     @Test
138     public void testActionOnClosedTransaction() {
139         int transactionId = getNextTransactionId();
140         TransactionSdncImpl tx = new TransactionSdncImpl(transactionId, TransactionUtils.DUMMY_USER, ActionTypeEnum.ADD_ARTIFACT, esCatalogDao,
141             janusGraphGenericDao);
142         doFinishTransaction(transactionId, tx, true);
143
144         Either<DBActionCodeEnum, TransactionCodeEnum> eitherESResult = tx.invokeESAction(false, ESActionTypeEnum.ADD_ARTIFACT, createDummyArtifactData());
145         assertTrue(eitherESResult.isRight());
146         assertSame(TransactionCodeEnum.TRANSACTION_CLOSED, eitherESResult.right().value());
147
148         Either<Object, TransactionCodeEnum> eitherJanusGraphResult = tx.invokeJanusGraphAction(false, createBasicAction(TestAction.JanusGraphAction, TestResponse.JanusGraphResponseSuccess));
149         assertTrue(eitherJanusGraphResult.isRight());
150         assertSame(TransactionCodeEnum.TRANSACTION_CLOSED, eitherJanusGraphResult.right().value());
151
152         Either<Object, TransactionCodeEnum> eitherGeneralDBAction = tx.invokeGeneralDBAction(true, DBTypeEnum.JANUSGRAPH, createBasicAction(TestAction.JanusGraphAction, TestResponse.JanusGraphResponseSuccess),
153                 createBasicAction(TestAction.Rollback, TestResponse.JanusGraphResponseSuccess));
154         assertTrue(eitherGeneralDBAction.isRight());
155         assertSame(TransactionCodeEnum.TRANSACTION_CLOSED, eitherGeneralDBAction.right().value());
156
157         assertSame(TransactionStatusEnum.CLOSED, tx.getStatus());
158         verify(log, times(3)).info(TransactionUtils.TRANSACTION_MARKER, LogMessages.ACTION_ON_CLOSED_TRANSACTION, transactionId, TransactionUtils.DUMMY_USER, ActionTypeEnum.ADD_ARTIFACT.name());
159
160     }
161
162     @Test
163     public void testBasicHappyScenario() {
164         int transactionId = getNextTransactionId();
165         TransactionSdncImpl tx = new TransactionSdncImpl(transactionId, TransactionUtils.DUMMY_USER, ActionTypeEnum.ADD_ARTIFACT, esCatalogDao,
166             janusGraphGenericDao);
167
168         doBasicJanusGraphAction(transactionId, tx, false, true);
169         assertSame(TransactionStatusEnum.OPEN, tx.getStatus());
170
171         doESAddArtifactAction(transactionId, tx, true, true);
172         assertSame(TransactionStatusEnum.OPEN, tx.getStatus());
173
174         doFinishTransaction(transactionId, tx, true);
175
176         assertSame(TransactionStatusEnum.CLOSED, tx.getStatus());
177
178     }
179
180     @Test
181     public void testRollbackSucceededOnAction() {
182         int transactionId = getNextTransactionId();
183         TransactionSdncImpl tx = new TransactionSdncImpl(transactionId, TransactionUtils.DUMMY_USER, ActionTypeEnum.ADD_ARTIFACT, esCatalogDao,
184             janusGraphGenericDao);
185         doESAddArtifactAction(transactionId, tx, false, true);
186
187         when(janusGraphGenericDao.rollback()).thenReturn(JanusGraphOperationStatus.OK);
188         String crushMessage = "DB Crush Simulation";
189         Either<TestResponse, TransactionCodeEnum> eitherTransactionResult = tx.invokeJanusGraphAction(false, createCrushingAction(TestAction.JanusGraphAction, crushMessage));
190
191         assertTrue(eitherTransactionResult.isRight());
192         assertSame(TransactionCodeEnum.ROLLBACK_SUCCESS, eitherTransactionResult.right().value());
193         assertSame(TransactionStatusEnum.CLOSED, tx.getStatus());
194         verify(log).info(TransactionUtils.TRANSACTION_MARKER, LogMessages.DB_ACTION_FAILED_WITH_EXCEPTION, DBTypeEnum.JANUSGRAPH
195             .name(), transactionId, crushMessage, TransactionUtils.DUMMY_USER, ActionTypeEnum.ADD_ARTIFACT.name());
196
197         verify(log, times(1)).debug(LogMessages.ROLLBACK_PERSISTENT_ACTION, DBTypeEnum.ELASTIC_SEARCH.name(), transactionId, TransactionUtils.DUMMY_USER, ActionTypeEnum.ADD_ARTIFACT.name());
198         verify(log, times(1)).debug(TransactionUtils.TRANSACTION_MARKER, LogMessages.ROLLBACK_PERSISTENT_ACTION, DBTypeEnum.ELASTIC_SEARCH.name(), transactionId, TransactionUtils.DUMMY_USER, ActionTypeEnum.ADD_ARTIFACT.name());
199
200         verify(log, times(1)).debug(LogMessages.ROLLBACK_NON_PERSISTENT_ACTION, DBTypeEnum.JANUSGRAPH
201             .name(), transactionId, TransactionUtils.DUMMY_USER, ActionTypeEnum.ADD_ARTIFACT.name());
202         verify(log, times(1)).debug(TransactionUtils.TRANSACTION_MARKER, LogMessages.ROLLBACK_NON_PERSISTENT_ACTION, DBTypeEnum.JANUSGRAPH
203             .name(), transactionId, TransactionUtils.DUMMY_USER, ActionTypeEnum.ADD_ARTIFACT.name());
204
205         verify(log).info(LogMessages.ROLLBACK_SUCCEEDED_GENERAL, transactionId, TransactionUtils.DUMMY_USER, ActionTypeEnum.ADD_ARTIFACT.name());
206         verify(log).info(TransactionUtils.TRANSACTION_MARKER, LogMessages.ROLLBACK_SUCCEEDED_GENERAL, transactionId, TransactionUtils.DUMMY_USER, ActionTypeEnum.ADD_ARTIFACT.name());
207     }
208
209     @Test
210     public void testRollbackFailedOnAction() {
211         int transactionId = getNextTransactionId();
212         TransactionSdncImpl tx = new TransactionSdncImpl(transactionId, TransactionUtils.DUMMY_USER, ActionTypeEnum.ADD_ARTIFACT, esCatalogDao,
213             janusGraphGenericDao);
214
215         doESAddArtifactAction(transactionId, tx, false, true);
216
217         when(janusGraphGenericDao.rollback()).thenReturn(JanusGraphOperationStatus.NOT_CONNECTED);
218         String crushMessage = "DB Crush Simulation";
219         Either<TestResponse, TransactionCodeEnum> eitherTransactionResult = tx.invokeJanusGraphAction(false, createCrushingAction(TestAction.JanusGraphAction, crushMessage));
220
221         assertTrue(eitherTransactionResult.isRight());
222         assertSame(TransactionStatusEnum.FAILED_ROLLBACK, tx.getStatus());
223         assertSame(TransactionCodeEnum.ROLLBACK_FAILED, eitherTransactionResult.right().value());
224         verify(log).info(TransactionUtils.TRANSACTION_MARKER, LogMessages.DB_ACTION_FAILED_WITH_EXCEPTION, DBTypeEnum.JANUSGRAPH
225             .name(), transactionId, crushMessage, TransactionUtils.DUMMY_USER, ActionTypeEnum.ADD_ARTIFACT.name());
226
227         verify(log, times(1)).debug(LogMessages.ROLLBACK_PERSISTENT_ACTION, DBTypeEnum.ELASTIC_SEARCH.name(), transactionId, TransactionUtils.DUMMY_USER, ActionTypeEnum.ADD_ARTIFACT.name());
228         verify(log, times(1)).debug(TransactionUtils.TRANSACTION_MARKER, LogMessages.ROLLBACK_PERSISTENT_ACTION, DBTypeEnum.ELASTIC_SEARCH.name(), transactionId, TransactionUtils.DUMMY_USER, ActionTypeEnum.ADD_ARTIFACT.name());
229
230         verify(log, times(1)).debug(LogMessages.ROLLBACK_NON_PERSISTENT_ACTION, DBTypeEnum.JANUSGRAPH
231             .name(), transactionId, TransactionUtils.DUMMY_USER, ActionTypeEnum.ADD_ARTIFACT.name());
232         verify(log, times(1)).debug(TransactionUtils.TRANSACTION_MARKER, LogMessages.ROLLBACK_NON_PERSISTENT_ACTION, DBTypeEnum.JANUSGRAPH
233             .name(), transactionId, TransactionUtils.DUMMY_USER, ActionTypeEnum.ADD_ARTIFACT.name());
234     }
235
236     @Test
237     public void testRollbackSucceededOnCommit() {
238         int transactionId = getNextTransactionId();
239         TransactionSdncImpl tx = new TransactionSdncImpl(transactionId, TransactionUtils.DUMMY_USER, ActionTypeEnum.ADD_ARTIFACT, esCatalogDao,
240             janusGraphGenericDao);
241         doESAddArtifactAction(transactionId, tx, false, true);
242         doBasicJanusGraphAction(transactionId, tx, true, true);
243
244         when(janusGraphGenericDao.commit()).thenReturn(JanusGraphOperationStatus.GENERAL_ERROR);
245         when(janusGraphGenericDao.rollback()).thenReturn(JanusGraphOperationStatus.OK);
246         // finishTransaction
247         TransactionCodeEnum transactionCode = tx.finishTransaction();
248         assertSame(TransactionCodeEnum.ROLLBACK_SUCCESS, transactionCode);
249         assertSame(TransactionStatusEnum.CLOSED, tx.getStatus());
250
251         verify(log, times(1)).debug(LogMessages.ROLLBACK_PERSISTENT_ACTION, DBTypeEnum.ELASTIC_SEARCH.name(), transactionId, TransactionUtils.DUMMY_USER, ActionTypeEnum.ADD_ARTIFACT.name());
252         verify(log, times(1)).debug(TransactionUtils.TRANSACTION_MARKER, LogMessages.ROLLBACK_PERSISTENT_ACTION, DBTypeEnum.ELASTIC_SEARCH.name(), transactionId, TransactionUtils.DUMMY_USER, ActionTypeEnum.ADD_ARTIFACT.name());
253
254         verify(log, times(1)).debug(LogMessages.ROLLBACK_NON_PERSISTENT_ACTION, DBTypeEnum.JANUSGRAPH
255             .name(), transactionId, TransactionUtils.DUMMY_USER, ActionTypeEnum.ADD_ARTIFACT.name());
256         verify(log, times(1)).debug(TransactionUtils.TRANSACTION_MARKER, LogMessages.ROLLBACK_NON_PERSISTENT_ACTION, DBTypeEnum.JANUSGRAPH
257             .name(), transactionId, TransactionUtils.DUMMY_USER, ActionTypeEnum.ADD_ARTIFACT.name());
258
259         verify(log).info(LogMessages.ROLLBACK_SUCCEEDED_GENERAL, transactionId, TransactionUtils.DUMMY_USER, ActionTypeEnum.ADD_ARTIFACT.name());
260         verify(log).info(TransactionUtils.TRANSACTION_MARKER, LogMessages.ROLLBACK_SUCCEEDED_GENERAL, transactionId, TransactionUtils.DUMMY_USER, ActionTypeEnum.ADD_ARTIFACT.name());
261     }
262
263     @Test
264     public void testRollbackFailedOnCommit() {
265         int transactionId = getNextTransactionId();
266         TransactionSdncImpl tx = new TransactionSdncImpl(transactionId, TransactionUtils.DUMMY_USER, ActionTypeEnum.ADD_ARTIFACT, esCatalogDao,
267             janusGraphGenericDao);
268         doESAddArtifactAction(transactionId, tx, false, true);
269         doBasicJanusGraphAction(transactionId, tx, true, true);
270
271         when(janusGraphGenericDao.commit()).thenReturn(JanusGraphOperationStatus.GENERAL_ERROR);
272         when(janusGraphGenericDao.rollback()).thenReturn(JanusGraphOperationStatus.OK);
273         String esError = "No Connection to Es";
274         Mockito.doThrow(new RuntimeException(esError)).when(esCatalogDao).deleteArtifact(Mockito.anyString());
275         // finishTransaction
276         TransactionCodeEnum transactionCode = tx.finishTransaction();
277         assertSame(TransactionCodeEnum.ROLLBACK_FAILED, transactionCode);
278         assertSame(TransactionStatusEnum.FAILED_ROLLBACK, tx.getStatus());
279
280         verify(log, times(1)).debug(LogMessages.ROLLBACK_PERSISTENT_ACTION, DBTypeEnum.ELASTIC_SEARCH.name(), transactionId, TransactionUtils.DUMMY_USER, ActionTypeEnum.ADD_ARTIFACT.name());
281         verify(log, times(1)).debug(TransactionUtils.TRANSACTION_MARKER, LogMessages.ROLLBACK_PERSISTENT_ACTION, DBTypeEnum.ELASTIC_SEARCH.name(), transactionId, TransactionUtils.DUMMY_USER, ActionTypeEnum.ADD_ARTIFACT.name());
282
283         verify(log, times(1)).debug(LogMessages.ROLLBACK_NON_PERSISTENT_ACTION, DBTypeEnum.JANUSGRAPH
284             .name(), transactionId, TransactionUtils.DUMMY_USER, ActionTypeEnum.ADD_ARTIFACT.name());
285         verify(log, times(1)).debug(TransactionUtils.TRANSACTION_MARKER, LogMessages.ROLLBACK_NON_PERSISTENT_ACTION, DBTypeEnum.JANUSGRAPH
286             .name(), transactionId, TransactionUtils.DUMMY_USER, ActionTypeEnum.ADD_ARTIFACT.name());
287     }
288
289     @Test
290     public void testInvokeGeneralAction() {
291         when(janusGraphGenericDao.rollback()).thenReturn(JanusGraphOperationStatus.OK);
292         int transactionId = getNextTransactionId();
293         TransactionSdncImpl tx = new TransactionSdncImpl(transactionId, TransactionUtils.DUMMY_USER, ActionTypeEnum.ADD_ARTIFACT, esCatalogDao,
294             janusGraphGenericDao);
295         IDBAction generalAction = createBasicAction(TestAction.GeneralAction, TestResponse.GeneralSuccess);
296         IDBAction rollbackAction = createBasicAction(TestAction.Rollback, TestResponse.GeneralSuccess);
297         String crushMessage = "No DB Connection";
298         IDBAction crushingAction = createCrushingAction(TestAction.GeneralAction, crushMessage);
299
300         Either<TestResponse, TransactionCodeEnum> eitherResult = tx.invokeGeneralDBAction(false, DBTypeEnum.MYSTERY, generalAction, rollbackAction);
301         assertTrue(eitherResult.isLeft());
302         assertSame(TestResponse.GeneralSuccess, eitherResult.left().value());
303         assertSame(TransactionStatusEnum.OPEN, tx.getStatus());
304         eitherResult = tx.invokeGeneralDBAction(false, DBTypeEnum.MYSTERY, crushingAction, rollbackAction);
305
306         assertTrue(eitherResult.isRight());
307         assertSame(TransactionCodeEnum.ROLLBACK_SUCCESS, eitherResult.right().value());
308         assertSame(TransactionStatusEnum.CLOSED, tx.getStatus());
309
310         verify(log).info(TransactionUtils.TRANSACTION_MARKER, LogMessages.DB_ACTION_FAILED_WITH_EXCEPTION, DBTypeEnum.MYSTERY.name(), transactionId, crushMessage, TransactionUtils.DUMMY_USER, ActionTypeEnum.ADD_ARTIFACT.name());
311
312         verify(log, times(2)).debug(LogMessages.ROLLBACK_PERSISTENT_ACTION, DBTypeEnum.MYSTERY.name(), transactionId, TransactionUtils.DUMMY_USER, ActionTypeEnum.ADD_ARTIFACT.name());
313         verify(log, times(2)).debug(TransactionUtils.TRANSACTION_MARKER, LogMessages.ROLLBACK_PERSISTENT_ACTION, DBTypeEnum.MYSTERY.name(), transactionId, TransactionUtils.DUMMY_USER, ActionTypeEnum.ADD_ARTIFACT.name());
314
315         verify(log).info(LogMessages.ROLLBACK_SUCCEEDED_GENERAL, transactionId, TransactionUtils.DUMMY_USER, ActionTypeEnum.ADD_ARTIFACT.name());
316         verify(log).info(TransactionUtils.TRANSACTION_MARKER, LogMessages.ROLLBACK_SUCCEEDED_GENERAL, transactionId, TransactionUtils.DUMMY_USER, ActionTypeEnum.ADD_ARTIFACT.name());
317
318     }
319
320     private Either<TestResponse, TransactionCodeEnum> doBasicJanusGraphAction(int transactionId, TransactionSdncImpl tx, boolean isLastAction, boolean isVerifyAction) {
321         // Add JanusGraph Action
322         Either<TestResponse, TransactionCodeEnum> eitherJanusGraphResult = tx.invokeJanusGraphAction(isLastAction, createBasicAction(TestAction.JanusGraphAction, TestResponse.JanusGraphResponseSuccess));
323         if (isVerifyAction) {
324             // Check JanusGraph Action
325             assertTrue(eitherJanusGraphResult.isLeft());
326             assertSame(TestResponse.JanusGraphResponseSuccess, eitherJanusGraphResult.left().value());
327             verify(log).debug(TestAction.JanusGraphAction.name());
328             verify(log).debug(LogMessages.INVOKE_ACTION, transactionId, DBTypeEnum.JANUSGRAPH.name(), TransactionUtils.DUMMY_USER, ActionTypeEnum.ADD_ARTIFACT.name());
329             verifyNoErrorsInLog();
330             verifyNoInfoInLog();
331         }
332         return eitherJanusGraphResult;
333     }
334
335     private TransactionCodeEnum doFinishTransaction(int transactionId, TransactionSdncImpl tx, boolean isVerifyAction) {
336         // Prerequisite finishTransaction
337         when(janusGraphGenericDao.commit()).thenReturn(JanusGraphOperationStatus.OK);
338         // finishTransaction
339         TransactionCodeEnum transactionCode = tx.finishTransaction();
340         if (isVerifyAction) {
341             // Check finishTransaction
342             verify(log).debug(LogMessages.COMMIT_ACTION_ALL_DB, transactionId, TransactionUtils.DUMMY_USER, ActionTypeEnum.ADD_ARTIFACT.name());
343             verify(log).debug(LogMessages.COMMIT_ACTION_SPECIFIC_DB, transactionId, DBTypeEnum.JANUSGRAPH
344                 .name(), TransactionUtils.DUMMY_USER, ActionTypeEnum.ADD_ARTIFACT.name());
345             assertSame(TransactionCodeEnum.SUCCESS, transactionCode);
346         }
347         return transactionCode;
348     }
349
350     private void doESAddArtifactAction(int transactionId, TransactionSdncImpl tx, boolean isLastAction, boolean isVerifyAction) {
351         // Prerequisite ES Action
352         Either<ESArtifactData, ResourceUploadStatus> eitherBeforeAddArtifact = Either.right(ResourceUploadStatus.NOT_EXIST);
353         when(esCatalogDao.getArtifact(Mockito.anyString())).thenReturn(eitherBeforeAddArtifact);
354
355         // Add ES Action
356         Either<DBActionCodeEnum, TransactionCodeEnum> eitherEsAction = tx.invokeESAction(isLastAction, ESActionTypeEnum.ADD_ARTIFACT, createDummyArtifactData());
357
358         if (isVerifyAction) {
359             // Check JanusGraph Action
360             assertTrue(eitherEsAction.isLeft());
361             assertSame(DBActionCodeEnum.SUCCESS, eitherEsAction.left().value());
362             verify(log).debug(LogMessages.INVOKE_ACTION, transactionId, DBTypeEnum.ELASTIC_SEARCH.name(), TransactionUtils.DUMMY_USER, ActionTypeEnum.ADD_ARTIFACT.name());
363             verifyNoErrorsInLog();
364             verifyNoInfoInLog();
365         }
366     }
367
368     private ESArtifactData createDummyArtifactData() {
369         String strData = "qweqwqweqw34e4wrwer";
370         return new ESArtifactData("artifactNewMarina11", strData.getBytes());
371     }
372
373     private void verifyNoErrorsInLog() {
374         verify(log, Mockito.times(0)).error(Mockito.anyString(), Mockito.any(Object[].class));
375         verify(log, Mockito.times(0)).error(Mockito.anyString());
376     }
377
378     private void verifyNoInfoInLog() {
379         verify(log, Mockito.times(0)).info(Mockito.anyString(), Mockito.any(Object[].class));
380         verify(log, Mockito.times(0)).info(Mockito.anyString());
381     }
382
383     private IDBAction createBasicAction(TestAction action, TestResponse resp) {
384         final TestAction finalAction = action;
385         final TestResponse finalResp = resp;
386         return new IDBAction() {
387             @Override
388             public TestResponse doAction() {
389                 log.debug(finalAction.name());
390                 return finalResp;
391             }
392         };
393     }
394
395     private IDBAction createCrushingAction(TestAction action, final String crushMessage) {
396         final TestAction finalAction = action;
397         return new IDBAction() {
398             @Override
399             public TestResponse doAction() {
400                 log.debug(finalAction.name());
401                 throw new RuntimeException(crushMessage);
402             }
403         };
404     }
405
406     public int getNextTransactionId() {
407         transactionId++;
408         return transactionId;
409     }
410 }