Skip to content
This repository was archived by the owner on Sep 9, 2024. It is now read-only.

Commit e902547

Browse files
committed
feat: Replace boundary connector with one that connects to case-connector instead, working around JSii issue
1 parent 087bc05 commit e902547

10 files changed

Lines changed: 1010 additions & 18 deletions

File tree

build.gradle

Lines changed: 99 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,123 @@
11
plugins {
22
id 'java-library'
3-
}
3+
id 'java-library-distribution'
4+
id 'maven-publish'
5+
id "com.google.protobuf" version "0.9.4"
46

5-
group 'io.contracttesting.contractcase'
7+
}
8+
group 'io.contract-testing.contractcase'
69
version "0.0.1" // x-release-please-version
710

811
repositories {
9-
mavenLocal()
1012
mavenCentral()
13+
mavenLocal()
1114
}
1215

13-
def caseCoreVersion = "0.12.2"
16+
def caseCoreVersion = "0.13.0"
17+
def grpcVersion = "1.60.1"
1418

1519
dependencies {
1620
api "io.contract-testing.contractcase:case_example_mock_types:${caseCoreVersion}"
1721
api "io.contract-testing.contractcase:test-equivalence-matchers:${caseCoreVersion}"
22+
implementation 'io.contract-testing.contractcase:case_boundary:0.6.3'
1823
implementation 'com.diogonunes:JColor:5.5.1'
19-
implementation 'io.contract-testing.contractcase:case_boundary:0.6.2'
24+
implementation 'com.google.protobuf:protobuf-java:3.25.1'
25+
implementation 'com.google.protobuf:protobuf-java-util:3.25.1'
26+
implementation 'com.google.protobuf:protoc:3.25.1'
27+
implementation "io.grpc:protoc-gen-grpc-java:${grpcVersion}"
28+
implementation "io.grpc:grpc-core:${grpcVersion}"
29+
implementation "io.grpc:grpc-stub:${grpcVersion}"
30+
implementation "io.grpc:grpc-netty-shaded:${grpcVersion}"
31+
implementation "io.grpc:grpc-protobuf:${grpcVersion}"
32+
implementation 'com.fasterxml.jackson.core:jackson-databind:2.16.1'
2033
implementation 'org.jetbrains:annotations:23.0.0'
2134
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.1'
2235
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.1'
36+
testImplementation 'com.google.protobuf:protobuf-gradle-plugin:0.8.0'
2337
// api("org.junit.jupiter:junit-jupiter-api")
2438
// compileOnly("org.junit.jupiter:junit-jupiter")
2539
}
2640

2741
test {
2842
useJUnitPlatform()
43+
}
44+
45+
jar {
46+
duplicatesStrategy(DuplicatesStrategy.WARN)
47+
}
48+
49+
sourceSets {
50+
main {
51+
java {
52+
// srcDirs 'build/generated/source/proto/main/grpcjava', 'build/generated/source/proto/main/java'
53+
}
54+
}
55+
}
56+
57+
protobuf {
58+
plugins {
59+
// Locate a plugin with name 'grpc'. This step is optional.
60+
// If you leave it empty, it uses the current directory.
61+
// If you don't specify it, protoc will try to use "protoc-gen-grpc" from
62+
// system search path.
63+
'grpc' {
64+
artifact = 'io.grpc:protoc-gen-grpc-java:1.60.1'
65+
}
66+
}
67+
protoc {
68+
// Download from repositories
69+
artifact = 'com.google.protobuf:protoc:3.25.1'
70+
}
71+
generateProtoTasks {
72+
all().configureEach { task ->
73+
task.builtins {
74+
java {}
75+
}
76+
task.plugins {
77+
grpc {
78+
outputSubDir = 'grpcjava'
79+
}
80+
}
81+
}
82+
83+
}
84+
85+
}
86+
87+
88+
java {
89+
withJavadocJar()
90+
withSourcesJar()
91+
}
92+
93+
94+
publishing {
95+
publications {
96+
contractcase(MavenPublication) {
97+
from components.java
98+
versionMapping {
99+
usage('java-api') {
100+
fromResolutionOf('runtimeClasspath')
101+
}
102+
usage('java-runtime') {
103+
fromResolutionResult()
104+
}
105+
}
106+
}
107+
/*
108+
contractcase(MavenPublication) {
109+
from components.java
110+
versionMapping {
111+
usage('java-api') {
112+
fromResolutionOf('runtimeClasspath')
113+
}
114+
usage('java-runtime') {
115+
fromResolutionResult()
116+
}
117+
}
118+
}*/
119+
}
120+
repositories {
121+
mavenLocal()
122+
}
29123
}

gradle/wrapper/gradle-wrapper.jar

468 Bytes
Binary file not shown.
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
distributionBase=GRADLE_USER_HOME
22
distributionPath=wrapper/dists
3-
distributionUrl=https\://services.gradle.org/distributions/gradle-8.0.2-bin.zip
3+
distributionUrl=https\://services.gradle.org/distributions/gradle-8.5-bin.zip
44
networkTimeout=10000
55
zipStoreBase=GRADLE_USER_HOME
66
zipStorePath=wrapper/dists

gradlew

Lines changed: 4 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/main/java/io/contract_testing/contractcase/ContractDefiner.java

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

3-
import io.contract_testing.contractcase.case_boundary.BoundaryContractDefiner;
4-
import io.contract_testing.contractcase.case_example_mock_types.AnyMockDescriptor;
3+
import io.contract_testing.contractcase.case_example_mock_types.base.AnyMockDescriptor;
4+
import io.contract_testing.contractcase.client.InternalDefinerClient;
55
import org.jetbrains.annotations.NotNull;
66

