diff --git a/sdks/java/extensions/avro/build.gradle b/sdks/java/extensions/avro/build.gradle index e3afb5ff52e4..6b24bf693dfb 100644 --- a/sdks/java/extensions/avro/build.gradle +++ b/sdks/java/extensions/avro/build.gradle @@ -40,6 +40,7 @@ def avroVersions = [ '182' : "1.8.2", '192' : "1.9.2", '1102': "1.10.2", + '1120': "1.12.0", ] avroVersions.each { k, v -> diff --git a/sdks/java/extensions/avro/src/test/java/org/apache/beam/sdk/extensions/avro/schemas/utils/AvroUtilsTest.java b/sdks/java/extensions/avro/src/test/java/org/apache/beam/sdk/extensions/avro/schemas/utils/AvroUtilsTest.java index 57da8e77bb1b..282158bec03d 100644 --- a/sdks/java/extensions/avro/src/test/java/org/apache/beam/sdk/extensions/avro/schemas/utils/AvroUtilsTest.java +++ b/sdks/java/extensions/avro/src/test/java/org/apache/beam/sdk/extensions/avro/schemas/utils/AvroUtilsTest.java @@ -21,6 +21,7 @@ import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; +import com.fasterxml.jackson.databind.ObjectMapper; import com.pholser.junit.quickcheck.From; import com.pholser.junit.quickcheck.Property; import com.pholser.junit.quickcheck.runner.JUnitQuickcheck; @@ -284,10 +285,20 @@ public void avroToBeamRoundTrip( Iterable iterable = randomData(avroSchema, 10); List records = Lists.newArrayList((Iterable) iterable); + // AVRO-4139: GenericRecord.equals() throws "Can't compare maps!" for records with + // nested map types on Avro 1.12.0. Fall back to JSON tree comparison on that version + // only; keep direct equals for other versions. + boolean useJsonCompare = "1.12.0".equals(VERSION_AVRO); + ObjectMapper mapper = useJsonCompare ? new ObjectMapper() : null; + for (GenericRecord record : records) { Row row = AvroUtils.toBeamRowStrict(record, schema); GenericRecord out = AvroUtils.toGenericRecord(row, avroSchema); - assertEquals(record, out); + if (useJsonCompare) { + assertEquals(mapper.readTree(record.toString()), mapper.readTree(out.toString())); + } else { + assertEquals(record, out); + } } }