Skip to content

Commit 5b504e5

Browse files
committed
refactor: Move classes around to improve the public interface
1 parent c078a50 commit 5b504e5

11 files changed

Lines changed: 126 additions & 120 deletions

packages/dsl-java/src/main/java/io/contract_testing/contractcase/ConnectorExceptionMapper.java

Lines changed: 0 additions & 52 deletions
This file was deleted.

packages/dsl-java/src/main/java/io/contract_testing/contractcase/ContractCaseCoreError.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package io.contract_testing.contractcase;
22

3+
import io.contract_testing.contractcase.edge.ConnectorExceptionMapper;
34
import java.util.Arrays;
45
import java.util.stream.Collectors;
56
import org.jetbrains.annotations.NotNull;

packages/dsl-java/src/main/java/io/contract_testing/contractcase/ContractDefiner.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import io.contract_testing.contractcase.client.InternalDefinerClient;
1414
import io.contract_testing.contractcase.client.server.ContractCaseProcess;
1515
import io.contract_testing.contractcase.definitions.interactions.base.AnyInteractionDescriptor;
16+
import io.contract_testing.contractcase.edge.BoundaryCrashReporter;
1617
import io.contract_testing.contractcase.edge.ConnectorInvokableFunctionMapper;
1718
import io.contract_testing.contractcase.edge.ConnectorInvokableFunctionMapper.ConnectorInvokableFunction;
1819
import org.jetbrains.annotations.NotNull;

packages/dsl-java/src/main/java/io/contract_testing/contractcase/ContractVerifier.java

Lines changed: 14 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,5 @@
11
package io.contract_testing.contractcase;
22

3-
import static io.contract_testing.contractcase.BoundaryCrashReporter.CRASH_MESSAGE_END;
4-
import static io.contract_testing.contractcase.BoundaryCrashReporter.CRASH_MESSAGE_START;
5-
63
import io.contract_testing.contractcase.InvokableFunctions.InvokableFunction0;
74
import io.contract_testing.contractcase.InvokableFunctions.InvokableFunction1;
85
import io.contract_testing.contractcase.InvokableFunctions.InvokableFunction2;
@@ -12,83 +9,38 @@
129
import io.contract_testing.contractcase.InvokableFunctions.InvokableFunction6;
1310
import io.contract_testing.contractcase.InvokableFunctions.InvokableFunction7;
1411
import io.contract_testing.contractcase.client.InternalVerifierClient;
15-
import io.contract_testing.contractcase.client.MaintainerLog;
1612
import io.contract_testing.contractcase.client.server.ContractCaseProcess;
17-
import io.contract_testing.contractcase.edge.ConnectorExceptionMapper;
18-
import io.contract_testing.contractcase.edge.ConnectorFailure;
19-
import io.contract_testing.contractcase.edge.ConnectorFailureKindConstants;
13+
import io.contract_testing.contractcase.edge.BasicRunTestCallback;
14+
import io.contract_testing.contractcase.edge.BoundaryCrashReporter;
2015
import io.contract_testing.contractcase.edge.ConnectorInvokableFunctionMapper;
2116
import io.contract_testing.contractcase.edge.ConnectorInvokableFunctionMapper.ConnectorInvokableFunction;
2217
import io.contract_testing.contractcase.edge.ConnectorResult;
23-
import io.contract_testing.contractcase.edge.ConnectorResultTypeConstants;
24-
import io.contract_testing.contractcase.edge.InvokeCoreTest;
25-
import io.contract_testing.contractcase.edge.RunTestCallback;
26-
import java.util.ArrayList;
2718
import java.util.List;
28-
import org.jetbrains.annotations.NotNull;
2919

