Skip to content

Commit 0ad2847

Browse files
authored
optimize: fix 2.3.0 UT (#7175)
1 parent 35291d2 commit 0ad2847

File tree

2 files changed

+128
-108
lines changed

2 files changed

+128
-108
lines changed

compatible/src/test/java/io/seata/tm/api/DefaultFailureHandlerImplTest.java

Lines changed: 65 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -16,23 +16,20 @@
1616
*/
1717
package io.seata.tm.api;
1818

19-
import java.lang.reflect.Field;
20-
2119
import io.netty.util.HashedWheelTimer;
2220
import io.seata.core.context.RootContext;
2321
import io.seata.tm.api.transaction.MyRuntimeException;
2422
import org.apache.seata.common.util.ReflectionUtil;
2523
import org.apache.seata.core.exception.TransactionException;
2624
import org.apache.seata.core.model.GlobalStatus;
2725
import org.apache.seata.core.model.TransactionManager;
28-
import org.apache.seata.tm.TransactionManagerHolder;
29-
import org.jetbrains.annotations.NotNull;
3026
import org.junit.jupiter.api.Assertions;
31-
import org.junit.jupiter.api.BeforeAll;
3227
import org.junit.jupiter.api.Test;
3328
import org.slf4j.Logger;
3429
import org.slf4j.LoggerFactory;
3530

31+
import java.lang.reflect.Field;
32+
3633
class DefaultFailureHandlerImplTest {
3734
private static final Logger LOGGER = LoggerFactory.getLogger(DefaultFailureHandlerImplTest.class);
3835

@@ -71,67 +68,78 @@ public GlobalStatus globalReport(String xid, GlobalStatus globalStatus) throws T
7168

7269
@Test
7370
void onBeginFailure() throws Exception {
74-
RootContext.bind(DEFAULT_XID);
75-
DefaultGlobalTransaction tx = (DefaultGlobalTransaction) GlobalTransactionContext.getCurrentOrCreate();
76-
ReflectionUtil.setFieldValue(tx.getInstance(), "transactionManager", getTransactionManager());
77-
78-
FailureHandler failureHandler = new DefaultFailureHandlerImpl();
79-
failureHandler.onBeginFailure(tx, new MyRuntimeException("").getCause());
71+
try {
72+
RootContext.bind(DEFAULT_XID);
73+
DefaultGlobalTransaction tx = (DefaultGlobalTransaction) GlobalTransactionContext.getCurrentOrCreate();
74+
ReflectionUtil.setFieldValue(tx.getInstance(), "transactionManager", getTransactionManager());
75+
76+
FailureHandler failureHandler = new DefaultFailureHandlerImpl();
77+
failureHandler.onBeginFailure(tx, new MyRuntimeException("").getCause());
78+
} finally {
79+
RootContext.unbind();
80+
}
8081
}
8182

8283
@Test
8384
void onCommitFailure() throws Exception {
8485

85-
RootContext.bind(DEFAULT_XID);
86-
DefaultGlobalTransaction tx = (DefaultGlobalTransaction) GlobalTransactionContext.getCurrentOrCreate();
87-
ReflectionUtil.setFieldValue(tx.getInstance(), "transactionManager", getTransactionManager());
88-
89-
FailureHandler failureHandler = new DefaultFailureHandlerImpl();
90-
failureHandler.onCommitFailure(tx, new MyRuntimeException("").getCause());
91-
92-
// get timer
93-
Class<?> c = Class.forName("io.seata.tm.api.DefaultFailureHandlerImpl");
94-
Field field = c.getDeclaredField("TIMER");
95-
field.setAccessible(true);
96-
HashedWheelTimer timer = (HashedWheelTimer) field.get(failureHandler);
97-
// assert timer pendingCount: first time is 1
98-
Long pendingTimeout = timer.pendingTimeouts();
99-
Assertions.assertEquals(pendingTimeout, 1L);
100-
//set globalStatus
101-
globalStatus = GlobalStatus.Committed;
102-
Thread.sleep(25 * 1000L);
103-
pendingTimeout = timer.pendingTimeouts();
104-
LOGGER.info("pendingTimeout {}", pendingTimeout);
105-
//all timer is done
106-
Assertions.assertEquals(pendingTimeout, 0L);
86+
try {
87+
RootContext.bind(DEFAULT_XID);
88+
DefaultGlobalTransaction tx = (DefaultGlobalTransaction) GlobalTransactionContext.getCurrentOrCreate();
89+
ReflectionUtil.setFieldValue(tx.getInstance(), "transactionManager", getTransactionManager());
90+
91+
FailureHandler failureHandler = new DefaultFailureHandlerImpl();
92+
failureHandler.onCommitFailure(tx, new MyRuntimeException("").getCause());
93+
94+
// get timer
95+
Class<?> c = Class.forName("io.seata.tm.api.DefaultFailureHandlerImpl");
96+
Field field = c.getDeclaredField("TIMER");
97+
field.setAccessible(true);
98+
HashedWheelTimer timer = (HashedWheelTimer) field.get(failureHandler);
99+
// assert timer pendingCount: first time is 1
100+
Long pendingTimeout = timer.pendingTimeouts();
101+
Assertions.assertEquals(pendingTimeout, 1L);
102+
//set globalStatus
103+
globalStatus = GlobalStatus.Committed;
104+
Thread.sleep(25 * 1000L);
105+
pendingTimeout = timer.pendingTimeouts();
106+
LOGGER.info("pendingTimeout {}", pendingTimeout);
107+
//all timer is done
108+
Assertions.assertEquals(pendingTimeout, 0L);
109+
} finally {
110+
RootContext.unbind();
111+
}
107112
}
108113

109114
@Test
110115
void onRollbackFailure() throws Exception {
111-
RootContext.bind(DEFAULT_XID);
112-
DefaultGlobalTransaction tx = (DefaultGlobalTransaction) GlobalTransactionContext.getCurrentOrCreate();
113-
ReflectionUtil.setFieldValue(tx.getInstance(), "transactionManager", getTransactionManager());
114-
115-
FailureHandler failureHandler = new DefaultFailureHandlerImpl();
116-
117-
failureHandler.onRollbackFailure(tx, new MyRuntimeException("").getCause());
118-
119-
// get timer
120-
Class<?> c = Class.forName("io.seata.tm.api.DefaultFailureHandlerImpl");
121-
Field field = c.getDeclaredField("TIMER");
122-
field.setAccessible(true);
123-
HashedWheelTimer timer = (HashedWheelTimer) field.get(failureHandler);
124-
// assert timer pendingCount: first time is 1
125-
Long pendingTimeout = timer.pendingTimeouts();
126-
Assertions.assertEquals(pendingTimeout, 1L);
127-
//set globalStatus
128-
globalStatus = GlobalStatus.Rollbacked;
129-
Thread.sleep(25 * 1000L);
130-
pendingTimeout = timer.pendingTimeouts();
131-
LOGGER.info("pendingTimeout {}", pendingTimeout);
132-
//all timer is done
133-
Assertions.assertEquals(pendingTimeout, 0L);
134-
116+
try {
117+
RootContext.bind(DEFAULT_XID);
118+
DefaultGlobalTransaction tx = (DefaultGlobalTransaction) GlobalTransactionContext.getCurrentOrCreate();
119+
ReflectionUtil.setFieldValue(tx.getInstance(), "transactionManager", getTransactionManager());
120+
121+
FailureHandler failureHandler = new DefaultFailureHandlerImpl();
122+
123+
failureHandler.onRollbackFailure(tx, new MyRuntimeException("").getCause());
124+
125+
// get timer
126+
Class<?> c = Class.forName("io.seata.tm.api.DefaultFailureHandlerImpl");
127+
Field field = c.getDeclaredField("TIMER");
128+
field.setAccessible(true);
129+
HashedWheelTimer timer = (HashedWheelTimer) field.get(failureHandler);
130+
// assert timer pendingCount: first time is 1
131+
Long pendingTimeout = timer.pendingTimeouts();
132+
Assertions.assertEquals(pendingTimeout, 1L);
133+
//set globalStatus
134+
globalStatus = GlobalStatus.Rollbacked;
135+
Thread.sleep(25 * 1000L);
136+
pendingTimeout = timer.pendingTimeouts();
137+
LOGGER.info("pendingTimeout {}", pendingTimeout);
138+
//all timer is done
139+
Assertions.assertEquals(pendingTimeout, 0L);
140+
} finally {
141+
RootContext.unbind();
142+
}
135143

136144
}
137145

tm/src/test/java/org/apache/seata/tm/api/DefaultFailureHandlerImplTest.java

Lines changed: 63 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -70,68 +70,80 @@ public GlobalStatus globalReport(String xid, GlobalStatus globalStatus) throws T
7070

7171
@Test
7272
void onBeginFailure() throws Exception {
73-
RootContext.bind(DEFAULT_XID);
74-
GlobalTransaction tx = GlobalTransactionContext.getCurrentOrCreate();
75-
ReflectionUtil.setFieldValue(tx, "transactionManager", getTransactionManager());
76-
77-
FailureHandler failureHandler = new DefaultFailureHandlerImpl();
78-
failureHandler.onBeginFailure(tx, new MyRuntimeException("").getCause());
73+
try {
74+
RootContext.bind(DEFAULT_XID);
75+
GlobalTransaction tx = GlobalTransactionContext.getCurrentOrCreate();
76+
ReflectionUtil.setFieldValue(tx, "transactionManager", getTransactionManager());
77+
78+
FailureHandler failureHandler = new DefaultFailureHandlerImpl();
79+
failureHandler.onBeginFailure(tx, new MyRuntimeException("").getCause());
80+
} finally {
81+
RootContext.unbind();
82+
}
7983
}
8084

8185
@Test
8286
void onCommitFailure() throws Exception {
8387

84-
RootContext.bind(DEFAULT_XID);
85-
GlobalTransaction tx = GlobalTransactionContext.getCurrentOrCreate();
86-
//TransactionManagerHolder.set has interaction, using globalTransaction instance level tm
87-
ReflectionUtil.setFieldValue(tx, "transactionManager", getTransactionManager());
88-
89-
FailureHandler failureHandler = new DefaultFailureHandlerImpl();
90-
failureHandler.onCommitFailure(tx, new MyRuntimeException("").getCause());
91-
92-
// get timer
93-
Class<?> c = Class.forName("org.apache.seata.tm.api.DefaultFailureHandlerImpl");
94-
Field field = c.getDeclaredField("TIMER");
95-
field.setAccessible(true);
96-
HashedWheelTimer timer = (HashedWheelTimer) field.get(failureHandler);
97-
// assert timer pendingCount: first time is 1
98-
Long pendingTimeout = timer.pendingTimeouts();
99-
Assertions.assertEquals(pendingTimeout, 1L);
100-
//set globalStatus
101-
globalStatus = GlobalStatus.Committed;
102-
Thread.sleep(25 * 1000L);
103-
pendingTimeout = timer.pendingTimeouts();
104-
LOGGER.info("pendingTimeout {}", pendingTimeout);
105-
//all timer is done
106-
Assertions.assertEquals(pendingTimeout, 0L);
88+
try {
89+
RootContext.bind(DEFAULT_XID);
90+
GlobalTransaction tx = GlobalTransactionContext.getCurrentOrCreate();
91+
//TransactionManagerHolder.set has interaction, using globalTransaction instance level tm
92+
ReflectionUtil.setFieldValue(tx, "transactionManager", getTransactionManager());
93+
94+
FailureHandler failureHandler = new DefaultFailureHandlerImpl();
95+
failureHandler.onCommitFailure(tx, new MyRuntimeException("").getCause());
96+
97+
// get timer
98+
Class<?> c = Class.forName("org.apache.seata.tm.api.DefaultFailureHandlerImpl");
99+
Field field = c.getDeclaredField("TIMER");
100+
field.setAccessible(true);
101+
HashedWheelTimer timer = (HashedWheelTimer) field.get(failureHandler);
102+
// assert timer pendingCount: first time is 1
103+
Long pendingTimeout = timer.pendingTimeouts();
104+
Assertions.assertEquals(pendingTimeout, 1L);
105+
//set globalStatus
106+
globalStatus = GlobalStatus.Committed;
107+
Thread.sleep(25 * 1000L);
108+
pendingTimeout = timer.pendingTimeouts();
109+
LOGGER.info("pendingTimeout {}", pendingTimeout);
110+
//all timer is done
111+
Assertions.assertEquals(pendingTimeout, 0L);
112+
} finally {
113+
RootContext.unbind();
114+
}
107115
}
108116

109117
@Test
110118
void onRollbackFailure() throws Exception {
111119

112120

113-
RootContext.bind(DEFAULT_XID);
114-
GlobalTransaction tx = GlobalTransactionContext.getCurrentOrCreate();
115-
ReflectionUtil.setFieldValue(tx, "transactionManager", getTransactionManager());
116-
117-
FailureHandler failureHandler = new DefaultFailureHandlerImpl();
118-
failureHandler.onRollbackFailure(tx, new MyRuntimeException("").getCause());
119-
120-
// get timer
121-
Class<?> c = Class.forName("org.apache.seata.tm.api.DefaultFailureHandlerImpl");
122-
Field field = c.getDeclaredField("TIMER");
123-
field.setAccessible(true);
124-
HashedWheelTimer timer = (HashedWheelTimer) field.get(failureHandler);
125-
// assert timer pendingCount: first time is 1
126-
Long pendingTimeout = timer.pendingTimeouts();
127-
Assertions.assertEquals(pendingTimeout, 1L);
128-
//set globalStatus
129-
globalStatus = GlobalStatus.Rollbacked;
130-
Thread.sleep(25 * 1000L);
131-
pendingTimeout = timer.pendingTimeouts();
132-
LOGGER.info("pendingTimeout {}", pendingTimeout);
133-
//all timer is done
134-
Assertions.assertEquals(pendingTimeout, 0L);
121+
try {
122+
RootContext.bind(DEFAULT_XID);
123+
GlobalTransaction tx = GlobalTransactionContext.getCurrentOrCreate();
124+
ReflectionUtil.setFieldValue(tx, "transactionManager", getTransactionManager());
125+
126+
FailureHandler failureHandler = new DefaultFailureHandlerImpl();
127+
failureHandler.onRollbackFailure(tx, new MyRuntimeException("").getCause());
128+
129+
// get timer
130+
Class<?> c = Class.forName("org.apache.seata.tm.api.DefaultFailureHandlerImpl");
131+
Field field = c.getDeclaredField("TIMER");
132+
field.setAccessible(true);
133+
HashedWheelTimer timer = (HashedWheelTimer) field.get(failureHandler);
134+
// assert timer pendingCount: first time is 1
135+
Long pendingTimeout = timer.pendingTimeouts();
136+
Assertions.assertEquals(pendingTimeout, 1L);
137+
//set globalStatus
138+
globalStatus = GlobalStatus.Rollbacked;
139+
Thread.sleep(25 * 1000L);
140+
pendingTimeout = timer.pendingTimeouts();
141+
LOGGER.info("pendingTimeout {}", pendingTimeout);
142+
//all timer is done
143+
Assertions.assertEquals(pendingTimeout, 0L);
144+
} finally {
145+
RootContext.unbind();
146+
}
135147

136148

137149
}

0 commit comments

Comments
 (0)