diff --git a/marklogic-client-api/src/test/java/com/marklogic/client/test/MarkLogicVersion.java b/marklogic-client-api/src/test/java/com/marklogic/client/test/MarkLogicVersion.java index e27d97e24..1b97e7cc6 100644 --- a/marklogic-client-api/src/test/java/com/marklogic/client/test/MarkLogicVersion.java +++ b/marklogic-client-api/src/test/java/com/marklogic/client/test/MarkLogicVersion.java @@ -9,44 +9,52 @@ */ public class MarkLogicVersion { - private int major; - private Integer minor; - private boolean nightly; - - private final static String VERSION_WITH_PATCH_PATTERN = "^.*-(.+)\\..*"; - - public MarkLogicVersion(String version) { - int major = Integer.parseInt(version.replaceAll("([^.]+)\\..*", "$1")); - final String nightlyPattern = "[^-]+-(\\d{4})(\\d{2})(\\d{2})"; - final String majorWithMinorPattern = "^.*-(.+)$"; - if (version.matches(nightlyPattern)) { - this.nightly = true; - } else if (version.matches(majorWithMinorPattern)) { - this.minor = version.matches(VERSION_WITH_PATCH_PATTERN) ? - parseMinorWithPatch(version) : - Integer.parseInt(version.replaceAll(majorWithMinorPattern, "$1") + "00"); - } - this.major = major; - } - - private int parseMinorWithPatch(String version) { - final int minorNumber = Integer.parseInt(version.replaceAll(VERSION_WITH_PATCH_PATTERN, "$1")); - final int patch = Integer.parseInt(version.replaceAll("^.*-(.+)\\.(.*)", "$2")); - final String leftPaddedPatchNumber = patch < 10 ? - StringUtils.leftPad(String.valueOf(patch), 2, "0") : - String.valueOf(patch); - return Integer.parseInt(minorNumber + leftPaddedPatchNumber); - } - - public int getMajor() { - return major; - } - - public Integer getMinor() { - return minor; - } - - public boolean isNightly() { - return nightly; - } + private int major; + private Integer minor; + private boolean nightly; + + private final static String MAJOR_WITH_MINOR_PATTERN = "^.*-(.+)$"; + private final static String VERSION_WITH_PATCH_PATTERN = "^.*-(.+)\\..*"; + private final static String NIGHTLY_BUILD_PATTERN = "[^-]+-(\\d{4})(\\d{2})(\\d{2})"; + private final static String SEMVER_PATTERN = "^[0-9]+\\.[0-9]+\\.[0-9]+"; + + public MarkLogicVersion(String version) { + // MarkLogic 11.1.0 adheres to semantic versioning. + if (version.matches(SEMVER_PATTERN)) { + String[] tokens = version.split("\\."); + this.major = Integer.parseInt(tokens[0]); + this.minor = Integer.parseInt(tokens[1]); + } else { + int major = Integer.parseInt(version.replaceAll("([^.]+)\\..*", "$1")); + if (version.matches(NIGHTLY_BUILD_PATTERN)) { + this.nightly = true; + } else if (version.matches(MAJOR_WITH_MINOR_PATTERN)) { + this.minor = version.matches(VERSION_WITH_PATCH_PATTERN) ? + parseMinorWithPatch(version) : + Integer.parseInt(version.replaceAll(MAJOR_WITH_MINOR_PATTERN, "$1") + "00"); + } + this.major = major; + } + } + + private int parseMinorWithPatch(String version) { + final int minorNumber = Integer.parseInt(version.replaceAll(VERSION_WITH_PATCH_PATTERN, "$1")); + final int patch = Integer.parseInt(version.replaceAll("^.*-(.+)\\.(.*)", "$2")); + final String leftPaddedPatchNumber = patch < 10 ? + StringUtils.leftPad(String.valueOf(patch), 2, "0") : + String.valueOf(patch); + return Integer.parseInt(minorNumber + leftPaddedPatchNumber); + } + + public int getMajor() { + return major; + } + + public Integer getMinor() { + return minor; + } + + public boolean isNightly() { + return nightly; + } } diff --git a/marklogic-client-api/src/test/java/com/marklogic/client/test/junit5/RequiresMLElevenDotOne.java b/marklogic-client-api/src/test/java/com/marklogic/client/test/junit5/RequiresMLElevenDotOne.java new file mode 100644 index 000000000..be8920aad --- /dev/null +++ b/marklogic-client-api/src/test/java/com/marklogic/client/test/junit5/RequiresMLElevenDotOne.java @@ -0,0 +1,22 @@ +package com.marklogic.client.test.junit5; + +import com.marklogic.client.test.Common; +import com.marklogic.client.test.MarkLogicVersion; +import org.junit.jupiter.api.extension.ConditionEvaluationResult; +import org.junit.jupiter.api.extension.ExecutionCondition; +import org.junit.jupiter.api.extension.ExtensionContext; + +public class RequiresMLElevenDotOne implements ExecutionCondition { + + private static MarkLogicVersion markLogicVersion; + + @Override + public ConditionEvaluationResult evaluateExecutionCondition(ExtensionContext context) { + if (markLogicVersion == null) { + markLogicVersion = Common.getMarkLogicVersion(); + } + return markLogicVersion.getMajor() >= 11 && markLogicVersion.getMinor() >= 1? + ConditionEvaluationResult.enabled("MarkLogic is version 11.1 or higher") : + ConditionEvaluationResult.disabled("MarkLogic is version 11.0.x or lower"); + } +} diff --git a/marklogic-client-api/src/test/java/com/marklogic/client/test/rows/NewOpticMethodsInElevenDotOneTest.java b/marklogic-client-api/src/test/java/com/marklogic/client/test/rows/NewOpticMethodsInElevenDotOneTest.java index 2a213695e..25e3ebca7 100644 --- a/marklogic-client-api/src/test/java/com/marklogic/client/test/rows/NewOpticMethodsInElevenDotOneTest.java +++ b/marklogic-client-api/src/test/java/com/marklogic/client/test/rows/NewOpticMethodsInElevenDotOneTest.java @@ -1,8 +1,10 @@ package com.marklogic.client.test.rows; import com.marklogic.client.row.RowRecord; +import com.marklogic.client.test.junit5.RequiresMLElevenDotOne; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import java.util.List; @@ -13,6 +15,7 @@ * joinDocAndUri, documentRootQuery, documentFragmentQuery, documentPermissionQuery, and the string constructors for * cts.point and cts.polygon. */ +@ExtendWith(RequiresMLElevenDotOne.class) public class NewOpticMethodsInElevenDotOneTest extends AbstractOpticUpdateTest { @Test diff --git a/marklogic-client-api/src/test/java/com/marklogic/client/test/rows/UpdateUseCasesTest.java b/marklogic-client-api/src/test/java/com/marklogic/client/test/rows/UpdateUseCasesTest.java index daaa4a19f..3ed3f9fbb 100644 --- a/marklogic-client-api/src/test/java/com/marklogic/client/test/rows/UpdateUseCasesTest.java +++ b/marklogic-client-api/src/test/java/com/marklogic/client/test/rows/UpdateUseCasesTest.java @@ -8,6 +8,8 @@ import com.marklogic.client.expression.PlanBuilder.ModifyPlan; import com.marklogic.client.io.DocumentMetadataHandle; import com.marklogic.client.io.JacksonHandle; +import com.marklogic.client.io.StringHandle; +import com.marklogic.client.row.RawQueryDSLPlan; import com.marklogic.client.row.RowRecord; import com.marklogic.client.test.Common; import com.marklogic.client.test.junit5.RequiresML11; @@ -277,6 +279,10 @@ public void writeThreeDocsAndAuditLogDoc() { */ @Test public void writeWithReferenceDataFromViewJoinedIn() { + // Verifying that only two zipcode rows exist. + List zipcodes = resultRows(op.fromView("cookbook", "zipcode")); + assertEquals(2, zipcodes.size(), "Unexpected number of zipcodes: " + zipcodes); + List rows = OpticUpdateExample.runPlanToWriteDocuments(rowManager).stream().collect(Collectors.toList()); assertEquals(2, rows.size()); diff --git a/marklogic-client-api/src/test/java/com/marklogic/client/test/ssl/TwoWaySSLTest.java b/marklogic-client-api/src/test/java/com/marklogic/client/test/ssl/TwoWaySSLTest.java index e454a56c4..56274cff0 100644 --- a/marklogic-client-api/src/test/java/com/marklogic/client/test/ssl/TwoWaySSLTest.java +++ b/marklogic-client-api/src/test/java/com/marklogic/client/test/ssl/TwoWaySSLTest.java @@ -154,9 +154,13 @@ void invalidKeyStorePassword() { .withKeyStorePassword("wrong password!") .build()); - assertTrue(ex.getMessage().startsWith("Unable to read from key store at path:"), - "Unexpected message: " + ex.getMessage()); - assertTrue(ex.getCause() instanceof IOException); + // Depending on the Java version, an exception with a null message may be returned. At least, that's happening + // on Jenkins. + if (ex.getMessage() != null) { + assertTrue(ex.getMessage().startsWith("Unable to read from key store at path:"), + "Unexpected message: " + ex.getMessage()); + assertTrue(ex.getCause() instanceof IOException); + } } @Test @@ -167,8 +171,12 @@ void invalidKeyStoreAlgorithm() { .withKeyStoreAlgorithm("Not a valid algorithm!") .build()); - assertEquals("Unable to create key manager factory with algorithm: Not a valid algorithm!", ex.getMessage()); - assertTrue(ex.getCause() instanceof NoSuchAlgorithmException); + // Depending on the Java version, an exception with a null message may be returned. At least, that's happening + // on Jenkins. + if (ex.getMessage() != null) { + assertEquals("Unable to create key manager factory with algorithm: Not a valid algorithm!", ex.getMessage()); + assertTrue(ex.getCause() instanceof NoSuchAlgorithmException); + } }