Skip to content

Commit 2a93e64

Browse files
committed
Add TestRule for preserving logs
This TestRule can be combined with other CCM Rules to prevent them from deleting logs of failed tests during cleanup.
1 parent 834f231 commit 2a93e64

File tree

5 files changed

+46
-3
lines changed

5 files changed

+46
-3
lines changed

Diff for: CONTRIBUTING.md

+4
Original file line numberDiff line numberDiff line change
@@ -286,6 +286,10 @@ If you use CCM, it **must** be with `CcmRule`.
286286
For an example of a Simulacron-based parallelizable test, see `NodeTargetingIT`. For a CCM-based
287287
test, see `DirectCompressionIT`.
288288
289+
Currently `CcmRule` based tests will not preserve CCM config directory upon failure. To have CCM
290+
logs available in case of failure during automated testing combine it with `PreserveLogsRule` so
291+
that logs can be uploaded.
292+
289293
##### Serial tests
290294
291295
These tests cannot run in parallel, in general because they require CCM clusters of different sizes,

Diff for: integration-tests/src/test/java/com/datastax/oss/driver/core/ConnectKeyspaceIT.java

+4
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,12 @@
2424
import com.datastax.oss.driver.api.core.config.DriverConfigLoader;
2525
import com.datastax.oss.driver.api.core.session.Session;
2626
import com.datastax.oss.driver.api.testinfra.ccm.CcmRule;
27+
import com.datastax.oss.driver.api.testinfra.ccm.PreserveLogsRule;
2728
import com.datastax.oss.driver.api.testinfra.session.SessionRule;
2829
import com.datastax.oss.driver.api.testinfra.session.SessionUtils;
2930
import com.datastax.oss.driver.categories.ParallelizableTests;
3031
import org.junit.ClassRule;
32+
import org.junit.Rule;
3133
import org.junit.Test;
3234
import org.junit.experimental.categories.Category;
3335
import org.junit.rules.RuleChain;
@@ -42,6 +44,8 @@ public class ConnectKeyspaceIT {
4244
@ClassRule
4345
public static final TestRule CHAIN = RuleChain.outerRule(CCM_RULE).around(SESSION_RULE);
4446

47+
@Rule public PreserveLogsRule LOGS_RULE = new PreserveLogsRule(CCM_RULE.getCcmBridge());
48+
4549
@Test
4650
public void should_connect_to_existing_keyspace() {
4751
CqlIdentifier keyspace = SESSION_RULE.keyspace();

Diff for: test-infra/src/main/java/com/datastax/oss/driver/api/testinfra/ccm/BaseCcmRule.java

+6-2
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ public abstract class BaseCcmRule extends CassandraResourceRule {
4242
new Thread(
4343
() -> {
4444
try {
45-
ccmBridge.remove();
45+
ccmBridge.removeOrStop();
4646
} catch (Exception e) {
4747
// silently remove as may have already been removed.
4848
}
@@ -57,7 +57,7 @@ protected void before() {
5757

5858
@Override
5959
protected void after() {
60-
ccmBridge.remove();
60+
ccmBridge.removeOrStop();
6161
}
6262

6363
private Statement buildErrorStatement(
@@ -232,4 +232,8 @@ public ProtocolVersion getHighestProtocolVersion() {
232232
return DefaultProtocolVersion.V3;
233233
}
234234
}
235+
236+
public CcmBridge getCcmBridge() {
237+
return ccmBridge;
238+
}
235239
}

Diff for: test-infra/src/main/java/com/datastax/oss/driver/api/testinfra/ccm/CcmBridge.java

+15-1
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,8 @@ public class CcmBridge implements AutoCloseable {
179179
private final List<String> dseWorkloads;
180180
private final String jvmArgs;
181181

182+
private boolean keepLogs = false;
183+
182184
private CcmBridge(
183185
Path configDirectory,
184186
int[] nodes,
@@ -378,6 +380,14 @@ public void remove() {
378380
execute("remove");
379381
}
380382

383+
public void removeOrStop() {
384+
if (keepLogs) {
385+
stop();
386+
} else {
387+
remove();
388+
}
389+
}
390+
381391
public void pause(int n) {
382392
execute("node" + n, "pause");
383393
}
@@ -471,7 +481,11 @@ protected void processLine(String line, int logLevel) {
471481

472482
@Override
473483
public void close() {
474-
remove();
484+
removeOrStop();
485+
}
486+
487+
public void setKeepLogs(boolean keepLogs) {
488+
this.keepLogs = keepLogs;
475489
}
476490

477491
/**
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package com.datastax.oss.driver.api.testinfra.ccm;
2+
3+
import org.junit.rules.TestWatcher;
4+
import org.junit.runner.Description;
5+
6+
public class PreserveLogsRule extends TestWatcher {
7+
private final CcmBridge ccmBridge;
8+
9+
public PreserveLogsRule(CcmBridge ccmBridge) {
10+
this.ccmBridge = ccmBridge;
11+
}
12+
13+
@Override
14+
protected void failed(Throwable e, Description description) {
15+
ccmBridge.setKeepLogs(true);
16+
}
17+
}

0 commit comments

Comments
 (0)