This is an automated email from the ASF dual-hosted git repository.

technoboy pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/pulsar.git


The following commit(s) were added to refs/heads/master by this push:
     new 6c67e7985f4 [fix][test] Fixed nondeterministic JSON ordering in 
multiple tests (#24821)
6c67e7985f4 is described below

commit 6c67e7985f405d405f69f3668785e6ff6f02af65
Author: Lucas Eby <[email protected]>
AuthorDate: Thu Oct 9 02:08:55 2025 -0500

    [fix][test] Fixed nondeterministic JSON ordering in multiple tests (#24821)
---
 pulsar-common/pom.xml                              |  7 +++++
 .../data/NamespaceOwnershipStatusTest.java         |  8 ++++-
 .../impl/NamespaceIsolationPoliciesTest.java       |  8 ++++-
 pulsar-functions/utils/pom.xml                     |  7 +++++
 .../functions/utils/FunctionConfigUtilsTest.java   | 10 +++++--
 .../functions/utils/SinkConfigUtilsTest.java       | 22 +++++++++-----
 .../functions/utils/SourceConfigUtilsTest.java     | 10 +++++--
 pulsar-io/elastic-search/pom.xml                   |  7 +++++
 .../io/elasticsearch/ElasticSearchExtractTest.java | 35 +++++++++++++++++-----
 pulsar-io/kinesis/pom.xml                          |  7 +++++
 .../org/apache/pulsar/io/kinesis/UtilsTest.java    | 20 +++++++++----
 11 files changed, 113 insertions(+), 28 deletions(-)

diff --git a/pulsar-common/pom.xml b/pulsar-common/pom.xml
index ea31f9bc3ed..2d308d4525d 100644
--- a/pulsar-common/pom.xml
+++ b/pulsar-common/pom.xml
@@ -282,6 +282,13 @@
       <artifactId>awaitility</artifactId>
       <scope>test</scope>
     </dependency>
+
+    <dependency>
+      <groupId>org.skyscreamer</groupId>
+      <artifactId>jsonassert</artifactId>
+      <version>${skyscreamer.version}</version>
+      <scope>test</scope>
+    </dependency>
   </dependencies>
 
   <build>
diff --git 
a/pulsar-common/src/test/java/org/apache/pulsar/common/policies/data/NamespaceOwnershipStatusTest.java
 
b/pulsar-common/src/test/java/org/apache/pulsar/common/policies/data/NamespaceOwnershipStatusTest.java
index 710427c9817..66ae0c2871f 100644
--- 
a/pulsar-common/src/test/java/org/apache/pulsar/common/policies/data/NamespaceOwnershipStatusTest.java
+++ 
b/pulsar-common/src/test/java/org/apache/pulsar/common/policies/data/NamespaceOwnershipStatusTest.java
@@ -25,6 +25,8 @@ import com.fasterxml.jackson.core.type.TypeReference;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import java.util.Map;
 import org.apache.pulsar.common.util.ObjectMapperFactory;
+import org.skyscreamer.jsonassert.JSONAssert;
+import org.skyscreamer.jsonassert.JSONCompareMode;
 import org.testng.annotations.Test;
 
 public class NamespaceOwnershipStatusTest {
@@ -55,6 +57,10 @@ public class NamespaceOwnershipStatusTest {
                 assertTrue(nsStatus.is_active);
             }
         }
-        assertEquals(jsonMapper.writeValueAsString(nsMap), jsonStr);
+        JSONAssert.assertEquals(
+                jsonMapper.writeValueAsString(nsMap),
+                jsonStr,
+                JSONCompareMode.STRICT
+        );
     }
 }
diff --git 
a/pulsar-common/src/test/java/org/apache/pulsar/common/policies/impl/NamespaceIsolationPoliciesTest.java
 
b/pulsar-common/src/test/java/org/apache/pulsar/common/policies/impl/NamespaceIsolationPoliciesTest.java
index 9a3707b011c..e2f187d24a4 100644
--- 
a/pulsar-common/src/test/java/org/apache/pulsar/common/policies/impl/NamespaceIsolationPoliciesTest.java
+++ 
b/pulsar-common/src/test/java/org/apache/pulsar/common/policies/impl/NamespaceIsolationPoliciesTest.java
@@ -40,6 +40,8 @@ import org.apache.pulsar.common.policies.data.BrokerStatus;
 import org.apache.pulsar.common.policies.data.NamespaceIsolationData;
 import org.apache.pulsar.common.policies.data.NamespaceIsolationDataImpl;
 import org.apache.pulsar.common.util.ObjectMapperFactory;
