This is an automated email from the ASF dual-hosted git repository. rec pushed a commit to branch refactoring/292-Make-CAS-serialization-tests-more-robust in repository https://gitbox.apache.org/repos/asf/uima-uimaj.git
commit a955a0da7c10d364e36dbcbad170ba828bb05336 Author: Richard Eckart de Castilho <[email protected]> AuthorDate: Mon Jan 23 17:47:18 2023 +0100 Issue #292: Make CAS serialization tests more robust - run SerRef tests using a content comparison --- .../CasSerializationDeserialization_XCAS_Test.java | 4 ++ .../uima/cas/serdes/SerDesCasIOTestUtils.java | 2 +- .../cas/serdes/scenario/SerRefTestScenario.java | 53 +++++++++++++++++----- 3 files changed, 46 insertions(+), 13 deletions(-) diff --git a/uimaj-core/src/test/java/org/apache/uima/cas/serdes/CasSerializationDeserialization_XCAS_Test.java b/uimaj-core/src/test/java/org/apache/uima/cas/serdes/CasSerializationDeserialization_XCAS_Test.java index 74c710406..3338007b1 100644 --- a/uimaj-core/src/test/java/org/apache/uima/cas/serdes/CasSerializationDeserialization_XCAS_Test.java +++ b/uimaj-core/src/test/java/org/apache/uima/cas/serdes/CasSerializationDeserialization_XCAS_Test.java @@ -91,6 +91,10 @@ public class CasSerializationDeserialization_XCAS_Test { @ParameterizedTest @MethodSource("serRefScenarios") public void serializeAndCompareToReferenceTest(Runnable aScenario) throws Exception { + assumeNotKnownToFail(aScenario, // + ".*casWithSofaDataArray", + "XCAS does not suport SofA data arrays during deserialiaztion"); + aScenario.run(); } diff --git a/uimaj-core/src/test/java/org/apache/uima/cas/serdes/SerDesCasIOTestUtils.java b/uimaj-core/src/test/java/org/apache/uima/cas/serdes/SerDesCasIOTestUtils.java index 717f4500a..dd5a13e30 100644 --- a/uimaj-core/src/test/java/org/apache/uima/cas/serdes/SerDesCasIOTestUtils.java +++ b/uimaj-core/src/test/java/org/apache/uima/cas/serdes/SerDesCasIOTestUtils.java @@ -86,7 +86,7 @@ public class SerDesCasIOTestUtils { return ProgrammaticallyCreatedCasDataSuite.builder().build().stream() .map(conf -> SerRefTestScenario.builder(caller, conf, SER_REF, aCasFileName) .withSerializer((cas, path) -> ser(cas, path, aFormat)) // - .build()) + .withAssertion(SerRefTestScenario::assertCasContentsAreEqual).build()) .collect(toList()); } diff --git a/uimaj-core/src/test/java/org/apache/uima/cas/serdes/scenario/SerRefTestScenario.java b/uimaj-core/src/test/java/org/apache/uima/cas/serdes/scenario/SerRefTestScenario.java index ac4039daf..6d9eed47a 100644 --- a/uimaj-core/src/test/java/org/apache/uima/cas/serdes/scenario/SerRefTestScenario.java +++ b/uimaj-core/src/test/java/org/apache/uima/cas/serdes/scenario/SerRefTestScenario.java @@ -18,12 +18,17 @@ */ package org.apache.uima.cas.serdes.scenario; +import static org.apache.uima.cas.serdes.CasToComparableText.toComparableString; +import static org.apache.uima.cas.serdes.SerDesCasIOTestUtils.createCasMaybeWithTypesystem; +import static org.apache.uima.cas.serdes.SerDesCasIOTestUtils.des; import static org.apache.uima.cas.serdes.SerDesCasIOTestUtils.writeTypeSystemDescription; import static org.apache.uima.cas.serdes.SerDesCasIOTestUtils.writeXmi; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.contentOf; +import static org.assertj.core.api.Assertions.fail; import static org.assertj.core.api.Assumptions.assumeThat; +import java.io.IOException; import java.nio.file.Path; import java.nio.file.Paths; @@ -32,6 +37,9 @@ import org.apache.commons.lang3.function.FailableSupplier; import org.apache.uima.cas.CAS; import org.apache.uima.cas.serdes.TestType; import org.apache.uima.cas.serdes.transitions.CasSourceTargetConfiguration; +import org.apache.uima.resource.ResourceInitializationException; +import org.apache.uima.util.CasLoadMode; +import org.apache.uima.util.InvalidXMLException; import org.assertj.core.internal.Failures; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -43,6 +51,7 @@ public class SerRefTestScenario implements Runnable { private final Path referenceCasFile; private final Path targetCasFile; private final FailableBiConsumer<CAS, Path, ?> serializer; + private final FailableBiConsumer<Path, Path, ?> assertion; private SerRefTestScenario(Builder builder) { this.title = builder.title; @@ -50,16 +59,7 @@ public class SerRefTestScenario implements Runnable { this.referenceCasFile = builder.referenceCasFile; this.targetCasFile = builder.targetCasFile; this.serializer = builder.serializer; - } - - public SerRefTestScenario(Path aReferenceBasePath, Path aTargetBasePath, - CasSourceTargetConfiguration aSourceTargetConfiguration, String aTargetFileName, - FailableBiConsumer<CAS, Path, ?> aSerializer) { - title = aSourceTargetConfiguration.getTitle(); - sourceCasSupplier = aSourceTargetConfiguration::createSourceCas; - referenceCasFile = aReferenceBasePath.resolve(title).resolve(aTargetFileName); - targetCasFile = aTargetBasePath.resolve(title).resolve(aTargetFileName); - serializer = aSerializer; + this.assertion = builder.assertion; } public CAS createSourceCas() { @@ -102,8 +102,14 @@ public class SerRefTestScenario implements Runnable { assumeThat(referenceCasFile.toFile()) // .as("Reference file must exists at %s", referenceCasFile) // .exists(); - assertThat(contentOf(targetCasFile.toFile())) // - .isEqualToNormalizingNewlines(contentOf(referenceCasFile.toFile())); + + try { + assertion.accept(targetCasFile, referenceCasFile); + } catch (RuntimeException | Error e) { + throw e; + } catch (Throwable e) { + fail("Unable to apply assertion", e); + } } private void serialize(CAS aSourceCas, Path aTargetCasFile) { @@ -121,6 +127,21 @@ public class SerRefTestScenario implements Runnable { return Paths.get("src", "test", "resources", aTestClass.getSimpleName(), "ser-ref"); } + public static void assertFileContentsAreEqualNormalizingNewlines(Path aTargetCasFile, + Path aReferenceCasFile) { + assertThat(contentOf(aTargetCasFile.toFile())) // + .isEqualToNormalizingNewlines(contentOf(aReferenceCasFile.toFile())); + } + + public static void assertCasContentsAreEqual(Path aTargetCasFile, Path aReferenceCasFile) + throws ResourceInitializationException, InvalidXMLException, IOException { + CAS targetCas = createCasMaybeWithTypesystem(aReferenceCasFile); + CAS referenceCas = createCasMaybeWithTypesystem(aReferenceCasFile); + des(targetCas, aTargetCasFile, CasLoadMode.DEFAULT); + des(referenceCas, aReferenceCasFile, CasLoadMode.DEFAULT); + assertThat(toComparableString(targetCas)).isEqualTo(toComparableString(referenceCas)); + } + /** * Creates builder to build {@link SerRefTestScenario}. * @@ -153,8 +174,11 @@ public class SerRefTestScenario implements Runnable { private Path referenceCasFile; private Path targetCasFile; private FailableBiConsumer<CAS, Path, ?> serializer; + private FailableBiConsumer<Path, Path, ?> assertion; private Builder() { + // Compare the serialized CAS file against the reference + assertion = SerRefTestScenario::assertFileContentsAreEqualNormalizingNewlines; } public Builder withTitle(String title) { @@ -182,6 +206,11 @@ public class SerRefTestScenario implements Runnable { return this; } + public Builder withAssertion(FailableBiConsumer<Path, Path, ?> aAssertion) { + this.assertion = aAssertion; + return this; + } + public SerRefTestScenario build() { return new SerRefTestScenario(this); }