3020
public class ContractVerifier implements AutoCloseable {
3121

3222
private final InternalVerifierClient verifier;
3323

34-
private final List<ConnectorFailure> failures = new ArrayList<>();
24+
3525
private final ContractCaseConfig config;
26+
private final BasicRunTestCallback runTestCallback;
3627

3728
public ContractVerifier(final ContractCaseConfig config) {
3829
LogPrinter logPrinter = new LogPrinter();
3930
ContractCaseProcess.getInstance().start();
4031
this.config = config;
4132

4233
InternalVerifierClient verification = null;
34+
runTestCallback = new BasicRunTestCallback();
4335
try {
4436
verification = new InternalVerifierClient(
45-
ConnectorConfigMapper.map(config, "VERIFICATION"),
46-
// TODO: Move the runTestCallback into the internals, maybe?
47-
new RunTestCallback() {
48-
@Override
49-
public @NotNull ConnectorResult runTest(@NotNull String testName,
50-
@NotNull InvokeCoreTest invoker) {
51-
// TODO replace this with something that knows about JUnit
52-
try {
53-
MaintainerLog.log(LogLevel.MAINTAINER_DEBUG, "Invoking verifier for: " + testName);
54-
var result = invoker.verify();
55-
56-
// TODO: Replace this with something that knows what to do with these results
57-
if (result.getResultType().equals(ConnectorResultTypeConstants.RESULT_SUCCESS)) {
58-
MaintainerLog.log(LogLevel.MAINTAINER_DEBUG, "");
59-
MaintainerLog.log(LogLevel.MAINTAINER_DEBUG, "[SUCCESS] " + testName);
60-
MaintainerLog.log(LogLevel.MAINTAINER_DEBUG, "");
61-
62-
} else {
63-
var failure = ((ConnectorFailure) result);
64-
failures.add(failure);
65-
var kind = failure.getKind();
66-
if (kind.equals(ConnectorFailureKindConstants.CASE_CORE_ERROR)) {
67-
System.err.println(
68-
CRASH_MESSAGE_START
69-
+ "\n\n"
70-
+ failure.getMessage()
71-
+ "\n"
72-
+ failure.getLocation()
73-
+ "\n\n"
74-
+ CRASH_MESSAGE_END);
75-
} else if (kind.equals(ConnectorFailureKindConstants.CASE_CONFIGURATION_ERROR)) {
76-
MaintainerLog.log(LogLevel.MAINTAINER_DEBUG, "");
77-
MaintainerLog.log(LogLevel.MAINTAINER_DEBUG, "[CONFIGURATION ERROR] " + failure.getMessage());
78-
MaintainerLog.log(LogLevel.MAINTAINER_DEBUG, "");
79-
} else {
80-
MaintainerLog.log(LogLevel.MAINTAINER_DEBUG, "");
81-
MaintainerLog.log(LogLevel.MAINTAINER_DEBUG, "[OTHER ERROR] " + failure.getMessage());
82-
MaintainerLog.log(LogLevel.MAINTAINER_DEBUG, "");
83-
}
84-
}
85-
return result;
86-
} catch (Exception e) {
87-
return ConnectorExceptionMapper.map(e);
88-
}
89-
}
90-
91-
}, logPrinter, new BoundaryVersionGenerator().getVersions()
37+
ConnectorConfigMapper.map(
38+
config,
39+
"VERIFICATION"
40+
),
41+
runTestCallback,
42+
logPrinter,
43+
new BoundaryVersionGenerator().getVersions()
9244
);
9345
} catch (Throwable e) {
9446
BoundaryCrashReporter.handleAndRethrow(e);
@@ -124,6 +76,7 @@ public void runVerification(ContractCaseConfig configOverrides) {
12476
} catch (Throwable e) {
12577
BoundaryCrashReporter.handleAndRethrow(e);
12678
}
79+
var failures = runTestCallback.getFailures();
12780
if (!failures.isEmpty()) {
12881
try {
12982
ConnectorResultMapper.mapVoid(ConnectorResult.toConnectorResult(failures.get(0)));
@@ -206,4 +159,5 @@ private void registerFunctionInternal(String functionName,
206159
BoundaryCrashReporter.handleAndRethrow(e);
207160
}
208161
}
162+
209163
}

packages/dsl-java/src/main/java/io/contract_testing/contractcase/StateHandler.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
import java.util.Map;
44

55
/**
6-
* Helper class to enable user-provided state handlers
6+
* User-provided state setup and teardown functions.
77
*/
88
public class StateHandler {
99

packages/dsl-java/src/main/java/io/contract_testing/contractcase/client/rpc/CrashPrintingExecutor.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package io.contract_testing.contractcase.client.rpc;
22

3-
import io.contract_testing.contractcase.BoundaryCrashReporter;
3+
import io.contract_testing.contractcase.edge.BoundaryCrashReporter;
44
import java.util.concurrent.ExecutorService;
55
import java.util.concurrent.Executors;
66
import java.util.concurrent.Future;

packages/dsl-java/src/main/java/io/contract_testing/contractcase/client/rpc/RpcForDefinition.java

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,9 @@
66
import io.contract_testing.contractcase.client.MaintainerLog;
77
import io.contract_testing.contractcase.edge.ConnectorFailure;
88
import io.contract_testing.contractcase.edge.ConnectorFailureKindConstants;
9+
import io.contract_testing.contractcase.edge.ConnectorResult;
10+
import io.contract_testing.contractcase.edge.InvokeCoreTest;
11+
import io.contract_testing.contractcase.edge.RunTestCallback;
912
import io.contract_testing.contractcase.grpc.ContractCaseGrpc.ContractCaseStub;
1013
import io.contract_testing.contractcase.grpc.ContractCaseStream.DefinitionRequest;
1114
import io.contract_testing.contractcase.grpc.ContractCaseStream.DefinitionRequest.Builder;
@@ -22,11 +25,26 @@ public RpcForDefinition(@NotNull LogPrinter logPrinter,
2225
super(
2326
logPrinter,
2427
configHandle,
25-
(testName, invoker) -> new ConnectorFailure(
26-
ConnectorFailureKindConstants.CASE_CORE_ERROR,
27-
"runTest isn't valid during contract definition",
28-
MaintainerLog.CONTRACT_CASE_JAVA_WRAPPER
29-
)
28+
new RunTestCallback() {
29+
// This is a bit unpleasant - really the run test
30+
// callback shouldn't need to be passed to the parent,
31+
// because it's only valid during verification.
32+
@Override
33+
public @NotNull ConnectorResult runTest(@NotNull String testName,
34+
@NotNull InvokeCoreTest invoker) {
35+
return new ConnectorFailure(
36+
ConnectorFailureKindConstants.CASE_CORE_ERROR,
37+
"runTest isn't valid during contract definition",
38+
MaintainerLog.CONTRACT_CASE_JAVA_WRAPPER
39+
);
40+
}
41+
42+
@Override
43+
public @NotNull List<ConnectorFailure> getFailures() {
44+
throw new ContractCaseCoreError(
45+
"There should be no calls to RunTestCallback.getFailures() during contract definition. This is a bug");
46+
}
47+
}
3048
);
3149
}
3250

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
package io.contract_testing.contractcase.edge;
2+
3+
4+
import io.contract_testing.contractcase.LogLevel;
5+
import io.contract_testing.contractcase.client.MaintainerLog;
6+
import java.util.ArrayList;
7+
import java.util.List;
8+
import org.jetbrains.annotations.NotNull;
9+
10+
/**
11+
* Provides a no-frills test runner that has no knowledge of a test framwork.
12+
*/
13+
public class BasicRunTestCallback implements RunTestCallback {
14+
private final List<ConnectorFailure> failures = new ArrayList<>();
15+
16+
17+
@Override
18+
public @NotNull ConnectorResult runTest(@NotNull String testName,
19+
@NotNull InvokeCoreTest invoker) {
20+
// TODO replace this with something that knows about JUnit
21+
try {
22+
MaintainerLog.log(LogLevel.MAINTAINER_DEBUG, "Invoking verifier for: " + testName);
23+
var result = invoker.verify();
24+
25+
// TODO: Replace this with something that knows what to do with these results
26+
if (result.getResultType().equals(ConnectorResultTypeConstants.RESULT_SUCCESS)) {
27+
MaintainerLog.log(LogLevel.MAINTAINER_DEBUG, "");
28+
MaintainerLog.log(LogLevel.MAINTAINER_DEBUG, "[SUCCESS] " + testName);
29+
MaintainerLog.log(LogLevel.MAINTAINER_DEBUG, "");
30+
31+
} else {
32+
var failure = ((ConnectorFailure) result);
33+
failures.add(failure);
34+
var kind = failure.getKind();
35+
if (kind.equals(ConnectorFailureKindConstants.CASE_CORE_ERROR)) {
36+
System.err.println(
37+
BoundaryCrashReporter.CRASH_MESSAGE_START
38+
+ "\n\n"
39+
+ failure.getMessage()
40+
+ "\n"
41+
+ failure.getLocation()
42+
+ "\n\n"
43+
+ BoundaryCrashReporter.CRASH_MESSAGE_END);
44+
} else if (kind.equals(ConnectorFailureKindConstants.CASE_CONFIGURATION_ERROR)) {
45+
MaintainerLog.log(LogLevel.MAINTAINER_DEBUG, "");
46+
MaintainerLog.log(
47+
LogLevel.MAINTAINER_DEBUG,
48+
"[CONFIGURATION ERROR] " + failure.getMessage()
49+
);
50+
MaintainerLog.log(LogLevel.MAINTAINER_DEBUG, "");
51+
} else {
52+
MaintainerLog.log(LogLevel.MAINTAINER_DEBUG, "");
53+
MaintainerLog.log(LogLevel.MAINTAINER_DEBUG, "[OTHER ERROR] " + failure.getMessage());
54+
MaintainerLog.log(LogLevel.MAINTAINER_DEBUG, "");
55+
}
56+
}
57+
return result;
58+
} catch (Exception e) {
59+
return ConnectorExceptionMapper.map(e);
60+
}
61+
}
62+
63+
@Override
64+
public @NotNull List<ConnectorFailure> getFailures() {
65+
return List.copyOf(this.failures);
66+
}
67+
68+
}

packages/dsl-java/src/main/java/io/contract_testing/contractcase/BoundaryCrashReporter.java renamed to packages/dsl-java/src/main/java/io/contract_testing/contractcase/edge/BoundaryCrashReporter.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,9 @@
1-
package io.contract_testing.contractcase;
1+
package io.contract_testing.contractcase.edge;
2+
3+
import io.contract_testing.contractcase.ContractCaseConfigurationError;
4+
import io.contract_testing.contractcase.ContractCaseCoreError;
5+
import io.contract_testing.contractcase.ContractCaseExpectationsNotMet;
6+
import io.contract_testing.contractcase.edge.ConnectorExceptionMapper;
27

38
/**
49
* Used internally to print crash reports. Not part of the exposed interface for users.

packages/dsl-java/src/main/java/io/contract_testing/contractcase/edge/ConnectorExceptionMapper.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@
55
import java.util.Arrays;
66
import java.util.stream.Collectors;
77

8+
/**
9+
* Maps exceptions between the internal {@link ConnectorResult} type and java exceptions (and back).
10+
*/
811
public class ConnectorExceptionMapper {
912

1013
public static String stackTraceToString(Throwable e) {

0 commit comments

Comments
 (0)