Skip to content

Commit f64a5b7

Browse files
committed
Avoid using anyObjectValueProvider that is removed in #2583
1 parent 9ea8815 commit f64a5b7

File tree

4 files changed

+50
-21
lines changed

4 files changed

+50
-21
lines changed

utbot-framework/src/main/kotlin/org/utbot/framework/context/custom/MockingJavaFuzzingContext.kt

+18-15
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,26 @@
11
package org.utbot.framework.context.custom
22

33
import org.utbot.framework.context.JavaFuzzingContext
4+
import org.utbot.framework.plugin.api.UtNullModel
45
import org.utbot.framework.plugin.api.ExecutableId
56
import org.utbot.fuzzer.FuzzedType
67
import org.utbot.fuzzing.JavaValueProvider
8+
import org.utbot.fuzzing.Seed
79
import org.utbot.fuzzing.providers.AnyDepthNullValueProvider
8-
import org.utbot.fuzzing.providers.MapValueProvider
10+
import org.utbot.fuzzing.providers.AnyObjectValueProvider
911
import org.utbot.fuzzing.spring.unit.MockValueProvider
10-
import org.utbot.fuzzing.providers.NullValueProvider
11-
import org.utbot.fuzzing.providers.ObjectValueProvider
12-
import org.utbot.fuzzing.providers.StringValueProvider
13-
import org.utbot.fuzzing.providers.anyObjectValueProvider
12+
import org.utbot.fuzzing.spring.decorators.filterSeeds
1413
import org.utbot.fuzzing.spring.decorators.filterTypes
1514
import org.utbot.instrumentation.instrumentation.execution.UtConcreteExecutionResult
1615