+import org.skyscreamer.jsonassert.JSONAssert;
+import org.skyscreamer.jsonassert.JSONCompareMode;
 import org.testng.annotations.Test;
 
 public class NamespaceIsolationPoliciesTest {
@@ -67,7 +69,11 @@ public class NamespaceIsolationPoliciesTest {
         assertEquals(new String(secondaryBrokersJson), 
"[\"prod1-broker.*.use.example.com\"]");
 
         byte[] outJson = 
jsonMapperForWriter.writeValueAsBytes(policies.getPolicies());
-        assertEquals(new String(outJson), this.defaultJson);
+        JSONAssert.assertEquals(
+                new String(outJson),
+                this.defaultJson,
+                JSONCompareMode.STRICT
+        );
 
         Map<String, String> parameters = new HashMap<>();
         parameters.put("min_limit", "1");
diff --git a/pulsar-functions/utils/pom.xml b/pulsar-functions/utils/pom.xml
index 8eeea8d9905..868ce39fc28 100644
--- a/pulsar-functions/utils/pom.xml
+++ b/pulsar-functions/utils/pom.xml
@@ -123,6 +123,13 @@
       <scope>test</scope>
     </dependency>
 
+    <dependency>
+      <groupId>org.skyscreamer</groupId>
+      <artifactId>jsonassert</artifactId>
+      <version>${skyscreamer.version}</version>
+      <scope>test</scope>
+    </dependency>
+
   </dependencies>
   <build>
     <plugins>
diff --git 
a/pulsar-functions/utils/src/test/java/org/apache/pulsar/functions/utils/FunctionConfigUtilsTest.java
 
b/pulsar-functions/utils/src/test/java/org/apache/pulsar/functions/utils/FunctionConfigUtilsTest.java
index 4679553da38..fac6153a125 100644
--- 
a/pulsar-functions/utils/src/test/java/org/apache/pulsar/functions/utils/FunctionConfigUtilsTest.java
+++ 
b/pulsar-functions/utils/src/test/java/org/apache/pulsar/functions/utils/FunctionConfigUtilsTest.java
@@ -52,6 +52,9 @@ import org.apache.pulsar.functions.api.WindowFunction;
 import org.apache.pulsar.functions.api.utils.IdentityFunction;
 import org.apache.pulsar.functions.proto.Function;
 import org.apache.pulsar.functions.proto.Function.FunctionDetails;
+import org.json.JSONException;
+import org.skyscreamer.jsonassert.JSONAssert;
+import org.skyscreamer.jsonassert.JSONCompareMode;
 import org.testng.annotations.Test;
 
 /**
@@ -83,7 +86,7 @@ public class FunctionConfigUtilsTest {
     }
 
     @Test
-    public void testConvertBackFidelity() {
+    public void testConvertBackFidelity() throws JSONException {
         FunctionConfig functionConfig = new FunctionConfig();
         functionConfig.setTenant("test-tenant");
         functionConfig.setNamespace("test-namespace");
@@ -121,9 +124,10 @@ public class FunctionConfigUtilsTest {
         functionConfig.setResources(Resources.getDefaultResources());
         // set default cleanupSubscription config
         functionConfig.setCleanupSubscription(true);
-        assertEquals(
+        JSONAssert.assertEquals(
                 new Gson().toJson(functionConfig),
-                new Gson().toJson(convertedConfig)
+                new Gson().toJson(convertedConfig),
+                JSONCompareMode.STRICT
         );
     }
 
diff --git 
a/pulsar-functions/utils/src/test/java/org/apache/pulsar/functions/utils/SinkConfigUtilsTest.java
 
b/pulsar-functions/utils/src/test/java/org/apache/pulsar/functions/utils/SinkConfigUtilsTest.java
index 412471e0fe6..586e51b5672 100644
--- 
a/pulsar-functions/utils/src/test/java/org/apache/pulsar/functions/utils/SinkConfigUtilsTest.java
+++ 
b/pulsar-functions/utils/src/test/java/org/apache/pulsar/functions/utils/SinkConfigUtilsTest.java
@@ -49,6 +49,9 @@ import org.apache.pulsar.functions.api.Record;
 import org.apache.pulsar.functions.proto.Function;
 import org.apache.pulsar.io.core.Sink;
 import org.apache.pulsar.io.core.SinkContext;
+import org.json.JSONException;
+import org.skyscreamer.jsonassert.JSONAssert;
+import org.skyscreamer.jsonassert.JSONCompareMode;
 import org.testng.annotations.Test;
 
 /**
@@ -99,7 +102,7 @@ public class SinkConfigUtilsTest {
     }
 
     @Test
-    public void testConvertBackFidelity() throws IOException  {
+    public void testConvertBackFidelity() throws IOException, JSONException  {
         SinkConfig sinkConfig = new SinkConfig();
         sinkConfig.setTenant("test-tenant");
         sinkConfig.setNamespace("test-namespace");
@@ -143,9 +146,10 @@ public class SinkConfigUtilsTest {
                 new SinkConfigUtils.ExtractedSinkDetails(null, null, null));
         assertEquals(Function.SubscriptionType.SHARED, 
functionDetails.getSource().getSubscriptionType());
         SinkConfig convertedConfig = 
SinkConfigUtils.convertFromDetails(functionDetails);
-        assertEquals(
+        JSONAssert.assertEquals(
                 new Gson().toJson(convertedConfig),
-                new Gson().toJson(sinkConfig)
+                new Gson().toJson(sinkConfig),
+                JSONCompareMode.STRICT
         );
 
         sinkConfig.setRetainOrdering(true);
@@ -155,9 +159,11 @@ public class SinkConfigUtilsTest {
                 new SinkConfigUtils.ExtractedSinkDetails(null, null, null));
         assertEquals(Function.SubscriptionType.FAILOVER, 
functionDetails.getSource().getSubscriptionType());
         convertedConfig = SinkConfigUtils.convertFromDetails(functionDetails);
-        assertEquals(
+        JSONAssert.assertEquals(
                 new Gson().toJson(convertedConfig),
-                new Gson().toJson(sinkConfig));
+                new Gson().toJson(sinkConfig),
+                JSONCompareMode.STRICT
+        );
 
         sinkConfig.setRetainOrdering(false);
         sinkConfig.setRetainKeyOrdering(true);
@@ -166,9 +172,11 @@ public class SinkConfigUtilsTest {
                 new SinkConfigUtils.ExtractedSinkDetails(null, null, null));
         assertEquals(Function.SubscriptionType.KEY_SHARED, 
functionDetails.getSource().getSubscriptionType());
         convertedConfig = SinkConfigUtils.convertFromDetails(functionDetails);
-        assertEquals(
+        JSONAssert.assertEquals(
                 new Gson().toJson(convertedConfig),
-                new Gson().toJson(sinkConfig));
+                new Gson().toJson(sinkConfig),
+                JSONCompareMode.STRICT
+        );
     }
 
     @Test
diff --git 
a/pulsar-functions/utils/src/test/java/org/apache/pulsar/functions/utils/SourceConfigUtilsTest.java
 
b/pulsar-functions/utils/src/test/java/org/apache/pulsar/functions/utils/SourceConfigUtilsTest.java
index d779893d6a3..27079af8ab0 100644
--- 
a/pulsar-functions/utils/src/test/java/org/apache/pulsar/functions/utils/SourceConfigUtilsTest.java
+++ 
b/pulsar-functions/utils/src/test/java/org/apache/pulsar/functions/utils/SourceConfigUtilsTest.java
@@ -40,6 +40,9 @@ import 
org.apache.pulsar.config.validation.ConfigValidationAnnotations;
 import org.apache.pulsar.functions.proto.Function;
 import org.apache.pulsar.io.core.BatchSourceTriggerer;
 import org.apache.pulsar.io.core.SourceContext;
+import org.json.JSONException;
+import org.skyscreamer.jsonassert.JSONAssert;
+import org.skyscreamer.jsonassert.JSONCompareMode;
 import org.testng.annotations.Test;
 
 /**
@@ -115,13 +118,14 @@ public class SourceConfigUtilsTest {
     }
 
     @Test
-    public void testBatchConfigMergeEqual() {
+    public void testBatchConfigMergeEqual() throws JSONException {
         SourceConfig sourceConfig = createSourceConfigWithBatch();
         SourceConfig newSourceConfig = createSourceConfigWithBatch();
         SourceConfig mergedConfig = 
SourceConfigUtils.validateUpdate(sourceConfig, newSourceConfig);
-        assertEquals(
+        JSONAssert.assertEquals(
                 new Gson().toJson(sourceConfig),
-                new Gson().toJson(mergedConfig)
+                new Gson().toJson(mergedConfig),
+                JSONCompareMode.STRICT
         );
     }
 
diff --git a/pulsar-io/elastic-search/pom.xml b/pulsar-io/elastic-search/pom.xml
index 4d31e9a9680..b165cc78ef1 100644
--- a/pulsar-io/elastic-search/pom.xml
+++ b/pulsar-io/elastic-search/pom.xml
@@ -105,6 +105,13 @@
       <scope>test</scope>
     </dependency>
 
+    <dependency>
+      <groupId>org.skyscreamer</groupId>
+      <artifactId>jsonassert</artifactId>
+      <version>${skyscreamer.version}</version>
+      <scope>test</scope>
+    </dependency>
+
   </dependencies>
 
   <build>
diff --git 
a/pulsar-io/elastic-search/src/test/java/org/apache/pulsar/io/elasticsearch/ElasticSearchExtractTest.java
 
b/pulsar-io/elastic-search/src/test/java/org/apache/pulsar/io/elasticsearch/ElasticSearchExtractTest.java
index d68be8ea085..c61de481331 100644
--- 
a/pulsar-io/elastic-search/src/test/java/org/apache/pulsar/io/elasticsearch/ElasticSearchExtractTest.java
+++ 
b/pulsar-io/elastic-search/src/test/java/org/apache/pulsar/io/elasticsearch/ElasticSearchExtractTest.java
@@ -33,6 +33,8 @@ import org.apache.pulsar.common.schema.KeyValue;
 import org.apache.pulsar.common.schema.KeyValueEncodingType;
 import org.apache.pulsar.common.schema.SchemaType;
 import org.apache.pulsar.functions.api.Record;
+import org.skyscreamer.jsonassert.JSONAssert;
+import org.skyscreamer.jsonassert.JSONCompareMode;
 import org.testng.annotations.DataProvider;
 import org.testng.annotations.Test;
 
@@ -99,8 +101,12 @@ public class ElasticSearchExtractTest {
                 "keyIgnore", "true"), null);
         Pair<String, String> pair = 
elasticSearchSink.extractIdAndDocument(genericObjectRecord);
         assertEquals(pair.getLeft(), "1");
-        assertEquals(pair.getRight(), 
"{\"c\":\"1\",\"d\":1,\"e\":{\"a\":\"a\",\"b\":true,\"d\":1.0,"
-                + "\"f\":1.0,\"i\":1,\"l\":10}}");
+        JSONAssert.assertEquals(
+                pair.getRight(),
+                "{\"c\":\"1\",\"d\":1,\"e\":{\"a\":\"a\",\"b\":true,\"d\":1.0,"
+                + "\"f\":1.0,\"i\":1,\"l\":10}}",
+                JSONCompareMode.STRICT
+        );
         elasticSearchSink.close();
 
         // two fields PK
@@ -112,9 +118,20 @@ public class ElasticSearchExtractTest {
                 "schemaEnable", "true",
                 "keyIgnore", "true"), null);
         Pair<String, String> pair2 = 
elasticSearchSink2.extractIdAndDocument(genericObjectRecord);
-        assertEquals(pair2.getLeft(), "[\"1\",1]");
-        assertEquals(pair2.getRight(), 
"{\"c\":\"1\",\"d\":1,\"e\":{\"a\":\"a\",\"b\":true,\"d\":1.0,"
-                + "\"f\":1.0,\"i\":1,\"l\":10}}");
+
+        // NON_EXTENSIBLE is NOT extensible and does NOT have strict ordering 
so both
+        // possibilities ["1",1] and [1,"1"] will pass
+        JSONAssert.assertEquals(
+                pair2.getLeft(),
+                "[\"1\",1]",
+                JSONCompareMode.NON_EXTENSIBLE
+        );
+        JSONAssert.assertEquals(
+                pair2.getRight(),
+                "{\"c\":\"1\",\"d\":1,\"e\":{\"a\":\"a\",\"b\":true,\"d\":1.0,"
+                + "\"f\":1.0,\"i\":1,\"l\":10}}",
+                JSONCompareMode.STRICT
+        );
         elasticSearchSink2.close();
 
         // default config with null PK => indexed with auto generated _id
@@ -124,8 +141,12 @@ public class ElasticSearchExtractTest {
                 "compatibilityMode", "ELASTICSEARCH"), null);
         Pair<String, String> pair3 = 
elasticSearchSink3.extractIdAndDocument(genericObjectRecord);
         assertNull(pair3.getLeft());
-        assertEquals(pair3.getRight(), 
"{\"c\":\"1\",\"d\":1,\"e\":{\"a\":\"a\",\"b\":true,\"d\":1.0,"
-                + "\"f\":1.0,\"i\":1,\"l\":10}}");
+        JSONAssert.assertEquals(
+                pair3.getRight(),
+                "{\"c\":\"1\",\"d\":1,\"e\":{\"a\":\"a\",\"b\":true,\"d\":1.0,"
+                + "\"f\":1.0,\"i\":1,\"l\":10}}",
+                JSONCompareMode.STRICT
+        );
         elasticSearchSink3.close();
 
         // default config with null PK + null value
diff --git a/pulsar-io/kinesis/pom.xml b/pulsar-io/kinesis/pom.xml
index 2c566a2bc40..942ecc672f9 100644
--- a/pulsar-io/kinesis/pom.xml
+++ b/pulsar-io/kinesis/pom.xml
@@ -162,6 +162,13 @@
       <scope>test</scope>
     </dependency>
 
+    <dependency>
+      <groupId>org.skyscreamer</groupId>
+      <artifactId>jsonassert</artifactId>
+      <version>${skyscreamer.version}</version>
+      <scope>test</scope>
+    </dependency>
+
   </dependencies>
 
   <build>
diff --git 
a/pulsar-io/kinesis/src/test/java/org/apache/pulsar/io/kinesis/UtilsTest.java 
b/pulsar-io/kinesis/src/test/java/org/apache/pulsar/io/kinesis/UtilsTest.java
index 843f9fd01ba..f304f9161a2 100644
--- 
a/pulsar-io/kinesis/src/test/java/org/apache/pulsar/io/kinesis/UtilsTest.java
+++ 
b/pulsar-io/kinesis/src/test/java/org/apache/pulsar/io/kinesis/UtilsTest.java
@@ -52,6 +52,8 @@ import org.apache.pulsar.functions.api.Record;
 import org.apache.pulsar.functions.source.PulsarRecord;
 import org.apache.pulsar.io.kinesis.fbs.KeyValue;
 import org.apache.pulsar.io.kinesis.fbs.Message;
+import org.skyscreamer.jsonassert.JSONAssert;
+import org.skyscreamer.jsonassert.JSONCompareMode;
 import org.testng.annotations.DataProvider;
 import org.testng.annotations.Test;
 import org.testng.collections.Maps;
@@ -510,15 +512,21 @@ public class UtilsTest {
         ObjectMapper objectMapper = new 
ObjectMapper().setSerializationInclusion(JsonInclude.Include.NON_NULL);
         String json = Utils.serializeRecordToJsonExpandingValue(objectMapper, 
genericObjectRecord, false);
 
-        assertEquals(json, 
"{\"topicName\":\"data-ks1.table1\",\"key\":\"message-key\","
-                + "\"payload\":{},"
-                + "\"eventTime\":1648502845803}");
+        JSONAssert.assertEquals(
+                json,
+                "{\"topicName\":\"data-ks1.table1\",\"key\":\"message-key\","
+                + "\"payload\":{},\"eventTime\":1648502845803}",
+                JSONCompareMode.STRICT
+        );
 
         json = Utils.serializeRecordToJsonExpandingValue(objectMapper, 
genericObjectRecord, true);
 
-        assertEquals(json, 
"{\"topicName\":\"data-ks1.table1\",\"key\":\"message-key\","
-                + "\"payload\":{},"
-                + "\"eventTime\":1648502845803}");
+        JSONAssert.assertEquals(
+                json,
+                "{\"topicName\":\"data-ks1.table1\",\"key\":\"message-key\","
+                + "\"payload\":{},\"eventTime\":1648502845803}",
+                JSONCompareMode.STRICT
+        );
     }
 
     @Test

Reply via email to