From 8f579b2e21e18b109e3dabca1550c95b9a31deba Mon Sep 17 00:00:00 2001 From: Hyeoncheol Kim Date: Sat, 9 May 2026 23:05:07 +0900 Subject: [PATCH] Fix release gate parity lanes --- CHANGELOG.md | 2 ++ .../engine/InMemoryCollectionStore.java | 6 +++++- .../jongodb/testkit/UnifiedSpecImporter.java | 4 ++-- .../engine/InMemoryCollectionStoreTest.java | 15 +++++++++++++++ .../testkit/UnifiedSpecImporterTest.java | 18 +++++++++--------- 5 files changed, 33 insertions(+), 12 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index dfc8296..bb729b0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -48,6 +48,8 @@ All notable changes to this project are documented in this file. - Added structured runtime logging contract (`onLog`, `logFormat`) with expanded log levels (`error`/`warn`/`info`/`debug`). ### Fixed +- Fixed insert parity for documents missing `_id` by assigning an `ObjectId` before unique-index validation. +- Fixed release-gate runOn lanes to keep `mongos-unpin` and `client-bulkWrite-errors*` suites gated until their exact differential contracts are implemented. - Fixed deterministic R3 parity mismatches for dollar-prefixed `_id` subfields, replacement-style `updateMany`, and `createIndexes` inside transactions. - Fixed upsert seed extraction to honor equality clauses nested inside `$and`, restoring duplicate-key behavior for `findOneAndUpdate` lock-style filters. diff --git a/src/main/java/org/jongodb/engine/InMemoryCollectionStore.java b/src/main/java/org/jongodb/engine/InMemoryCollectionStore.java index b992b48..88ebc3c 100644 --- a/src/main/java/org/jongodb/engine/InMemoryCollectionStore.java +++ b/src/main/java/org/jongodb/engine/InMemoryCollectionStore.java @@ -139,7 +139,11 @@ public synchronized void insertMany(List documents) { if (document == null) { throw new IllegalArgumentException("documents must not contain null"); } - copiedDocuments.add(DocumentCopies.copy(document)); + final Document copiedDocument = DocumentCopies.copy(document); + if (!copiedDocument.containsKey("_id")) { + copiedDocument.put("_id", new ObjectId()); + } + copiedDocuments.add(copiedDocument); } List candidateDocuments = new ArrayList<>(this.documents.size() + copiedDocuments.size()); diff --git a/src/main/java/org/jongodb/testkit/UnifiedSpecImporter.java b/src/main/java/org/jongodb/testkit/UnifiedSpecImporter.java index 87a0434..33f988e 100644 --- a/src/main/java/org/jongodb/testkit/UnifiedSpecImporter.java +++ b/src/main/java/org/jongodb/testkit/UnifiedSpecImporter.java @@ -1229,7 +1229,6 @@ private static boolean isMongosPinAutoLaneSourcePath(final String sourcePath) { private static boolean isMongosTopologyLaneSourcePath(final String sourcePath) { return matchesSpecPathWithSupportedExtensions(sourcePath, "transactions/tests/unified/pin-mongos") - || matchesSpecPathWithSupportedExtensions(sourcePath, "transactions/tests/unified/mongos-unpin") || matchesSpecPathWithSupportedExtensions(sourcePath, "transactions/tests/unified/mongos-recovery-token"); } @@ -1262,7 +1261,8 @@ private static boolean isClientBulkWriteVersionLaneSourcePath(final String sourc if (!clientBulkWriteSource) { return false; } - return !sourcePath.contains("client-bulkWrite-errorResponse"); + return !sourcePath.contains("client-bulkWrite-errors") + && !sourcePath.contains("client-bulkWrite-errorResponse"); } private static boolean isSnapshotSessionsNotSupportedClientErrorLaneSourcePath(final String sourcePath) { diff --git a/src/test/java/org/jongodb/engine/InMemoryCollectionStoreTest.java b/src/test/java/org/jongodb/engine/InMemoryCollectionStoreTest.java index 90aae7d..84c043d 100644 --- a/src/test/java/org/jongodb/engine/InMemoryCollectionStoreTest.java +++ b/src/test/java/org/jongodb/engine/InMemoryCollectionStoreTest.java @@ -12,6 +12,7 @@ import java.util.Date; import java.util.List; import org.bson.Document; +import org.bson.types.ObjectId; import org.junit.jupiter.api.Test; class InMemoryCollectionStoreTest { @@ -30,6 +31,20 @@ void insertManyAndFindAllReturnsInsertedDocuments() { assertEquals("Linus", found.get(1).getString("name")); } + @Test + void insertManyAssignsObjectIdWhenIdIsMissing() { + CollectionStore store = new InMemoryCollectionStore(); + final Document source = new Document("name", "Ada"); + + store.insertMany(List.of(source)); + + final List found = store.findAll(); + assertEquals(1, found.size()); + assertFalse(source.containsKey("_id")); + assertTrue(found.get(0).get("_id") instanceof ObjectId); + assertEquals("Ada", found.get(0).getString("name")); + } + @Test void findSupportsSimpleEqualityFilter() { CollectionStore store = new InMemoryCollectionStore(); diff --git a/src/test/java/org/jongodb/testkit/UnifiedSpecImporterTest.java b/src/test/java/org/jongodb/testkit/UnifiedSpecImporterTest.java index 54531cf..390c4a5 100644 --- a/src/test/java/org/jongodb/testkit/UnifiedSpecImporterTest.java +++ b/src/test/java/org/jongodb/testkit/UnifiedSpecImporterTest.java @@ -382,7 +382,7 @@ void appliesMongosTopologyLaneOverrideForPinMongosYamlSourcePath() throws IOExce } @Test - void appliesMongosTopologyLaneOverrideForMongosUnpinSourcePath() throws IOException { + void keepsRunOnTopologyChecksForMongosUnpinSourcePath() throws IOException { final Path suiteRoot = tempDir.resolve("transactions/tests/unified"); Files.createDirectories(suiteRoot); Files.writeString( @@ -408,9 +408,9 @@ void appliesMongosTopologyLaneOverrideForMongosUnpinSourcePath() throws IOExcept tempDir, UnifiedSpecImporter.RunOnContext.evaluated("7.0.25", "replicaset", false, false)); - assertEquals(1, result.importedCount()); - assertEquals(0, result.skippedCount()); - assertEquals(0, result.unsupportedCount()); + assertEquals(0, result.importedCount()); + assertEquals(1, result.skippedCount()); + assertTrue(result.skippedCases().get(0).reason().contains("runOnRequirements not satisfied")); } @Test @@ -606,7 +606,7 @@ void keepsRunOnVersionChecksForNonClientBulkWriteLaneFiles() throws IOException } @Test - void appliesRunOnVersionLaneForClientBulkWriteErrorsFiles() throws IOException { + void keepsRunOnVersionChecksForClientBulkWriteErrorsFiles() throws IOException { final Path suiteRoot = tempDir.resolve("crud/tests/unified"); Files.createDirectories(suiteRoot); Files.writeString( @@ -617,7 +617,7 @@ void appliesRunOnVersionLaneForClientBulkWriteErrorsFiles() throws IOException { "collection_name": "users", "tests": [ { - "description": "errors lane included", + "description": "errors lane excluded", "runOnRequirements": [{"minServerVersion": "8.0"}], "operations": [ {"name": "find", "arguments": {"filter": {"_id": 1}}} @@ -632,9 +632,9 @@ void appliesRunOnVersionLaneForClientBulkWriteErrorsFiles() throws IOException { tempDir, UnifiedSpecImporter.RunOnContext.evaluated("7.0.25", "replicaset", false, false)); - assertEquals(1, result.importedCount()); - assertEquals(0, result.skippedCount()); - assertEquals(0, result.unsupportedCount()); + assertEquals(0, result.importedCount()); + assertEquals(1, result.skippedCount()); + assertTrue(result.skippedCases().get(0).reason().contains("runOnRequirements not satisfied")); } @Test