diff --git a/client-java/instrumentation/src/main/java/org/evomaster/client/java/instrumentation/coverage/methodreplacement/ReplacementList.java b/client-java/instrumentation/src/main/java/org/evomaster/client/java/instrumentation/coverage/methodreplacement/ReplacementList.java index 463a26b131..7c615cdfb2 100644 --- a/client-java/instrumentation/src/main/java/org/evomaster/client/java/instrumentation/coverage/methodreplacement/ReplacementList.java +++ b/client-java/instrumentation/src/main/java/org/evomaster/client/java/instrumentation/coverage/methodreplacement/ReplacementList.java @@ -59,6 +59,7 @@ public static List getList() { new MessageBodyReaderClassReplacement(), new MethodClassReplacement(), new MongoCollectionClassReplacement(), + new MongoCollectionLegacyCountClassReplacement(), new MongoCollectionPipelineUpdateClassReplacement(), new MongoTemplateClassReplacement(), new OpenSearchClientClassReplacement(), diff --git a/client-java/instrumentation/src/main/java/org/evomaster/client/java/instrumentation/coverage/methodreplacement/thirdpartyclasses/MongoCollectionClassReplacement.java b/client-java/instrumentation/src/main/java/org/evomaster/client/java/instrumentation/coverage/methodreplacement/thirdpartyclasses/MongoCollectionClassReplacement.java index a8390c7ae1..c96de27257 100644 --- a/client-java/instrumentation/src/main/java/org/evomaster/client/java/instrumentation/coverage/methodreplacement/thirdpartyclasses/MongoCollectionClassReplacement.java +++ b/client-java/instrumentation/src/main/java/org/evomaster/client/java/instrumentation/coverage/methodreplacement/thirdpartyclasses/MongoCollectionClassReplacement.java @@ -13,6 +13,17 @@ import java.util.List; +/** + * Replacements for the methods of {@code MongoCollection} that execute a query. + *

+ * All the original methods of a replacement class are resolved together, and all must exist in the + * MongoDB Java driver in use, otherwise the replacements of the whole class fail when executed. + * The methods of this class exist from driver 3.8.0 (the first version with + * {@code com.mongodb.client.ClientSession} and {@code countDocuments}), so that is the first driver + * version supported. Methods that are only present in some driver versions are in separate classes: + * {@link MongoCollectionLegacyCountClassReplacement} (removed in 4.0.0) and + * {@link MongoCollectionPipelineUpdateClassReplacement} (added in 3.11.0). + */ public class MongoCollectionClassReplacement extends MongoOperationClassReplacement { private static final MongoCollectionClassReplacement singleton = new MongoCollectionClassReplacement(); @@ -21,194 +32,383 @@ protected String getNameOfThirdPartyTargetClass() { return "com.mongodb.client.MongoCollection"; } + /** + * Replacement for {@code MongoCollection.find()}. + *

+ * Present in the MongoDB Java driver from 3.0.0 (the first version with {@code MongoCollection}). + */ @Replacement(replacingStatic = false, type = ReplacementType.TRACKER, id = "find", usageFilter = UsageFilter.ANY, category = ReplacementCategory.MONGO, castTo = "com.mongodb.client.FindIterable") public static Object find(Object mongoCollection) { return handleFind("find", mongoCollection, Collections.emptyList(), null); } + /** + * Replacement for {@code MongoCollection.find(Class)}. + *

+ * Present in the MongoDB Java driver from 3.0.0 (the first version with {@code MongoCollection}). + */ @Replacement(replacingStatic = false, type = ReplacementType.TRACKER, id = "findResultClass", usageFilter = UsageFilter.ANY, category = ReplacementCategory.MONGO, castTo = "com.mongodb.client.FindIterable") public static Object find(Object mongoCollection, Class resultClass) { return handleFind("findResultClass", mongoCollection, Arrays.asList(resultClass), null); } + /** + * Replacement for {@code MongoCollection.find(Bson)}. + *

+ * Present in the MongoDB Java driver from 3.0.0 (the first version with {@code MongoCollection}). + */ @Replacement(replacingStatic = false, type = ReplacementType.TRACKER, id = "findBson", usageFilter = UsageFilter.ANY, category = ReplacementCategory.MONGO, castTo = "com.mongodb.client.FindIterable") public static Object find(Object mongoCollection, @ThirdPartyCast(actualType = "org.bson.conversions.Bson") Object filter) { return handleFind("findBson", mongoCollection, Arrays.asList(filter), filter); } + /** + * Replacement for {@code MongoCollection.find(Bson, Class)}. + *

+ * Present in the MongoDB Java driver from 3.0.0 (the first version with {@code MongoCollection}). + */ @Replacement(replacingStatic = false, type = ReplacementType.TRACKER, id = "findBsonResultClass", usageFilter = UsageFilter.ANY, category = ReplacementCategory.MONGO, castTo = "com.mongodb.client.FindIterable") public static Object find(Object mongoCollection, @ThirdPartyCast(actualType = "org.bson.conversions.Bson") Object filter, Class resultClass) { return handleFind("findBsonResultClass", mongoCollection, Arrays.asList(filter, resultClass), filter); } + /** + * Replacement for {@code MongoCollection.find(ClientSession, Bson)}. + *

+ * Present in the MongoDB Java driver from 3.8.0 (not present in 3.7.1). + */ @Replacement(replacingStatic = false, type = ReplacementType.TRACKER, id = "findClientSessionBson", usageFilter = UsageFilter.ANY, category = ReplacementCategory.MONGO, castTo = "com.mongodb.client.FindIterable") public static Object find(Object mongoCollection, @ThirdPartyCast(actualType = "com.mongodb.client.ClientSession") Object clientSession, @ThirdPartyCast(actualType = "org.bson.conversions.Bson") Object filter) { return handleFind("findClientSessionBson", mongoCollection, Arrays.asList(clientSession, filter), filter); } + /** + * Replacement for {@code MongoCollection.find(ClientSession, Bson, Class)}. + *

+ * Present in the MongoDB Java driver from 3.8.0 (not present in 3.7.1). + */ @Replacement(replacingStatic = false, type = ReplacementType.TRACKER, id = "findClientSessionBsonResultClass", usageFilter = UsageFilter.ANY, category = ReplacementCategory.MONGO, castTo = "com.mongodb.client.FindIterable") public static Object find(Object mongoCollection, @ThirdPartyCast(actualType = "com.mongodb.client.ClientSession") Object clientSession, @ThirdPartyCast(actualType = "org.bson.conversions.Bson") Object filter, Class resultClass) { return handleFind("findClientSessionBsonResultClass", mongoCollection, Arrays.asList(clientSession, filter, resultClass), filter); } + /** + * Replacement for {@code MongoCollection.countDocuments(Bson)}. + *

+ * Present in the MongoDB Java driver from 3.8.0 (not present in 3.7.1). + */ @Replacement(replacingStatic = false, type = ReplacementType.TRACKER, id = "countDocumentsBson", usageFilter = UsageFilter.ANY, category = ReplacementCategory.MONGO) public static long countDocuments(Object mongoCollection, @ThirdPartyCast(actualType = "org.bson.conversions.Bson") Object filter) { return handleCount("countDocumentsBson", mongoCollection, Arrays.asList(filter), filter); } + /** + * Replacement for {@code MongoCollection.countDocuments(Bson, CountOptions)}. + *

+ * Present in the MongoDB Java driver from 3.8.0 (not present in 3.7.1). + */ @Replacement(replacingStatic = false, type = ReplacementType.TRACKER, id = "countDocumentsBsonCountOptions", usageFilter = UsageFilter.ANY, category = ReplacementCategory.MONGO) public static long countDocuments(Object mongoCollection, @ThirdPartyCast(actualType = "org.bson.conversions.Bson") Object filter, @ThirdPartyCast(actualType = "com.mongodb.client.model.CountOptions") Object options) { return handleCount("countDocumentsBsonCountOptions", mongoCollection, Arrays.asList(filter, options), filter); } + /** + * Replacement for {@code MongoCollection.countDocuments(ClientSession, Bson)}. + *

+ * Present in the MongoDB Java driver from 3.8.0 (not present in 3.7.1). + */ @Replacement(replacingStatic = false, type = ReplacementType.TRACKER, id = "countDocumentsClientSessionBson", usageFilter = UsageFilter.ANY, category = ReplacementCategory.MONGO) public static long countDocuments_EM_0(Object mongoCollection, @ThirdPartyCast(actualType = "com.mongodb.client.ClientSession") Object clientSession, @ThirdPartyCast(actualType = "org.bson.conversions.Bson") Object filter) { return handleCount("countDocumentsClientSessionBson", mongoCollection, Arrays.asList(clientSession, filter), filter); } + /** + * Replacement for {@code MongoCollection.countDocuments(ClientSession, Bson, CountOptions)}. + *

+ * Present in the MongoDB Java driver from 3.8.0 (not present in 3.7.1). + */ @Replacement(replacingStatic = false, type = ReplacementType.TRACKER, id = "countDocumentsClientSessionBsonCountOptions", usageFilter = UsageFilter.ANY, category = ReplacementCategory.MONGO) public static long countDocuments(Object mongoCollection, @ThirdPartyCast(actualType = "com.mongodb.client.ClientSession") Object clientSession, @ThirdPartyCast(actualType = "org.bson.conversions.Bson") Object filter, @ThirdPartyCast(actualType = "com.mongodb.client.model.CountOptions") Object options) { return handleCount("countDocumentsClientSessionBsonCountOptions", mongoCollection, Arrays.asList(clientSession, filter, options), filter); } + /** + * Replacement for {@code MongoCollection.deleteOne(Bson)}. + *

+ * Present in the MongoDB Java driver from 3.0.0 (the first version with {@code MongoCollection}). + */ @Replacement(replacingStatic = false, type = ReplacementType.TRACKER, id = "deleteOneBson", usageFilter = UsageFilter.ANY, category = ReplacementCategory.MONGO, castTo = "com.mongodb.client.result.DeleteResult") public static Object deleteOne(Object mongoCollection, @ThirdPartyCast(actualType = "org.bson.conversions.Bson") Object filter) { return handleDelete("deleteOneBson", mongoCollection, Arrays.asList(filter), filter); } + /** + * Replacement for {@code MongoCollection.deleteOne(Bson, DeleteOptions)}. + *

+ * Present in the MongoDB Java driver from 3.4.0 (not present in 3.2.2). + */ @Replacement(replacingStatic = false, type = ReplacementType.TRACKER, id = "deleteOneBsonDeleteOptions", usageFilter = UsageFilter.ANY, category = ReplacementCategory.MONGO, castTo = "com.mongodb.client.result.DeleteResult") public static Object deleteOne(Object mongoCollection, @ThirdPartyCast(actualType = "org.bson.conversions.Bson") Object filter, @ThirdPartyCast(actualType = "com.mongodb.client.model.DeleteOptions") Object options) { return handleDelete("deleteOneBsonDeleteOptions", mongoCollection, Arrays.asList(filter, options), filter); } + /** + * Replacement for {@code MongoCollection.deleteOne(ClientSession, Bson)}. + *

+ * Present in the MongoDB Java driver from 3.8.0 (not present in 3.7.1). + */ @Replacement(replacingStatic = false, type = ReplacementType.TRACKER, id = "deleteOneClientSessionBson", usageFilter = UsageFilter.ANY, category = ReplacementCategory.MONGO, castTo = "com.mongodb.client.result.DeleteResult") public static Object deleteOne_EM_0(Object mongoCollection, @ThirdPartyCast(actualType = "com.mongodb.client.ClientSession") Object clientSession, @ThirdPartyCast(actualType = "org.bson.conversions.Bson") Object filter) { return handleDelete("deleteOneClientSessionBson", mongoCollection, Arrays.asList(clientSession, filter), filter); } + /** + * Replacement for {@code MongoCollection.deleteOne(ClientSession, Bson, DeleteOptions)}. + *

+ * Present in the MongoDB Java driver from 3.8.0 (not present in 3.7.1). + */ @Replacement(replacingStatic = false, type = ReplacementType.TRACKER, id = "deleteOneClientSessionBsonDeleteOptions", usageFilter = UsageFilter.ANY, category = ReplacementCategory.MONGO, castTo = "com.mongodb.client.result.DeleteResult") public static Object deleteOne(Object mongoCollection, @ThirdPartyCast(actualType = "com.mongodb.client.ClientSession") Object clientSession, @ThirdPartyCast(actualType = "org.bson.conversions.Bson") Object filter, @ThirdPartyCast(actualType = "com.mongodb.client.model.DeleteOptions") Object options) { return handleDelete("deleteOneClientSessionBsonDeleteOptions", mongoCollection, Arrays.asList(clientSession, filter, options), filter); } + /** + * Replacement for {@code MongoCollection.deleteMany(Bson)}. + *

+ * Present in the MongoDB Java driver from 3.0.0 (the first version with {@code MongoCollection}). + */ @Replacement(replacingStatic = false, type = ReplacementType.TRACKER, id = "deleteManyBson", usageFilter = UsageFilter.ANY, category = ReplacementCategory.MONGO, castTo = "com.mongodb.client.result.DeleteResult") public static Object deleteMany(Object mongoCollection, @ThirdPartyCast(actualType = "org.bson.conversions.Bson") Object filter) { return handleDelete("deleteManyBson", mongoCollection, Arrays.asList(filter), filter); } + /** + * Replacement for {@code MongoCollection.deleteMany(Bson, DeleteOptions)}. + *

+ * Present in the MongoDB Java driver from 3.4.0 (not present in 3.2.2). + */ @Replacement(replacingStatic = false, type = ReplacementType.TRACKER, id = "deleteManyBsonDeleteOptions", usageFilter = UsageFilter.ANY, category = ReplacementCategory.MONGO, castTo = "com.mongodb.client.result.DeleteResult") public static Object deleteMany(Object mongoCollection, @ThirdPartyCast(actualType = "org.bson.conversions.Bson") Object filter, @ThirdPartyCast(actualType = "com.mongodb.client.model.DeleteOptions") Object options) { return handleDelete("deleteManyBsonDeleteOptions", mongoCollection, Arrays.asList(filter, options), filter); } + /** + * Replacement for {@code MongoCollection.deleteMany(ClientSession, Bson)}. + *

+ * Present in the MongoDB Java driver from 3.8.0 (not present in 3.7.1). + */ @Replacement(replacingStatic = false, type = ReplacementType.TRACKER, id = "deleteManyClientSessionBson", usageFilter = UsageFilter.ANY, category = ReplacementCategory.MONGO, castTo = "com.mongodb.client.result.DeleteResult") public static Object deleteMany_EM_0(Object mongoCollection, @ThirdPartyCast(actualType = "com.mongodb.client.ClientSession") Object clientSession, @ThirdPartyCast(actualType = "org.bson.conversions.Bson") Object filter) { return handleDelete("deleteManyClientSessionBson", mongoCollection, Arrays.asList(clientSession, filter), filter); } + /** + * Replacement for {@code MongoCollection.deleteMany(ClientSession, Bson, DeleteOptions)}. + *

+ * Present in the MongoDB Java driver from 3.8.0 (not present in 3.7.1). + */ @Replacement(replacingStatic = false, type = ReplacementType.TRACKER, id = "deleteManyClientSessionBsonDeleteOptions", usageFilter = UsageFilter.ANY, category = ReplacementCategory.MONGO, castTo = "com.mongodb.client.result.DeleteResult") public static Object deleteMany(Object mongoCollection, @ThirdPartyCast(actualType = "com.mongodb.client.ClientSession") Object clientSession, @ThirdPartyCast(actualType = "org.bson.conversions.Bson") Object filter, @ThirdPartyCast(actualType = "com.mongodb.client.model.DeleteOptions") Object options) { return handleDelete("deleteManyClientSessionBsonDeleteOptions", mongoCollection, Arrays.asList(clientSession, filter, options), filter); } + /** + * Replacement for {@code MongoCollection.updateOne(Bson, Bson)}. + *

+ * Present in the MongoDB Java driver from 3.0.0 (the first version with {@code MongoCollection}). + */ @Replacement(replacingStatic = false, type = ReplacementType.TRACKER, id = "updateOneBson", usageFilter = UsageFilter.ANY, category = ReplacementCategory.MONGO, castTo = "com.mongodb.client.result.UpdateResult") public static Object updateOne(Object mongoCollection, @ThirdPartyCast(actualType = "org.bson.conversions.Bson") Object filter, @ThirdPartyCast(actualType = "org.bson.conversions.Bson") Object update) { return handleUpdate("updateOneBson", mongoCollection, Arrays.asList(filter, update), filter); } + /** + * Replacement for {@code MongoCollection.updateOne(Bson, Bson, UpdateOptions)}. + *

+ * Present in the MongoDB Java driver from 3.0.0 (the first version with {@code MongoCollection}). + */ @Replacement(replacingStatic = false, type = ReplacementType.TRACKER, id = "updateOneBsonUpdateOptions", usageFilter = UsageFilter.ANY, category = ReplacementCategory.MONGO, castTo = "com.mongodb.client.result.UpdateResult") public static Object updateOne(Object mongoCollection, @ThirdPartyCast(actualType = "org.bson.conversions.Bson") Object filter, @ThirdPartyCast(actualType = "org.bson.conversions.Bson") Object update, @ThirdPartyCast(actualType = "com.mongodb.client.model.UpdateOptions") Object options) { return handleUpdate("updateOneBsonUpdateOptions", mongoCollection, Arrays.asList(filter, update, options), filter); } + /** + * Replacement for {@code MongoCollection.updateOne(ClientSession, Bson, Bson)}. + *

+ * Present in the MongoDB Java driver from 3.8.0 (not present in 3.7.1). + */ @Replacement(replacingStatic = false, type = ReplacementType.TRACKER, id = "updateOneClientSessionBson", usageFilter = UsageFilter.ANY, category = ReplacementCategory.MONGO, castTo = "com.mongodb.client.result.UpdateResult") public static Object updateOne_EM_0(Object mongoCollection, @ThirdPartyCast(actualType = "com.mongodb.client.ClientSession") Object clientSession, @ThirdPartyCast(actualType = "org.bson.conversions.Bson") Object filter, @ThirdPartyCast(actualType = "org.bson.conversions.Bson") Object update) { return handleUpdate("updateOneClientSessionBson", mongoCollection, Arrays.asList(clientSession, filter, update), filter); } + /** + * Replacement for {@code MongoCollection.updateOne(ClientSession, Bson, Bson, UpdateOptions)}. + *

+ * Present in the MongoDB Java driver from 3.8.0 (not present in 3.7.1). + */ @Replacement(replacingStatic = false, type = ReplacementType.TRACKER, id = "updateOneClientSessionBsonUpdateOptions", usageFilter = UsageFilter.ANY, category = ReplacementCategory.MONGO, castTo = "com.mongodb.client.result.UpdateResult") public static Object updateOne(Object mongoCollection, @ThirdPartyCast(actualType = "com.mongodb.client.ClientSession") Object clientSession, @ThirdPartyCast(actualType = "org.bson.conversions.Bson") Object filter, @ThirdPartyCast(actualType = "org.bson.conversions.Bson") Object update, @ThirdPartyCast(actualType = "com.mongodb.client.model.UpdateOptions") Object options) { return handleUpdate("updateOneClientSessionBsonUpdateOptions", mongoCollection, Arrays.asList(clientSession, filter, update, options), filter); } + /** + * Replacement for {@code MongoCollection.updateMany(Bson, Bson)}. + *

+ * Present in the MongoDB Java driver from 3.0.0 (the first version with {@code MongoCollection}). + */ @Replacement(replacingStatic = false, type = ReplacementType.TRACKER, id = "updateManyBson", usageFilter = UsageFilter.ANY, category = ReplacementCategory.MONGO, castTo = "com.mongodb.client.result.UpdateResult") public static Object updateMany(Object mongoCollection, @ThirdPartyCast(actualType = "org.bson.conversions.Bson") Object filter, @ThirdPartyCast(actualType = "org.bson.conversions.Bson") Object update) { return handleUpdate("updateManyBson", mongoCollection, Arrays.asList(filter, update), filter); } + /** + * Replacement for {@code MongoCollection.updateMany(Bson, Bson, UpdateOptions)}. + *

+ * Present in the MongoDB Java driver from 3.0.0 (the first version with {@code MongoCollection}). + */ @Replacement(replacingStatic = false, type = ReplacementType.TRACKER, id = "updateManyBsonUpdateOptions", usageFilter = UsageFilter.ANY, category = ReplacementCategory.MONGO, castTo = "com.mongodb.client.result.UpdateResult") public static Object updateMany(Object mongoCollection, @ThirdPartyCast(actualType = "org.bson.conversions.Bson") Object filter, @ThirdPartyCast(actualType = "org.bson.conversions.Bson") Object update, @ThirdPartyCast(actualType = "com.mongodb.client.model.UpdateOptions") Object options) { return handleUpdate("updateManyBsonUpdateOptions", mongoCollection, Arrays.asList(filter, update, options), filter); } + /** + * Replacement for {@code MongoCollection.updateMany(ClientSession, Bson, Bson)}. + *

+ * Present in the MongoDB Java driver from 3.8.0 (not present in 3.7.1). + */ @Replacement(replacingStatic = false, type = ReplacementType.TRACKER, id = "updateManyClientSessionBson", usageFilter = UsageFilter.ANY, category = ReplacementCategory.MONGO, castTo = "com.mongodb.client.result.UpdateResult") public static Object updateMany_EM_0(Object mongoCollection, @ThirdPartyCast(actualType = "com.mongodb.client.ClientSession") Object clientSession, @ThirdPartyCast(actualType = "org.bson.conversions.Bson") Object filter, @ThirdPartyCast(actualType = "org.bson.conversions.Bson") Object update) { return handleUpdate("updateManyClientSessionBson", mongoCollection, Arrays.asList(clientSession, filter, update), filter); } + /** + * Replacement for {@code MongoCollection.updateMany(ClientSession, Bson, Bson, UpdateOptions)}. + *

+ * Present in the MongoDB Java driver from 3.8.0 (not present in 3.7.1). + */ @Replacement(replacingStatic = false, type = ReplacementType.TRACKER, id = "updateManyClientSessionBsonUpdateOptions", usageFilter = UsageFilter.ANY, category = ReplacementCategory.MONGO, castTo = "com.mongodb.client.result.UpdateResult") public static Object updateMany(Object mongoCollection, @ThirdPartyCast(actualType = "com.mongodb.client.ClientSession") Object clientSession, @ThirdPartyCast(actualType = "org.bson.conversions.Bson") Object filter, @ThirdPartyCast(actualType = "org.bson.conversions.Bson") Object update, @ThirdPartyCast(actualType = "com.mongodb.client.model.UpdateOptions") Object options) { return handleUpdate("updateManyClientSessionBsonUpdateOptions", mongoCollection, Arrays.asList(clientSession, filter, update, options), filter); } + /** + * Replacement for {@code MongoCollection.findOneAndDelete(Bson)}. + *

+ * Present in the MongoDB Java driver from 3.0.0 (the first version with {@code MongoCollection}). + */ @Replacement(replacingStatic = false, type = ReplacementType.TRACKER, id = "findOneAndDeleteBson", usageFilter = UsageFilter.ANY, category = ReplacementCategory.MONGO) public static Object findOneAndDelete(Object mongoCollection, @ThirdPartyCast(actualType = "org.bson.conversions.Bson") Object filter) { return handleDelete("findOneAndDeleteBson", mongoCollection, Arrays.asList(filter), filter); } + /** + * Replacement for {@code MongoCollection.findOneAndDelete(Bson, FindOneAndDeleteOptions)}. + *

+ * Present in the MongoDB Java driver from 3.0.0 (the first version with {@code MongoCollection}). + */ @Replacement(replacingStatic = false, type = ReplacementType.TRACKER, id = "findOneAndDeleteBsonFindOneAndDeleteOptions", usageFilter = UsageFilter.ANY, category = ReplacementCategory.MONGO) public static Object findOneAndDelete(Object mongoCollection, @ThirdPartyCast(actualType = "org.bson.conversions.Bson") Object filter, @ThirdPartyCast(actualType = "com.mongodb.client.model.FindOneAndDeleteOptions") Object options) { return handleDelete("findOneAndDeleteBsonFindOneAndDeleteOptions", mongoCollection, Arrays.asList(filter, options), filter); } + /** + * Replacement for {@code MongoCollection.findOneAndDelete(ClientSession, Bson)}. + *

+ * Present in the MongoDB Java driver from 3.8.0 (not present in 3.7.1). + */ @Replacement(replacingStatic = false, type = ReplacementType.TRACKER, id = "findOneAndDeleteClientSessionBson", usageFilter = UsageFilter.ANY, category = ReplacementCategory.MONGO) public static Object findOneAndDelete_EM_0(Object mongoCollection, @ThirdPartyCast(actualType = "com.mongodb.client.ClientSession") Object clientSession, @ThirdPartyCast(actualType = "org.bson.conversions.Bson") Object filter) { return handleDelete("findOneAndDeleteClientSessionBson", mongoCollection, Arrays.asList(clientSession, filter), filter); } + /** + * Replacement for {@code MongoCollection.findOneAndDelete(ClientSession, Bson, FindOneAndDeleteOptions)}. + *

+ * Present in the MongoDB Java driver from 3.8.0 (not present in 3.7.1). + */ @Replacement(replacingStatic = false, type = ReplacementType.TRACKER, id = "findOneAndDeleteClientSessionBsonFindOneAndDeleteOptions", usageFilter = UsageFilter.ANY, category = ReplacementCategory.MONGO) public static Object findOneAndDelete(Object mongoCollection, @ThirdPartyCast(actualType = "com.mongodb.client.ClientSession") Object clientSession, @ThirdPartyCast(actualType = "org.bson.conversions.Bson") Object filter, @ThirdPartyCast(actualType = "com.mongodb.client.model.FindOneAndDeleteOptions") Object options) { return handleDelete("findOneAndDeleteClientSessionBsonFindOneAndDeleteOptions", mongoCollection, Arrays.asList(clientSession, filter, options), filter); } + /** + * Replacement for {@code MongoCollection.findOneAndUpdate(Bson, Bson)}. + *

+ * Present in the MongoDB Java driver from 3.0.0 (the first version with {@code MongoCollection}). + */ @Replacement(replacingStatic = false, type = ReplacementType.TRACKER, id = "findOneAndUpdateBson", usageFilter = UsageFilter.ANY, category = ReplacementCategory.MONGO) public static Object findOneAndUpdate(Object mongoCollection, @ThirdPartyCast(actualType = "org.bson.conversions.Bson") Object filter, @ThirdPartyCast(actualType = "org.bson.conversions.Bson") Object update) { return handleUpdate("findOneAndUpdateBson", mongoCollection, Arrays.asList(filter, update), filter); } + /** + * Replacement for {@code MongoCollection.findOneAndUpdate(Bson, Bson, FindOneAndUpdateOptions)}. + *

+ * Present in the MongoDB Java driver from 3.0.0 (the first version with {@code MongoCollection}). + */ @Replacement(replacingStatic = false, type = ReplacementType.TRACKER, id = "findOneAndUpdateBsonFindOneAndUpdateOptions", usageFilter = UsageFilter.ANY, category = ReplacementCategory.MONGO) public static Object findOneAndUpdate(Object mongoCollection, @ThirdPartyCast(actualType = "org.bson.conversions.Bson") Object filter, @ThirdPartyCast(actualType = "org.bson.conversions.Bson") Object update, @ThirdPartyCast(actualType = "com.mongodb.client.model.FindOneAndUpdateOptions") Object options) { return handleUpdate("findOneAndUpdateBsonFindOneAndUpdateOptions", mongoCollection, Arrays.asList(filter, update, options), filter); } + /** + * Replacement for {@code MongoCollection.findOneAndUpdate(ClientSession, Bson, Bson)}. + *

+ * Present in the MongoDB Java driver from 3.8.0 (not present in 3.7.1). + */ @Replacement(replacingStatic = false, type = ReplacementType.TRACKER, id = "findOneAndUpdateClientSessionBson", usageFilter = UsageFilter.ANY, category = ReplacementCategory.MONGO) public static Object findOneAndUpdate_EM_0(Object mongoCollection, @ThirdPartyCast(actualType = "com.mongodb.client.ClientSession") Object clientSession, @ThirdPartyCast(actualType = "org.bson.conversions.Bson") Object filter, @ThirdPartyCast(actualType = "org.bson.conversions.Bson") Object update) { return handleUpdate("findOneAndUpdateClientSessionBson", mongoCollection, Arrays.asList(clientSession, filter, update), filter); } + /** + * Replacement for {@code MongoCollection.findOneAndUpdate(ClientSession, Bson, Bson, FindOneAndUpdateOptions)}. + *

+ * Present in the MongoDB Java driver from 3.8.0 (not present in 3.7.1). + */ @Replacement(replacingStatic = false, type = ReplacementType.TRACKER, id = "findOneAndUpdateClientSessionBsonFindOneAndUpdateOptions", usageFilter = UsageFilter.ANY, category = ReplacementCategory.MONGO) public static Object findOneAndUpdate(Object mongoCollection, @ThirdPartyCast(actualType = "com.mongodb.client.ClientSession") Object clientSession, @ThirdPartyCast(actualType = "org.bson.conversions.Bson") Object filter, @ThirdPartyCast(actualType = "org.bson.conversions.Bson") Object update, @ThirdPartyCast(actualType = "com.mongodb.client.model.FindOneAndUpdateOptions") Object options) { return handleUpdate("findOneAndUpdateClientSessionBsonFindOneAndUpdateOptions", mongoCollection, Arrays.asList(clientSession, filter, update, options), filter); } - + /** + * Replacement for {@code MongoCollection.findOneAndReplace(Bson, TDocument)}. + *

+ * Present in the MongoDB Java driver from 3.0.0 (the first version with {@code MongoCollection}). + */ @Replacement(replacingStatic = false, type = ReplacementType.TRACKER, id = "findOneAndReplaceBsonTDocument", usageFilter = UsageFilter.ANY, category = ReplacementCategory.MONGO) public static Object findOneAndReplace(Object mongoCollection, @ThirdPartyCast(actualType = "org.bson.conversions.Bson") Object filter, Object replacement) { return handleUpdate("findOneAndReplaceBsonTDocument", mongoCollection, Arrays.asList(filter, replacement), filter); } + /** + * Replacement for {@code MongoCollection.findOneAndReplace(Bson, TDocument, FindOneAndReplaceOptions)}. + *

+ * Present in the MongoDB Java driver from 3.0.0 (the first version with {@code MongoCollection}). + */ @Replacement(replacingStatic = false, type = ReplacementType.TRACKER, id = "findOneAndReplaceBsonTDocumentFindOneAndReplaceOptions", usageFilter = UsageFilter.ANY, category = ReplacementCategory.MONGO) public static Object findOneAndReplace_EM_0(Object mongoCollection, @ThirdPartyCast(actualType = "org.bson.conversions.Bson") Object filter, Object replacement, @ThirdPartyCast(actualType = "com.mongodb.client.model.FindOneAndReplaceOptions") Object options) { return handleUpdate("findOneAndReplaceBsonTDocumentFindOneAndReplaceOptions", mongoCollection, Arrays.asList(filter, replacement, options), filter); } + /** + * Replacement for {@code MongoCollection.findOneAndReplace(ClientSession, Bson, TDocument)}. + *

+ * Present in the MongoDB Java driver from 3.8.0 (not present in 3.7.1). + */ @Replacement(replacingStatic = false, type = ReplacementType.TRACKER, id = "findOneAndReplaceClientSessionBsonTDocument", usageFilter = UsageFilter.ANY, category = ReplacementCategory.MONGO) public static Object findOneAndReplace(Object mongoCollection, @ThirdPartyCast(actualType = "com.mongodb.client.ClientSession") Object clientSession, @ThirdPartyCast(actualType = "org.bson.conversions.Bson") Object filter, Object replacement) { return handleUpdate("findOneAndReplaceClientSessionBsonTDocument", mongoCollection, Arrays.asList(clientSession, filter, replacement), filter); } + /** + * Replacement for {@code MongoCollection.findOneAndReplace(ClientSession, Bson, TDocument, FindOneAndReplaceOptions)}. + *

+ * Present in the MongoDB Java driver from 3.8.0 (not present in 3.7.1). + */ @Replacement(replacingStatic = false, type = ReplacementType.TRACKER, id = "findOneAndReplaceClientSessionBsonTDocumentFindOneAndReplaceOptions", usageFilter = UsageFilter.ANY, category = ReplacementCategory.MONGO) public static Object findOneAndReplace(Object mongoCollection, @ThirdPartyCast(actualType = "com.mongodb.client.ClientSession") Object clientSession, @ThirdPartyCast(actualType = "org.bson.conversions.Bson") Object filter, Object replacement, @ThirdPartyCast(actualType = "com.mongodb.client.model.FindOneAndReplaceOptions") Object options) { return handleUpdate("findOneAndReplaceClientSessionBsonTDocumentFindOneAndReplaceOptions", mongoCollection, Arrays.asList(clientSession, filter, replacement, options), filter); @@ -240,7 +440,7 @@ private static Object handleDelete(String id, Object mongoCollection, List + * This cannot be in {@link MongoCollectionClassReplacement}: all the original methods of a + * replacement class are resolved together, and they all must exist in the driver version + * in use. As count(...) does not exist in recent drivers, having it there would break all the other + * replacements for MongoCollection with those drivers. Here, instead, the methods are resolved + * only if a call to count(...) is replaced, which can only happen with drivers having it. + *

+ * Old versions of Spring Data (2.1 and 2.2) still use count(...) to implement exists and count. + */ +public class MongoCollectionLegacyCountClassReplacement extends MongoOperationClassReplacement { + private static final MongoCollectionLegacyCountClassReplacement singleton = new MongoCollectionLegacyCountClassReplacement(); + + @Override + protected String getNameOfThirdPartyTargetClass() { + return "com.mongodb.client.MongoCollection"; + } + + /** + * Replacement for {@code MongoCollection.count(Bson)}. + *

+ * Present in the MongoDB Java driver from 3.0.0 (the first version with {@code MongoCollection}) until 3.12.14 (the last 3.x version checked); removed in 4.0.0. + */ + @Replacement(replacingStatic = false, type = ReplacementType.TRACKER, id = "countBson", usageFilter = UsageFilter.ANY, category = ReplacementCategory.MONGO) + public static long count(Object mongoCollection, @ThirdPartyCast(actualType = "org.bson.conversions.Bson") Object filter) { + return (long) handleEagerQuery(singleton, "countBson", mongoCollection, Arrays.asList(filter), filter); + } + + /** + * Replacement for {@code MongoCollection.count(Bson, CountOptions)}. + *

+ * Present in the MongoDB Java driver from 3.0.0 (the first version with {@code MongoCollection}) until 3.12.14 (the last 3.x version checked); removed in 4.0.0. + */ + @Replacement(replacingStatic = false, type = ReplacementType.TRACKER, id = "countBsonCountOptions", usageFilter = UsageFilter.ANY, category = ReplacementCategory.MONGO) + public static long count(Object mongoCollection, @ThirdPartyCast(actualType = "org.bson.conversions.Bson") Object filter, @ThirdPartyCast(actualType = "com.mongodb.client.model.CountOptions") Object options) { + return (long) handleEagerQuery(singleton, "countBsonCountOptions", mongoCollection, Arrays.asList(filter, options), filter); + } + + /** + * Replacement for {@code MongoCollection.count(ClientSession, Bson)}. + *

+ * Present in the MongoDB Java driver from 3.8.0 (not present in 3.7.1) until 3.12.14 (the last 3.x version checked); removed in 4.0.0. + */ + @Replacement(replacingStatic = false, type = ReplacementType.TRACKER, id = "countClientSessionBson", usageFilter = UsageFilter.ANY, category = ReplacementCategory.MONGO) + public static long count_EM_0(Object mongoCollection, @ThirdPartyCast(actualType = "com.mongodb.client.ClientSession") Object clientSession, @ThirdPartyCast(actualType = "org.bson.conversions.Bson") Object filter) { + return (long) handleEagerQuery(singleton, "countClientSessionBson", mongoCollection, Arrays.asList(clientSession, filter), filter); + } + + /** + * Replacement for {@code MongoCollection.count(ClientSession, Bson, CountOptions)}. + *

+ * Present in the MongoDB Java driver from 3.8.0 (not present in 3.7.1) until 3.12.14 (the last 3.x version checked); removed in 4.0.0. + */ + @Replacement(replacingStatic = false, type = ReplacementType.TRACKER, id = "countClientSessionBsonCountOptions", usageFilter = UsageFilter.ANY, category = ReplacementCategory.MONGO) + public static long count(Object mongoCollection, @ThirdPartyCast(actualType = "com.mongodb.client.ClientSession") Object clientSession, @ThirdPartyCast(actualType = "org.bson.conversions.Bson") Object filter, @ThirdPartyCast(actualType = "com.mongodb.client.model.CountOptions") Object options) { + return (long) handleEagerQuery(singleton, "countClientSessionBsonCountOptions", mongoCollection, Arrays.asList(clientSession, filter, options), filter); + } +} diff --git a/client-java/instrumentation/src/main/java/org/evomaster/client/java/instrumentation/coverage/methodreplacement/thirdpartyclasses/MongoCollectionPipelineUpdateClassReplacement.java b/client-java/instrumentation/src/main/java/org/evomaster/client/java/instrumentation/coverage/methodreplacement/thirdpartyclasses/MongoCollectionPipelineUpdateClassReplacement.java index aff4f41b2a..bc8983c59a 100644 --- a/client-java/instrumentation/src/main/java/org/evomaster/client/java/instrumentation/coverage/methodreplacement/thirdpartyclasses/MongoCollectionPipelineUpdateClassReplacement.java +++ b/client-java/instrumentation/src/main/java/org/evomaster/client/java/instrumentation/coverage/methodreplacement/thirdpartyclasses/MongoCollectionPipelineUpdateClassReplacement.java @@ -21,7 +21,6 @@ * only if a call with a pipeline is replaced, which can only happen with drivers having it. */ public class MongoCollectionPipelineUpdateClassReplacement extends MongoOperationClassReplacement { - private static final MongoCollectionPipelineUpdateClassReplacement singleton = new MongoCollectionPipelineUpdateClassReplacement(); @Override @@ -109,25 +108,43 @@ public static Object updateMany(Object mongoCollection, @ThirdPartyCast(actualTy return handleEagerQuery(singleton, "updateManyClientSessionBsonPipelineUpdateOptions", mongoCollection, Arrays.asList(clientSession, filter, pipeline, options), filter); } + /** + * Replacement for {@code MongoCollection.findOneAndUpdate(Bson, List)}. + *

+ * Present in the MongoDB Java driver from 3.11.0 (not present in 3.10.2). + */ @Replacement(replacingStatic = false, type = ReplacementType.TRACKER, id = "findOneAndUpdateBsonPipeline", usageFilter = UsageFilter.ANY, category = ReplacementCategory.MONGO) public static Object findOneAndUpdate(Object mongoCollection, @ThirdPartyCast(actualType = "org.bson.conversions.Bson") Object filter, List pipeline) { - return handleEagerQuery(singleton,"findOneAndUpdateBsonPipeline", mongoCollection, Arrays.asList(filter, pipeline), filter); + return handleEagerQuery(singleton, "findOneAndUpdateBsonPipeline", mongoCollection, Arrays.asList(filter, pipeline), filter); } + /** + * Replacement for {@code MongoCollection.findOneAndUpdate(Bson, List, FindOneAndUpdateOptions)}. + *

+ * Present in the MongoDB Java driver from 3.11.0 (not present in 3.10.2). + */ @Replacement(replacingStatic = false, type = ReplacementType.TRACKER, id = "findOneAndUpdateBsonPipelineFindOneAndUpdateOptions", usageFilter = UsageFilter.ANY, category = ReplacementCategory.MONGO) public static Object findOneAndUpdate(Object mongoCollection, @ThirdPartyCast(actualType = "org.bson.conversions.Bson") Object filter, List pipeline, @ThirdPartyCast(actualType = "com.mongodb.client.model.FindOneAndUpdateOptions") Object options) { - return handleEagerQuery(singleton,"findOneAndUpdateBsonPipelineFindOneAndUpdateOptions", mongoCollection, Arrays.asList(filter, pipeline, options), filter); + return handleEagerQuery(singleton, "findOneAndUpdateBsonPipelineFindOneAndUpdateOptions", mongoCollection, Arrays.asList(filter, pipeline, options), filter); } + /** + * Replacement for {@code MongoCollection.findOneAndUpdate(ClientSession, Bson, List)}. + *

+ * Present in the MongoDB Java driver from 3.11.0 (not present in 3.10.2). + */ @Replacement(replacingStatic = false, type = ReplacementType.TRACKER, id = "findOneAndUpdateClientSessionBsonPipeline", usageFilter = UsageFilter.ANY, category = ReplacementCategory.MONGO) public static Object findOneAndUpdate(Object mongoCollection, @ThirdPartyCast(actualType = "com.mongodb.client.ClientSession") Object clientSession, @ThirdPartyCast(actualType = "org.bson.conversions.Bson") Object filter, List pipeline) { - return handleEagerQuery(singleton,"findOneAndUpdateClientSessionBsonPipeline", mongoCollection, Arrays.asList(clientSession, filter, pipeline), filter); + return handleEagerQuery(singleton, "findOneAndUpdateClientSessionBsonPipeline", mongoCollection, Arrays.asList(clientSession, filter, pipeline), filter); } + /** + * Replacement for {@code MongoCollection.findOneAndUpdate(ClientSession, Bson, List, FindOneAndUpdateOptions)}. + *

+ * Present in the MongoDB Java driver from 3.11.0 (not present in 3.10.2). + */ @Replacement(replacingStatic = false, type = ReplacementType.TRACKER, id = "findOneAndUpdateClientSessionBsonPipelineFindOneAndUpdateOptions", usageFilter = UsageFilter.ANY, category = ReplacementCategory.MONGO) public static Object findOneAndUpdate(Object mongoCollection, @ThirdPartyCast(actualType = "com.mongodb.client.ClientSession") Object clientSession, @ThirdPartyCast(actualType = "org.bson.conversions.Bson") Object filter, List pipeline, @ThirdPartyCast(actualType = "com.mongodb.client.model.FindOneAndUpdateOptions") Object options) { - return handleEagerQuery(singleton,"findOneAndUpdateClientSessionBsonPipelineFindOneAndUpdateOptions", mongoCollection, Arrays.asList(clientSession, filter, pipeline, options), filter); + return handleEagerQuery(singleton, "findOneAndUpdateClientSessionBsonPipelineFindOneAndUpdateOptions", mongoCollection, Arrays.asList(clientSession, filter, pipeline, options), filter); } - - } diff --git a/client-java/instrumentation/src/test/java/org/evomaster/client/java/instrumentation/coverage/methodreplacement/ReplacementListTest.java b/client-java/instrumentation/src/test/java/org/evomaster/client/java/instrumentation/coverage/methodreplacement/ReplacementListTest.java index 187d5cbcfd..cbdee4cd56 100644 --- a/client-java/instrumentation/src/test/java/org/evomaster/client/java/instrumentation/coverage/methodreplacement/ReplacementListTest.java +++ b/client-java/instrumentation/src/test/java/org/evomaster/client/java/instrumentation/coverage/methodreplacement/ReplacementListTest.java @@ -1,5 +1,6 @@ package org.evomaster.client.java.instrumentation.coverage.methodreplacement; +import org.evomaster.client.java.instrumentation.coverage.methodreplacement.thirdpartyclasses.MongoCollectionLegacyCountClassReplacement; import org.evomaster.client.java.instrumentation.shared.ReplacementType; import org.junit.jupiter.api.Test; @@ -27,6 +28,14 @@ public void testReplacementMethods() { for (MethodReplacementClass mrc : ReplacementList.getList()) { + if (mrc instanceof MongoCollectionLegacyCountClassReplacement) { + /** + * This is a special case, because the legacy count method is deprecated and removed in MongoDB 4.0, + * so we cannot test it in all environments + */ + continue; + } + //make sure that during testing all third-party libraries are available assertTrue(mrc.isAvailable(), "Not available: " + mrc.getClass().getName()); @@ -193,4 +202,4 @@ private static void checkBaseJdkType(Method m, Class typeToCheck) { m.getDeclaringClass().getName() + "#" + m.getName() ); } -} \ No newline at end of file +} diff --git a/client-java/instrumentation/src/test/java/org/evomaster/client/java/instrumentation/coverage/methodreplacement/thirdpartyclasses/MongoCollectionClassReplacementTest.java b/client-java/instrumentation/src/test/java/org/evomaster/client/java/instrumentation/coverage/methodreplacement/thirdpartyclasses/MongoCollectionClassReplacementTest.java index fcc47c5d55..70d5d21fc4 100644 --- a/client-java/instrumentation/src/test/java/org/evomaster/client/java/instrumentation/coverage/methodreplacement/thirdpartyclasses/MongoCollectionClassReplacementTest.java +++ b/client-java/instrumentation/src/test/java/org/evomaster/client/java/instrumentation/coverage/methodreplacement/thirdpartyclasses/MongoCollectionClassReplacementTest.java @@ -693,9 +693,6 @@ public void testFindOneAndUpdateWithClientSessionFilterAndOptions() { } - - - @Test public void testFindOneAndUpdateWithFilterNoMatch() { final MongoCollection collection = getMongoCollection();