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

dsmiley pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/solr.git


The following commit(s) were added to refs/heads/main by this push:
     new b5c71bc5573 SOLR-18196: Tests: Java serialization for QueryResponse 
and SimpleOrderedMap (#4995)
b5c71bc5573 is described below

commit b5c71bc5573c4e31b4cee5a7965d73587fc0ae58
Author: Nick <[email protected]>
AuthorDate: Fri Oct 2 20:06:44 2026 -0600

    SOLR-18196: Tests: Java serialization for QueryResponse and 
SimpleOrderedMap (#4995)
---
 .../client/solrj/response/QueryResponseTest.java   | 40 ++++++++++++++++++++++
 .../solr/common/util/SimpleOrderedMapTest.java     | 36 +++++++++++++++++++
 2 files changed, 76 insertions(+)

diff --git 
a/solr/solrj/src/test/org/apache/solr/client/solrj/response/QueryResponseTest.java
 
b/solr/solrj/src/test/org/apache/solr/client/solrj/response/QueryResponseTest.java
index 0fb8a7c1cfc..98609d6447a 100644
--- 
a/solr/solrj/src/test/org/apache/solr/client/solrj/response/QueryResponseTest.java
+++ 
b/solr/solrj/src/test/org/apache/solr/client/solrj/response/QueryResponseTest.java
@@ -16,9 +16,13 @@
  */
 package org.apache.solr.client.solrj.response;
 
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.InputStreamReader;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
 import java.io.Reader;
 import java.nio.charset.StandardCharsets;
 import java.nio.file.Path;
@@ -27,6 +31,7 @@ import java.util.Date;
 import java.util.List;
 import java.util.Map;
 import org.apache.lucene.tests.util.TestRuleLimitSysouts.Limit;
+import org.apache.lucene.util.SuppressForbidden;
 import org.apache.solr.SolrTestCase;
 import org.apache.solr.common.SolrDocumentList;
 import org.apache.solr.common.util.NamedList;
@@ -320,4 +325,39 @@ public class QueryResponseTest extends SolrTestCase {
     assertTrue(values[0] instanceof SimpleOrderedMap);
     assertTrue(values[1] instanceof SimpleOrderedMap);
   }
+
+  @Test
+  @SuppressForbidden(
+      reason = "testing a same-version Java serialization round-trip on 
locally generated data")
+  public void testQueryResponseSerialization() throws Exception {
+    XMLResponseParser parser = new XMLResponseParser();
+    NamedList<Object> response;
+    try (SolrResourceLoader loader = new 
SolrResourceLoader(Path.of("").toAbsolutePath());
+        InputStream is = loader.openResource("solrj/sampleDebugResponse.xml")) 
{
+      assertNotNull(is);
+      try (Reader in = new InputStreamReader(is, StandardCharsets.UTF_8)) {
+        response = parser.processResponse(in);
+      }
+    }
+
+    QueryResponse qr = new QueryResponse(response);
+    // Guard against a vacuous pass: the fixture must be non-trivial for the
+    // round-trip comparison below to mean anything.
+    assertEquals(2, qr.getResults().getNumFound());
+
+    ByteArrayOutputStream baos = new ByteArrayOutputStream();
+    try (ObjectOutputStream out = new ObjectOutputStream(baos)) {
+      out.writeObject(qr);
+    }
+
+    QueryResponse deserialized;
+    try (ObjectInputStream ois =
+        new ObjectInputStream(new ByteArrayInputStream(baos.toByteArray()))) {
+      deserialized = (QueryResponse) ois.readObject();
+    }
+
+    // QueryResponse implements no equals(), so compare the underlying 
response rendering
+    // instead: a single structural comparison replacing field-by-field 
assertions.
+    assertEquals(qr.getResponse().toString(), 
deserialized.getResponse().toString());
+  }
 }
diff --git 
a/solr/solrj/src/test/org/apache/solr/common/util/SimpleOrderedMapTest.java 
b/solr/solrj/src/test/org/apache/solr/common/util/SimpleOrderedMapTest.java
index f50216f4848..7ba23a88f51 100644
--- a/solr/solrj/src/test/org/apache/solr/common/util/SimpleOrderedMapTest.java
+++ b/solr/solrj/src/test/org/apache/solr/common/util/SimpleOrderedMapTest.java
@@ -16,10 +16,16 @@
  */
 package org.apache.solr.common.util;
 
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
 import java.util.Collection;
 import java.util.LinkedHashMap;
+import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import org.apache.lucene.util.SuppressForbidden;
 import org.apache.solr.SolrTestCase;
 import org.junit.Test;
 
@@ -39,6 +45,36 @@ public class SimpleOrderedMapTest extends SolrTestCase {
     assertEquals(2, map.nvPairs.get(3));
   }
 
+  @Test
+  @SuppressForbidden(
+      reason = "testing a same-version Java serialization round-trip on 
locally generated data")
+  public void testJavaSerializationRoundTrip() throws Exception {
+    SimpleOrderedMap<Object> original = new SimpleOrderedMap<>();
+    original.put("one", 1);
+    original.put("two", "two");
+    original.put("aNull", null);
+    original.put(null, 4);
+    SimpleOrderedMap<Object> nested = new SimpleOrderedMap<>();
+    nested.put("match", true);
+    nested.put("value", 1.4886642f);
+    original.put("nested", nested);
+    original.put("categories", List.of("electronics", "memory"));
+
+    ByteArrayOutputStream baos = new ByteArrayOutputStream();
+    try (ObjectOutputStream out = new ObjectOutputStream(baos)) {
+      out.writeObject(original);
+    }
+
+    SimpleOrderedMap<?> deserialized;
+    try (ObjectInputStream in =
+        new ObjectInputStream(new ByteArrayInputStream(baos.toByteArray()))) {
+      deserialized = (SimpleOrderedMap<?>) in.readObject();
+    }
+
+    // One structural comparison covers size, order, keys, values and nesting.
+    assertEquals(original, deserialized);
+  }
+
   @Test
   public void testEquals() {
     var map2 = new SimpleOrderedMap<Integer>();

Reply via email to