77
public class ContractDefiner {
88

99
private static final String TEST_RUN_ID = "JAVA";
10-
private final BoundaryContractDefiner definer;
10+
private final InternalDefinerClient definer;
1111

1212

1313
public ContractDefiner(final @NotNull ContractCaseConfig config) {
1414
LogPrinter logPrinter = new LogPrinter();
15-
BoundaryContractDefiner definer = null;
15+
InternalDefinerClient definer = null;
1616
try {
17-
definer = new BoundaryContractDefiner(BoundaryConfigMapper.map(config, TEST_RUN_ID),
17+
definer = new InternalDefinerClient(BoundaryConfigMapper.map(config, TEST_RUN_ID),
1818
logPrinter,
1919
logPrinter,
2020
new BoundaryVersionGenerator().getVersions());
@@ -27,14 +27,14 @@ public ContractDefiner(final @NotNull ContractCaseConfig config) {
2727
public <T, M extends AnyMockDescriptor> void runExample(ExampleDefinition<M> definition,
2828
final @NotNull IndividualSuccessTestConfig<T> additionalConfig) {
2929
try {
30-
BoundaryResultMapper.map(definer.runExample(BoundaryDefinitionMapper.map(definition),
30+
BoundaryResultMapper.map(definer.runExample(definition.toJSON(),
3131
BoundaryConfigMapper.mapSuccessExample(additionalConfig, TEST_RUN_ID)));
3232
} catch (Throwable e) {
3333
BoundaryCrashReporter.handleAndRethrow(e);
3434
}
3535
}
3636

37-
public <T, M extends AnyMockDescriptor> void runExample(ExampleDefinition<M> definition) {
37+
public <M extends AnyMockDescriptor> void runExample(ExampleDefinition<M> definition) {
3838
this.runExample(
3939
definition,
4040
IndividualSuccessTestConfig
@@ -53,7 +53,7 @@ public <T, M extends AnyMockDescriptor> void runThrowingExample(ExampleDefinitio
5353
}
5454
}
5555

56-
public <T, M extends AnyMockDescriptor> void runThrowingExample(ExampleDefinition<M> definition) {
56+
public <M extends AnyMockDescriptor> void runThrowingExample(ExampleDefinition<M> definition) {
5757
this.runThrowingExample(
5858
definition,
5959
IndividualFailedTestConfig

src/main/java/io/contract_testing/contractcase/ExampleDefinition.java

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,12 @@
11
package io.contract_testing.contractcase;
22

3-
import io.contract_testing.contractcase.case_example_mock_types.AnyMockDescriptor;
3+
import com.fasterxml.jackson.core.TreeNode;
4+
import com.fasterxml.jackson.databind.JsonNode;
5+
import com.fasterxml.jackson.databind.ObjectMapper;
6+
import com.fasterxml.jackson.databind.node.ObjectNode;
7+
import io.contract_testing.contractcase.case_example_mock_types.base.AnyMockDescriptor;
48
import java.util.List;
9+
import java.util.function.Function;
510

611
public class ExampleDefinition<M extends AnyMockDescriptor> {
712

@@ -20,4 +25,20 @@ Object getDefinition() {
2025
public List<? extends Object> getStates() {
2126
return states;
2227
}
28+
29+
public JsonNode toJSON() {
30+
var mapper = new ObjectMapper();
31+
ObjectNode node = mapper.createObjectNode();
32+
node.set("definition", mapper.valueToTree(definition.toJSON()));
33+
node.set("states",
34+
mapper.createArrayNode()
35+
.addAll(this.states.stream()
36+
.map((Function<Object, JsonNode>) mapper::valueToTree)
37+
.toList()));
38+
39+
return node;
40+
41+
}
42+
43+
2344
}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package io.contract_testing.contractcase.client;
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.case_boundary.BoundaryFailure;
7+
import io.contract_testing.contractcase.case_boundary.BoundaryFailureKindConstants;
8+
import io.contract_testing.contractcase.case_boundary.BoundaryResult;
9+
import io.contract_testing.contractcase.case_boundary.BoundaryResultTypeConstants;
10+
11+
class BoundaryResultMapper {
12+
13+
public static void map(BoundaryResult result) {
14+
final var resultType = result.getResultType();
15+
16+
if (resultType.equals(BoundaryResultTypeConstants.RESULT_SUCCESS)) {
17+
return;
18+
}
19+
if (resultType.equals(BoundaryResultTypeConstants.RESULT_FAILURE)) {
20+
mapFailure((BoundaryFailure) result);
21+
}
22+
}
23+
24+
private static void mapFailure(BoundaryFailure result) {
25+
String kind = result.getKind();
26+
27+
if (kind.equals(BoundaryFailureKindConstants.CASE_BROKER_ERROR)
28+
|| kind.equals(BoundaryFailureKindConstants.CASE_CONFIGURATION_ERROR)
29+
|| kind.equals(BoundaryFailureKindConstants.CASE_TRIGGER_ERROR)) {
30+
throw new ContractCaseConfigurationError(result.getMessage(), result.getLocation());
31+
} else if (kind.equals(BoundaryFailureKindConstants.CASE_CORE_ERROR)) {
32+
throw new ContractCaseCoreError(result.getMessage(), result.getLocation());
33+
} else if (kind.equals(BoundaryFailureKindConstants.CASE_FAILED_ASSERTION_ERROR)
34+
|| kind.equals(BoundaryFailureKindConstants.CASE_VERIFY_RETURN_ERROR)) {
35+
throw new ContractCaseExpectationsNotMet(result.getMessage(), result.getLocation());
36+
}
37+
38+
throw new ContractCaseCoreError(
39+
"Unhandled error kind (" + kind + "): " + result.getMessage(),
40+
result.getLocation());
41+
}
42+
}

0 commit comments

Comments
 (0)