From 3df923bbe9f72ee6eaa032e26dc0cf3465659c0c Mon Sep 17 00:00:00 2001 From: IlyaMuravjov Date: Thu, 20 Jul 2023 18:07:35 +0300 Subject: [PATCH] Make fuzzer use generic field types --- .../org/utbot/fuzzing/providers/Objects.kt | 2 +- .../fuzzing/samples/StringListHolder.java | 20 +++++++++++++ .../org/utbot/fuzzing/JavaFuzzingTest.kt | 28 +++++++++++++++++++ 3 files changed, 49 insertions(+), 1 deletion(-) create mode 100644 utbot-java-fuzzing/src/test/java/org/utbot/fuzzing/samples/StringListHolder.java diff --git a/utbot-java-fuzzing/src/main/kotlin/org/utbot/fuzzing/providers/Objects.kt b/utbot-java-fuzzing/src/main/kotlin/org/utbot/fuzzing/providers/Objects.kt index 68ab56e678..b312c8b46e 100644 --- a/utbot-java-fuzzing/src/main/kotlin/org/utbot/fuzzing/providers/Objects.kt +++ b/utbot-java-fuzzing/src/main/kotlin/org/utbot/fuzzing/providers/Objects.kt @@ -200,7 +200,7 @@ internal fun findAccessibleModifiableFields(description: FuzzedDescription?, cla FieldDescription( name = field.name, type = if (description != null) toFuzzerType( - field.type, + field.genericType, description.typeCache ) else FuzzedType(field.type.id), canBeSetDirectly = isAccessible( diff --git a/utbot-java-fuzzing/src/test/java/org/utbot/fuzzing/samples/StringListHolder.java b/utbot-java-fuzzing/src/test/java/org/utbot/fuzzing/samples/StringListHolder.java new file mode 100644 index 0000000000..88df01f163 --- /dev/null +++ b/utbot-java-fuzzing/src/test/java/org/utbot/fuzzing/samples/StringListHolder.java @@ -0,0 +1,20 @@ +package org.utbot.fuzzing.samples; + +import java.util.List; + +public class StringListHolder { + private List strings; + + + public List getStrings() { + return strings; + } + + + public void setStrings(List strings) { + this.strings = strings; + } + + + public void methodUnderTest() {} +} diff --git a/utbot-java-fuzzing/src/test/kotlin/org/utbot/fuzzing/JavaFuzzingTest.kt b/utbot-java-fuzzing/src/test/kotlin/org/utbot/fuzzing/JavaFuzzingTest.kt index ad3c7b1123..10f6a8d2a9 100644 --- a/utbot-java-fuzzing/src/test/kotlin/org/utbot/fuzzing/JavaFuzzingTest.kt +++ b/utbot-java-fuzzing/src/test/kotlin/org/utbot/fuzzing/JavaFuzzingTest.kt @@ -9,6 +9,7 @@ import org.utbot.framework.plugin.api.UtAssembleModel import org.utbot.framework.plugin.api.UtNullModel import org.utbot.framework.plugin.api.UtPrimitiveModel import org.utbot.framework.plugin.api.util.* +import org.utbot.framework.plugin.api.util.constructor.ValueConstructor import org.utbot.fuzzer.FuzzedConcreteValue import org.utbot.fuzzing.samples.DeepNested import org.utbot.fuzzer.FuzzedType @@ -17,6 +18,7 @@ import org.utbot.fuzzer.IdentityPreservingIdGenerator import org.utbot.fuzzing.providers.NullValueProvider import org.utbot.fuzzing.samples.AccessibleObjects import org.utbot.fuzzing.samples.FailToGenerateListGeneric +import org.utbot.fuzzing.samples.StringListHolder import org.utbot.fuzzing.samples.Stubs import org.utbot.fuzzing.utils.Trie import java.lang.reflect.GenericArrayType @@ -24,6 +26,7 @@ import java.lang.reflect.ParameterizedType import java.lang.reflect.Type import java.util.IdentityHashMap import java.util.concurrent.atomic.AtomicInteger +import kotlin.reflect.jvm.javaMethod internal object TestIdentityPreservingIdGenerator : IdentityPreservingIdGenerator { private val cache = mutableMapOf() @@ -273,6 +276,31 @@ class JavaFuzzingTest { } } + @Test + fun `fuzzer correctly works with settable field that has a parameterized type`() { + val seenStringListHolders = mutableListOf() + var remainingRuns = 100 + runBlockingWithContext { + runJavaFuzzing( + TestIdentityPreservingIdGenerator, + methodUnderTest = StringListHolder::methodUnderTest.javaMethod!!.executableId, + constants = emptyList(), + names = emptyList(), + ) { thisInstance, _, _ -> + thisInstance?.let { + seenStringListHolders.add( + ValueConstructor().construct(listOf(it.model)).single().value as StringListHolder + ) + } + remainingRuns-- + BaseFeedback(Trie.emptyNode(), if (remainingRuns > 0) Control.CONTINUE else Control.STOP) + } + } + val seenStrings = seenStringListHolders.flatMap { it.strings.orEmpty().filterNotNull() } + assertNotEquals(emptyList(), seenStrings) + seenStrings.forEach { assertInstanceOf(String::class.java, it) } + } + @Test fun `value providers override every function of fuzzing in simple case`() { val provided = MarkerValueProvider("p")