From c5ea184962a4ef1845d1189114ad463e19107368 Mon Sep 17 00:00:00 2001 From: Chris Jordan Date: Wed, 8 Apr 2026 15:23:07 -0400 Subject: [PATCH 01/15] Add Avro version 1.12.0 to build.gradle --- sdks/java/extensions/avro/build.gradle | 1 + 1 file changed, 1 insertion(+) 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 -> From c63806e7675b11942a699a17a620d9ae4e28fdad Mon Sep 17 00:00:00 2001 From: Chris Jordan Date: Wed, 8 Apr 2026 15:44:37 -0400 Subject: [PATCH 02/15] Update AvroUtilsTest.java --- .../sdk/extensions/avro/schemas/utils/AvroUtilsTest.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) 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..dc5b4161a5b2 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,13 @@ public void avroToBeamRoundTrip( Iterable iterable = randomData(avroSchema, 10); List records = Lists.newArrayList((Iterable) iterable); + // Use JSON tree comparison to avoid Avro 1.12.0 GenericRecord.equals() throwing + // "Can't compare maps!" for records with nested map types (AVRO-4222) + ObjectMapper mapper = new ObjectMapper(); for (GenericRecord record : records) { Row row = AvroUtils.toBeamRowStrict(record, schema); GenericRecord out = AvroUtils.toGenericRecord(row, avroSchema); - assertEquals(record, out); + assertEquals(mapper.readTree(record.toString()), mapper.readTree(out.toString())); } } From 067969a8e318b383495e59325fc87a18e76aff0a Mon Sep 17 00:00:00 2001 From: Chris Jordan Date: Wed, 8 Apr 2026 15:50:59 -0400 Subject: [PATCH 03/15] Update AvroUtilsTest.java --- .../beam/sdk/extensions/avro/schemas/utils/AvroUtilsTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 dc5b4161a5b2..c7451719aa03 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 @@ -286,7 +286,7 @@ public void avroToBeamRoundTrip( List records = Lists.newArrayList((Iterable) iterable); // Use JSON tree comparison to avoid Avro 1.12.0 GenericRecord.equals() throwing - // "Can't compare maps!" for records with nested map types (AVRO-4222) + // "Can't compare maps!" for records with nested map types ObjectMapper mapper = new ObjectMapper(); for (GenericRecord record : records) { Row row = AvroUtils.toBeamRowStrict(record, schema); From efdc40a88ba0ddaaaaa1bd00cb526fe18b22455e Mon Sep 17 00:00:00 2001 From: Chris Jordan Date: Wed, 8 Apr 2026 16:17:14 -0400 Subject: [PATCH 04/15] Updating to Avro 1.12.1 --- sdks/java/extensions/avro/build.gradle | 2 +- .../sdk/extensions/avro/schemas/utils/AvroUtilsTest.java | 6 +----- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/sdks/java/extensions/avro/build.gradle b/sdks/java/extensions/avro/build.gradle index 6b24bf693dfb..f788482e9acb 100644 --- a/sdks/java/extensions/avro/build.gradle +++ b/sdks/java/extensions/avro/build.gradle @@ -40,7 +40,7 @@ def avroVersions = [ '182' : "1.8.2", '192' : "1.9.2", '1102': "1.10.2", - '1120': "1.12.0", + '1121': "1.12.1", ] 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 c7451719aa03..57da8e77bb1b 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,7 +21,6 @@ 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; @@ -285,13 +284,10 @@ public void avroToBeamRoundTrip( Iterable iterable = randomData(avroSchema, 10); List records = Lists.newArrayList((Iterable) iterable); - // Use JSON tree comparison to avoid Avro 1.12.0 GenericRecord.equals() throwing - // "Can't compare maps!" for records with nested map types - ObjectMapper mapper = new ObjectMapper(); for (GenericRecord record : records) { Row row = AvroUtils.toBeamRowStrict(record, schema); GenericRecord out = AvroUtils.toGenericRecord(row, avroSchema); - assertEquals(mapper.readTree(record.toString()), mapper.readTree(out.toString())); + assertEquals(record, out); } } From fefe4974020c68fb09a156dc4c5326ff4ae5468c Mon Sep 17 00:00:00 2001 From: Chris Jordan Date: Wed, 8 Apr 2026 16:29:07 -0400 Subject: [PATCH 05/15] Revert "Updating to Avro 1.12.1" This reverts commit efdc40a88ba0ddaaaaa1bd00cb526fe18b22455e. --- sdks/java/extensions/avro/build.gradle | 2 +- .../sdk/extensions/avro/schemas/utils/AvroUtilsTest.java | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/sdks/java/extensions/avro/build.gradle b/sdks/java/extensions/avro/build.gradle index f788482e9acb..6b24bf693dfb 100644 --- a/sdks/java/extensions/avro/build.gradle +++ b/sdks/java/extensions/avro/build.gradle @@ -40,7 +40,7 @@ def avroVersions = [ '182' : "1.8.2", '192' : "1.9.2", '1102': "1.10.2", - '1121': "1.12.1", + '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..c7451719aa03 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,13 @@ public void avroToBeamRoundTrip( Iterable iterable = randomData(avroSchema, 10); List records = Lists.newArrayList((Iterable) iterable); + // Use JSON tree comparison to avoid Avro 1.12.0 GenericRecord.equals() throwing + // "Can't compare maps!" for records with nested map types + ObjectMapper mapper = new ObjectMapper(); for (GenericRecord record : records) { Row row = AvroUtils.toBeamRowStrict(record, schema); GenericRecord out = AvroUtils.toGenericRecord(row, avroSchema); - assertEquals(record, out); + assertEquals(mapper.readTree(record.toString()), mapper.readTree(out.toString())); } } From 8da54c3125cb034f34edbe8baa6b5b155511c513 Mon Sep 17 00:00:00 2001 From: Chris Jordan Date: Wed, 8 Apr 2026 16:42:15 -0400 Subject: [PATCH 06/15] Update AvroUtilsTest.java --- .../beam/sdk/extensions/avro/schemas/utils/AvroUtilsTest.java | 1 + 1 file changed, 1 insertion(+) 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 c7451719aa03..99e4c2d667eb 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 @@ -287,6 +287,7 @@ public void avroToBeamRoundTrip( // Use JSON tree comparison to avoid Avro 1.12.0 GenericRecord.equals() throwing // "Can't compare maps!" for records with nested map types + // (https://issues.apache.org/jira/browse/AVRO-4139, fixed in 1.12.1) ObjectMapper mapper = new ObjectMapper(); for (GenericRecord record : records) { Row row = AvroUtils.toBeamRowStrict(record, schema); From 70dff9aa274c5589eadd1dd8619ed7fff9d17bf4 Mon Sep 17 00:00:00 2001 From: Chris Jordan Date: Wed, 8 Apr 2026 16:42:42 -0400 Subject: [PATCH 07/15] Update AvroUtilsTest.java --- .../beam/sdk/extensions/avro/schemas/utils/AvroUtilsTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 99e4c2d667eb..9e2be047f010 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 @@ -287,7 +287,7 @@ public void avroToBeamRoundTrip( // Use JSON tree comparison to avoid Avro 1.12.0 GenericRecord.equals() throwing // "Can't compare maps!" for records with nested map types - // (https://issues.apache.org/jira/browse/AVRO-4139, fixed in 1.12.1) + // (see AVRO-4139) ObjectMapper mapper = new ObjectMapper(); for (GenericRecord record : records) { Row row = AvroUtils.toBeamRowStrict(record, schema); From 869edde2f4edc722f5555195e47d395085664f83 Mon Sep 17 00:00:00 2001 From: Chris Jordan Date: Wed, 8 Apr 2026 22:37:13 -0400 Subject: [PATCH 08/15] retrigger CI From 89da936fc3994a5377764846df70777d9075523b Mon Sep 17 00:00:00 2001 From: Chris Jordan Date: Thu, 9 Apr 2026 07:47:06 -0400 Subject: [PATCH 09/15] retrigger CI From 32df001d3b418d3b05aab2c48a5d1aa8397082b3 Mon Sep 17 00:00:00 2001 From: Chris Jordan Date: Thu, 16 Apr 2026 17:02:21 -0400 Subject: [PATCH 10/15] Updates --- sdks/java/extensions/avro/build.gradle | 10 ++++++++-- .../extensions/avro/schemas/utils/AvroUtilsTest.java | 7 +------ 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/sdks/java/extensions/avro/build.gradle b/sdks/java/extensions/avro/build.gradle index 6b24bf693dfb..360d34d82f75 100644 --- a/sdks/java/extensions/avro/build.gradle +++ b/sdks/java/extensions/avro/build.gradle @@ -40,7 +40,7 @@ def avroVersions = [ '182' : "1.8.2", '192' : "1.9.2", '1102': "1.10.2", - '1120': "1.12.0", + '1121': "1.12.1", ] avroVersions.each { k, v -> @@ -91,7 +91,13 @@ dependencies { "avroVersion$k" "com.esotericsoftware:kryo:5.6.2" // Used by Avro coder test "avroVersion$k" library.java.zstd_jni // marked as optional in avro "avroVersion$k" "org.apache.avro:avro:$v:tests" - "avroVersion${k}Generate" "org.apache.avro:avro-tools:$v" + "avroVersion${k}Generate"("org.apache.avro:avro-tools:$v") { + // Avro 1.12.1's avro-tools POM references trevni-*:tests jars that were + // never published to Maven Central. trevni isn't used by the 'compile' + // tool we invoke, so excluding it is safe. + exclude group: "org.apache.avro", module: "trevni-core" + exclude group: "org.apache.avro", module: "trevni-avro" + } } } 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 9e2be047f010..57da8e77bb1b 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,7 +21,6 @@ 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; @@ -285,14 +284,10 @@ public void avroToBeamRoundTrip( Iterable iterable = randomData(avroSchema, 10); List records = Lists.newArrayList((Iterable) iterable); - // Use JSON tree comparison to avoid Avro 1.12.0 GenericRecord.equals() throwing - // "Can't compare maps!" for records with nested map types - // (see AVRO-4139) - ObjectMapper mapper = new ObjectMapper(); for (GenericRecord record : records) { Row row = AvroUtils.toBeamRowStrict(record, schema); GenericRecord out = AvroUtils.toGenericRecord(row, avroSchema); - assertEquals(mapper.readTree(record.toString()), mapper.readTree(out.toString())); + assertEquals(record, out); } } From 1721dcde47a81c973f00890eeaf6da54c107a7c9 Mon Sep 17 00:00:00 2001 From: Chris Jordan Date: Thu, 16 Apr 2026 20:06:37 -0400 Subject: [PATCH 11/15] Update build.gradle --- sdks/java/extensions/avro/build.gradle | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/sdks/java/extensions/avro/build.gradle b/sdks/java/extensions/avro/build.gradle index 360d34d82f75..2d9c68ffa650 100644 --- a/sdks/java/extensions/avro/build.gradle +++ b/sdks/java/extensions/avro/build.gradle @@ -43,9 +43,16 @@ def avroVersions = [ '1121': "1.12.1", ] +// Versions that didn't publish an -tests.jar to Maven Central; fall back to a +// nearby version whose tests jar does exist. +def avroTestsVersionOverride = [ + '1121': "1.12.0", +] + avroVersions.each { k, v -> configurations { create("avroVersion$k").extendsFrom(implementation) + create("avroVersion${k}Tests") create("avroVersion${k}Generate") } } @@ -90,7 +97,7 @@ dependencies { "avroVersion$k" "org.tukaani:xz:1.9" // marked as optional in avro "avroVersion$k" "com.esotericsoftware:kryo:5.6.2" // Used by Avro coder test "avroVersion$k" library.java.zstd_jni // marked as optional in avro - "avroVersion$k" "org.apache.avro:avro:$v:tests" + "avroVersion${k}Tests" "org.apache.avro:avro:${avroTestsVersionOverride[k] ?: v}:tests" "avroVersion${k}Generate"("org.apache.avro:avro-tools:$v") { // Avro 1.12.1's avro-tools POM references trevni-*:tests jars that were // never published to Maven Central. trevni isn't used by the 'compile' @@ -103,7 +110,13 @@ dependencies { avroVersions.each { k, v -> configurations."avroVersion$k" { - resolutionStrategy.force "org.apache.avro:avro:$v", "org.apache.avro:avro:$v:tests" + resolutionStrategy.force "org.apache.avro:avro:$v" + } + configurations."avroVersion${k}Tests" { + // Override the global library.java.avro force so we can pull the tests + // classifier from a nearby version when the current version didn't + // publish a -tests.jar. + resolutionStrategy.force "org.apache.avro:avro:${avroTestsVersionOverride[k] ?: v}" } sourceSets { @@ -114,8 +127,8 @@ avroVersions.each { k, v -> // only use compileClasspath on purpose to not include generated test files // will recompile with the proper generated sources - compileClasspath += sourceSets.main.output + configurations."avroVersion$k" - runtimeClasspath += sourceSets.main.output + configurations."avroVersion$k" + compileClasspath += sourceSets.main.output + configurations."avroVersion$k" + configurations."avroVersion${k}Tests" + runtimeClasspath += sourceSets.main.output + configurations."avroVersion$k" + configurations."avroVersion${k}Tests" } } From 146d86926b4175fb4cabceca2afd1fd16393cc03 Mon Sep 17 00:00:00 2001 From: Chris Jordan Date: Fri, 17 Apr 2026 07:35:12 -0400 Subject: [PATCH 12/15] Revert "Update build.gradle" This reverts commit 1721dcde47a81c973f00890eeaf6da54c107a7c9. --- sdks/java/extensions/avro/build.gradle | 21 ++++----------------- 1 file changed, 4 insertions(+), 17 deletions(-) diff --git a/sdks/java/extensions/avro/build.gradle b/sdks/java/extensions/avro/build.gradle index 2d9c68ffa650..360d34d82f75 100644 --- a/sdks/java/extensions/avro/build.gradle +++ b/sdks/java/extensions/avro/build.gradle @@ -43,16 +43,9 @@ def avroVersions = [ '1121': "1.12.1", ] -// Versions that didn't publish an -tests.jar to Maven Central; fall back to a -// nearby version whose tests jar does exist. -def avroTestsVersionOverride = [ - '1121': "1.12.0", -] - avroVersions.each { k, v -> configurations { create("avroVersion$k").extendsFrom(implementation) - create("avroVersion${k}Tests") create("avroVersion${k}Generate") } } @@ -97,7 +90,7 @@ dependencies { "avroVersion$k" "org.tukaani:xz:1.9" // marked as optional in avro "avroVersion$k" "com.esotericsoftware:kryo:5.6.2" // Used by Avro coder test "avroVersion$k" library.java.zstd_jni // marked as optional in avro - "avroVersion${k}Tests" "org.apache.avro:avro:${avroTestsVersionOverride[k] ?: v}:tests" + "avroVersion$k" "org.apache.avro:avro:$v:tests" "avroVersion${k}Generate"("org.apache.avro:avro-tools:$v") { // Avro 1.12.1's avro-tools POM references trevni-*:tests jars that were // never published to Maven Central. trevni isn't used by the 'compile' @@ -110,13 +103,7 @@ dependencies { avroVersions.each { k, v -> configurations."avroVersion$k" { - resolutionStrategy.force "org.apache.avro:avro:$v" - } - configurations."avroVersion${k}Tests" { - // Override the global library.java.avro force so we can pull the tests - // classifier from a nearby version when the current version didn't - // publish a -tests.jar. - resolutionStrategy.force "org.apache.avro:avro:${avroTestsVersionOverride[k] ?: v}" + resolutionStrategy.force "org.apache.avro:avro:$v", "org.apache.avro:avro:$v:tests" } sourceSets { @@ -127,8 +114,8 @@ avroVersions.each { k, v -> // only use compileClasspath on purpose to not include generated test files // will recompile with the proper generated sources - compileClasspath += sourceSets.main.output + configurations."avroVersion$k" + configurations."avroVersion${k}Tests" - runtimeClasspath += sourceSets.main.output + configurations."avroVersion$k" + configurations."avroVersion${k}Tests" + compileClasspath += sourceSets.main.output + configurations."avroVersion$k" + runtimeClasspath += sourceSets.main.output + configurations."avroVersion$k" } } From 23318c96e2d15287c1f0bf022ed8f2821e3e2402 Mon Sep 17 00:00:00 2001 From: Chris Jordan Date: Fri, 17 Apr 2026 07:35:12 -0400 Subject: [PATCH 13/15] Revert "Updates" This reverts commit 32df001d3b418d3b05aab2c48a5d1aa8397082b3. --- sdks/java/extensions/avro/build.gradle | 10 ++-------- .../extensions/avro/schemas/utils/AvroUtilsTest.java | 7 ++++++- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/sdks/java/extensions/avro/build.gradle b/sdks/java/extensions/avro/build.gradle index 360d34d82f75..6b24bf693dfb 100644 --- a/sdks/java/extensions/avro/build.gradle +++ b/sdks/java/extensions/avro/build.gradle @@ -40,7 +40,7 @@ def avroVersions = [ '182' : "1.8.2", '192' : "1.9.2", '1102': "1.10.2", - '1121': "1.12.1", + '1120': "1.12.0", ] avroVersions.each { k, v -> @@ -91,13 +91,7 @@ dependencies { "avroVersion$k" "com.esotericsoftware:kryo:5.6.2" // Used by Avro coder test "avroVersion$k" library.java.zstd_jni // marked as optional in avro "avroVersion$k" "org.apache.avro:avro:$v:tests" - "avroVersion${k}Generate"("org.apache.avro:avro-tools:$v") { - // Avro 1.12.1's avro-tools POM references trevni-*:tests jars that were - // never published to Maven Central. trevni isn't used by the 'compile' - // tool we invoke, so excluding it is safe. - exclude group: "org.apache.avro", module: "trevni-core" - exclude group: "org.apache.avro", module: "trevni-avro" - } + "avroVersion${k}Generate" "org.apache.avro:avro-tools:$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..9e2be047f010 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,14 @@ public void avroToBeamRoundTrip( Iterable iterable = randomData(avroSchema, 10); List records = Lists.newArrayList((Iterable) iterable); + // Use JSON tree comparison to avoid Avro 1.12.0 GenericRecord.equals() throwing + // "Can't compare maps!" for records with nested map types + // (see AVRO-4139) + ObjectMapper mapper = new ObjectMapper(); for (GenericRecord record : records) { Row row = AvroUtils.toBeamRowStrict(record, schema); GenericRecord out = AvroUtils.toGenericRecord(row, avroSchema); - assertEquals(record, out); + assertEquals(mapper.readTree(record.toString()), mapper.readTree(out.toString())); } } From cadfd2549fe263e2bfe5f12eff67a5f6998c119e Mon Sep 17 00:00:00 2001 From: Chris Jordan Date: Fri, 17 Apr 2026 07:39:35 -0400 Subject: [PATCH 14/15] Update AvroUtilsTest.java --- .../avro/schemas/utils/AvroUtilsTest.java | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) 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 9e2be047f010..cf8fd049f098 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 @@ -285,14 +285,21 @@ public void avroToBeamRoundTrip( Iterable iterable = randomData(avroSchema, 10); List records = Lists.newArrayList((Iterable) iterable); - // Use JSON tree comparison to avoid Avro 1.12.0 GenericRecord.equals() throwing - // "Can't compare maps!" for records with nested map types - // (see AVRO-4139) - ObjectMapper mapper = new ObjectMapper(); + // 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. + String avroVersion = org.apache.avro.Schema.class.getPackage().getImplementationVersion(); + boolean useJsonCompare = "1.12.0".equals(avroVersion); + ObjectMapper mapper = useJsonCompare ? new ObjectMapper() : null; + for (GenericRecord record : records) { Row row = AvroUtils.toBeamRowStrict(record, schema); GenericRecord out = AvroUtils.toGenericRecord(row, avroSchema); - assertEquals(mapper.readTree(record.toString()), mapper.readTree(out.toString())); + if (useJsonCompare) { + assertEquals(mapper.readTree(record.toString()), mapper.readTree(out.toString())); + } else { + assertEquals(record, out); + } } } From 321e66a42314b31c1925a448a830240a51d59fce Mon Sep 17 00:00:00 2001 From: Chris Jordan Date: Thu, 30 Apr 2026 09:34:29 -0400 Subject: [PATCH 15/15] Update sdks/java/extensions/avro/src/test/java/org/apache/beam/sdk/extensions/avro/schemas/utils/AvroUtilsTest.java Co-authored-by: Claire McGinty --- .../beam/sdk/extensions/avro/schemas/utils/AvroUtilsTest.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) 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 cf8fd049f098..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 @@ -288,8 +288,7 @@ public void avroToBeamRoundTrip( // 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. - String avroVersion = org.apache.avro.Schema.class.getPackage().getImplementationVersion(); - boolean useJsonCompare = "1.12.0".equals(avroVersion); + boolean useJsonCompare = "1.12.0".equals(VERSION_AVRO); ObjectMapper mapper = useJsonCompare ? new ObjectMapper() : null; for (GenericRecord record : records) {