1716
/**
1817
* Makes fuzzer to use mocks in accordance with [mockPredicate].
1918
*
2019
* NOTE:
21-
* - fuzzer won't mock types, that have *specific* value providers (e.g. [MapValueProvider] and [StringValueProvider])
22-
* - [ObjectValueProvider] and [NullValueProvider] do not count as *specific* value providers
23-
* - fuzzer may still resort to mocks despite [mockPredicate] if it can't create other non-null values or at runtime
20+
* - fuzzer won't mock types, that have *specific* value providers
21+
* (i.e. ones that do not implement [AnyObjectValueProvider])
22+
* - fuzzer may still resort to mocks despite [mockPredicate] and *specific*
23+
* value providers if it can't create other non-null values or at runtime
2424
*/
2525
fun JavaFuzzingContext.useMocks(mockPredicate: (FuzzedType) -> Boolean) =
2626
MockingJavaFuzzingContext(delegateContext = this, mockPredicate)
@@ -32,17 +32,20 @@ class MockingJavaFuzzingContext(
3232
private val mockValueProvider = MockValueProvider(delegateContext.idGenerator)
3333

3434
override val valueProvider: JavaValueProvider =
35-
// NOTE: we first remove `NullValueProvider` and `ObjectValueProvider` from `delegateContext.valueProvider`
36-
// and then add them back as a part of our `withFallback` so they have the same priority as
37-
// `mockValueProvider`, otherwise mocks will never be used where `null` or new object can be used.
35+
3836
delegateContext.valueProvider
39-
.except { it is NullValueProvider }
40-
.except { it is ObjectValueProvider }
37+
// NOTE: we first remove `AnyObjectValueProvider` and `NullValueProvider` from `delegateContext.valueProvider`
38+
// and then add them back as a part of our `withFallback` so they have the same priority as
39+
// `mockValueProvider`, otherwise mocks will never be used where `null` or new object can be used.
40+
.except { it is AnyObjectValueProvider }
4141
.withFallback(
4242
mockValueProvider.filterTypes(mockPredicate)
43-
.with(anyObjectValueProvider(idGenerator).filterTypes { !mockPredicate(it) })
43+
.with(
44+
delegateContext.valueProvider
45+
.filterTypes { !mockPredicate(it) }
46+
.filterSeeds { (it as? Seed.Simple)?.value?.model !is UtNullModel }
47+
)
4448
.withFallback(mockValueProvider.with(AnyDepthNullValueProvider))
45-
.with(NullValueProvider)
4649
)
4750

4851
override fun handleFuzzedConcreteExecutionResult(

utbot-java-fuzzing/src/main/kotlin/org/utbot/fuzzing/providers/Objects.kt

+11-4
Original file line numberDiff line numberDiff line change
@@ -70,9 +70,16 @@ fun anyObjectValueProvider(idGenerator: IdentityPreservingIdGenerator<Int>) =
7070
ovp.withFallback(AbstractsObjectValueProvider(idGenerator))
7171
}
7272

73+
/**
74+
* Marker interface that shows that this [JavaValueProvider] can potentially provide values of
75+
* arbitrary types, unlike type-specific value providers that were designed to provide values of
76+
* few specific popular types (e.g. `List`, `String`, etc.).
77+
*/
78+
interface AnyObjectValueProvider : JavaValueProvider
79+
7380
class ObjectValueProvider(
7481
val idGenerator: IdGenerator<Int>,
75-
) : JavaValueProvider {
82+
) : AnyObjectValueProvider {
7683

7784
override fun accept(type: FuzzedType) = !isIgnored(type.classId)
7885

@@ -140,7 +147,7 @@ class ObjectValueProvider(
140147
}
141148

142149
@Suppress("unused")
143-
object NullValueProvider : JavaValueProvider {
150+
object NullValueProvider : AnyObjectValueProvider {
144151

145152
override fun enrich(description: FuzzedDescription, type: FuzzedType, scope: Scope) {
146153
// any value in static function is ok to fuzz
@@ -170,7 +177,7 @@ object NullValueProvider : JavaValueProvider {
170177
*
171178
* Intended to be used as a last fallback.
172179
*/
173-
object AnyDepthNullValueProvider : JavaValueProvider {
180+
object AnyDepthNullValueProvider : AnyObjectValueProvider {
174181

175182
override fun accept(type: FuzzedType) = type.classId.isRefType
176183

@@ -185,7 +192,7 @@ object AnyDepthNullValueProvider : JavaValueProvider {
185192
*/
186193
class AbstractsObjectValueProvider(
187194
val idGenerator: IdGenerator<Int>,
188-
) : JavaValueProvider {
195+
) : AnyObjectValueProvider {
189196

190197
override fun accept(type: FuzzedType) = type.classId.isRefType && !isKnownTypes(type.classId)
191198

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package org.utbot.fuzzing.spring.decorators
2+
3+
import org.utbot.fuzzing.Description
4+
import org.utbot.fuzzing.Seed
5+
import org.utbot.fuzzing.ValueProvider
6+
7+
fun <T, R, D : Description<T>> ValueProvider<T, R, D>.filterSeeds(predicate: (Seed<T, R>) -> Boolean) =
8+
SeedFilteringValueProvider(delegate = this, predicate)
9+
10+
class SeedFilteringValueProvider<T, R, D : Description<T>>(
11+
delegate: ValueProvider<T, R, D>,
12+
private val predicate: (Seed<T, R>) -> Boolean
13+
) : ValueProviderDecorator<T, R, D>(delegate) {
14+
override fun wrap(provider: ValueProvider<T, R, D>): ValueProvider<T, R, D> =
15+
provider.filterSeeds(predicate)
16+
17+
override fun generate(description: D, type: T): Sequence<Seed<T, R>> =
18+
delegate.generate(description, type).filter(predicate)
19+
}

utbot-java-fuzzing/src/main/kotlin/org/utbot/fuzzing/spring/decorators/FilteredValueProvider.kt renamed to utbot-java-fuzzing/src/main/kotlin/org/utbot/fuzzing/spring/decorators/TypeFilteringValueProvider.kt

+2-2
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,9 @@ import org.utbot.fuzzing.Description
44
import org.utbot.fuzzing.ValueProvider
55

66
fun <T, R, D : Description<T>> ValueProvider<T, R, D>.filterTypes(predicate: (T) -> Boolean) =
7-
FilteredValueProvider(delegate = this, predicate)
7+
TypeFilteringValueProvider(delegate = this, predicate)
88

9-
class FilteredValueProvider<T, R, D : Description<T>>(
9+
class TypeFilteringValueProvider<T, R, D : Description<T>>(
1010
delegate: ValueProvider<T, R, D>,
1111
private val predicate: (T) -> Boolean
1212
) : ValueProviderDecorator<T, R, D>(delegate) {

0 commit comments

Comments
 (0)