Skip to content

Commit 2a34439

Browse files
authored
Merge branch 'master' into improve/test-workflow-jdk25-v2
2 parents bc4d290 + 61068a1 commit 2a34439

6 files changed

Lines changed: 80 additions & 3 deletions

File tree

.github/workflows/gradle-wrapper-validation.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,4 @@ jobs:
77
runs-on: ubuntu-latest
88
steps:
99
- uses: actions/checkout@v4
10-
- uses: gradle/actions/wrapper-validation@v3
10+
- uses: gradle/actions/wrapper-validation@v5

CHANGES.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
Current (7.12.0)
22
Update: Updated GitHub Actions test matrix to include JDK 25 (Bartek Florczak)
3+
Fixed: GITHUB-3236: DataProvider parameters are not refreshed on retry when cacheDataForTestRetries=false (Bartek Florczak)
34
Fixed: GITHUB-3227: assertEqualsNoOrder false positive when collection has same size and actual Collection is subset of expected collection (Krishnan Mahadevan)
45
Fixed: GITHUB-3177: Method org.testng.xml.XmlSuite#toXml do not save new properties like "share-thread-pool-for-data-providers" (Krishnan Mahadevan)
56
Fixed: GITHUB-3179: ClassCastException when use shouldUseGlobalThreadPool(true) property (Krishnan Mahadevan)

testng-core/src/main/java/org/testng/internal/invokers/TestInvoker.java

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -243,7 +243,8 @@ public FailureContext retryFailed(
243243
boolean cacheData =
244244
Optional.ofNullable(arguments.getTestMethod().getDataProviderMethod())
245245
.map(IDataProviderMethod::cacheDataForTestRetries)
246-
.orElse(false);
246+
.orElse(true);
247+
Object[] parameterValues = arguments.getParameterValues();
247248
if (!cacheData) {
248249
Map<String, String> allParameters = Maps.newHashMap();
249250
int verbose = testContext.getCurrentXmlTest().getVerbose();
@@ -257,8 +258,18 @@ public FailureContext retryFailed(
257258
if (bag.hasErrors()) {
258259
continue;
259260
}
261+
if (bag.parameterHolder != null) {
262+
Iterator<Object[]> it = bag.parameterHolder.parameters;
263+
int targetIndex = arguments.getParametersIndex();
264+
for (int i = 0; it.hasNext(); i++) {
265+
Object[] current = it.next();
266+
if (i == targetIndex) {
267+
parameterValues = current;
268+
break;
269+
}
270+
}
271+
}
260272
}
261-
Object[] parameterValues = arguments.getParameterValues();
262273
TestMethodArguments tma =
263274
new TestMethodArguments.Builder()
264275
.usingArguments(arguments)
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package test.dataprovider.issue3237;
2+
3+
import static org.assertj.core.api.Assertions.assertThat;
4+
5+
import org.testng.TestListenerAdapter;
6+
import org.testng.TestNG;
7+
import org.testng.annotations.Test;
8+
import test.SimpleBaseTest;
9+
10+
public class CacheTest extends SimpleBaseTest {
11+
12+
@Test
13+
public void verifyFreshDataOnRetry() {
14+
TestNG tng = create(SampleCacheTestCase.class);
15+
TestListenerAdapter tla = new TestListenerAdapter();
16+
tng.addListener(tla);
17+
tng.run();
18+
19+
assertThat(tla.getFailedTests()).isEmpty();
20+
assertThat(tla.getPassedTests()).hasSize(1);
21+
assertThat(tla.getSkippedTests()).hasSize(1);
22+
}
23+
}
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package test.dataprovider.issue3237;
2+
3+
import java.util.UUID;
4+
import java.util.concurrent.atomic.AtomicInteger;
5+
import org.testng.Assert;
6+
import org.testng.IRetryAnalyzer;
7+
import org.testng.ITestResult;
8+
import org.testng.annotations.DataProvider;
9+
import org.testng.annotations.Test;
10+
11+
public class SampleCacheTestCase {
12+
13+
private final AtomicInteger invocationCount = new AtomicInteger(0);
14+
private String currentUuid;
15+
16+
@Test(dataProvider = "dp", retryAnalyzer = MyRetry.class)
17+
public void testMethod(String uuid) {
18+
// Verify that fresh UUID is generated on each retry (no caching)
19+
Assert.assertEquals(uuid, currentUuid, "Received stale data from DataProvider!");
20+
21+
// Fail on first invocation to trigger retry, pass on second
22+
if (invocationCount.getAndIncrement() < 1) {
23+
throw new RuntimeException("Failed for " + uuid);
24+
}
25+
}
26+
27+
@DataProvider(name = "dp", cacheDataForTestRetries = false)
28+
public Object[][] getData() {
29+
currentUuid = UUID.randomUUID().toString();
30+
return new Object[][] {{currentUuid}};
31+
}
32+
33+
public static class MyRetry implements IRetryAnalyzer {
34+
private int count = 0;
35+
36+
@Override
37+
public boolean retry(ITestResult result) {
38+
return count++ < 1;
39+
}
40+
}
41+
}

testng-core/src/test/resources/testng.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -606,6 +606,7 @@
606606
<class name="test.dataprovider.IndicesTest" />
607607
<class name="test.dataprovider.DataProviderTest"/>
608608
<class name="test.dataprovider.InterceptorTest"/>
609+
<class name="test.dataprovider.issue3237.CacheTest"/>
609610
</classes>
610611
</test>
611612

0 commit comments

Comments
 (0)