Skip to content

Commit f59a52b

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 f59a52b

File tree

5 files changed

+49
-3
lines changed

5 files changed

+49
-3
lines changed

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,

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

+6
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
package com.datastax.oss.driver.core;
1717

1818
import static org.assertj.core.api.Assertions.assertThat;
19+
import static org.junit.Assert.fail;
1920

2021
import com.datastax.oss.driver.api.core.CqlIdentifier;
2122
import com.datastax.oss.driver.api.core.CqlSession;
@@ -24,10 +25,12 @@
2425
import com.datastax.oss.driver.api.core.config.DriverConfigLoader;
2526
import com.datastax.oss.driver.api.core.session.Session;
2627
import com.datastax.oss.driver.api.testinfra.ccm.CcmRule;
28+
import com.datastax.oss.driver.api.testinfra.ccm.PreserveLogsRule;
2729
import com.datastax.oss.driver.api.testinfra.session.SessionRule;
2830
import com.datastax.oss.driver.api.testinfra.session.SessionUtils;
2931
import com.datastax.oss.driver.categories.ParallelizableTests;
3032
import org.junit.ClassRule;
33+
import org.junit.Rule;
3134
import org.junit.Test;
3235
import org.junit.experimental.categories.Category;
3336
import org.junit.rules.RuleChain;
@@ -42,6 +45,9 @@ public class ConnectKeyspaceIT {
4245
@ClassRule
4346
public static final TestRule CHAIN = RuleChain.outerRule(CCM_RULE).around(SESSION_RULE);
4447

48+
@Rule
49+
public PreserveLogsRule LOGS_RULE = new PreserveLogsRule(CCM_RULE.getCcmBridge());
50+
4551
@Test
4652
public void should_connect_to_existing_keyspace() {
4753
CqlIdentifier keyspace = SESSION_RULE.keyspace();

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
}

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

+16-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,15 @@ public void remove() {
378380
execute("remove");
379381
}
380382

383+
public void removeOrStop() {
384+
if (keepLogs) {
385+
stop();
386+
}
387+
else {
388+
remove();
389+
}
390+
}
391+
381392
public void pause(int n) {
382393
execute("node" + n, "pause");
383394
}
@@ -471,7 +482,11 @@ protected void processLine(String line, int logLevel) {
471482

472483
@Override
473484
public void close() {
474-
remove();
485+
removeOrStop();
486+
}
487+
488+
public void setKeepLogs(boolean keepLogs) {
489+
this.keepLogs = keepLogs;
475490
}
476491

477492
/**
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)