Skip to content

Commit 2724065

Browse files
Plug wrappers for queues in
1 parent d935426 commit 2724065

File tree

3 files changed

+69
-33
lines changed

3 files changed

+69
-33
lines changed

utbot-framework/src/main/kotlin/org/utbot/engine/Extensions.kt

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,13 @@ import soot.jimple.internal.JVirtualInvokeExpr
7474
import soot.jimple.internal.JimpleLocal
7575
import soot.tagkit.ArtificialEntityTag
7676
import java.lang.reflect.ParameterizedType
77+
import java.util.LinkedList
78+
import java.util.ArrayDeque
79+
import java.util.Deque
80+
import java.util.Queue
81+
import kotlin.collections.ArrayList
82+
import kotlin.collections.HashMap
83+
import kotlin.collections.HashSet
7784

7885
val JIdentityStmt.lines: String
7986
get() = tags.joinToString { "$it" }
@@ -256,7 +263,9 @@ val libraryTargets: Map<String, List<String>> = mapOf(
256263
Collection::class.java.name to listOf(ArrayList::class.java.name, HashSet::class.java.name),
257264
List::class.java.name to listOf(ArrayList::class.java.name),
258265
Set::class.java.name to listOf(HashSet::class.java.name),
259-
Map::class.java.name to listOf(HashMap::class.java.name)
266+
Map::class.java.name to listOf(HashMap::class.java.name),
267+
Queue::class.java.name to listOf(LinkedList::class.java.name, ArrayDeque::class.java.name),
268+
Deque::class.java.name to listOf(LinkedList::class.java.name, ArrayDeque::class.java.name)
260269
)
261270

262271
fun Collection<*>.prettify() = joinToString("\n", "\n", "\n")

utbot-framework/src/main/kotlin/org/utbot/engine/ObjectWrappers.kt

Lines changed: 39 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import org.utbot.common.WorkaroundReason.MAKE_SYMBOLIC
44
import org.utbot.common.workaround
55
import org.utbot.engine.UtListClass.UT_ARRAY_LIST
66
import org.utbot.engine.UtListClass.UT_LINKED_LIST
7+
import org.utbot.engine.UtListClass.UT_LINKED_LIST_WITH_NULLABLE_CHECK
78
import org.utbot.engine.UtOptionalClass.UT_OPTIONAL
89
import org.utbot.engine.UtOptionalClass.UT_OPTIONAL_DOUBLE
910
import org.utbot.engine.UtOptionalClass.UT_OPTIONAL_INT
@@ -71,8 +72,12 @@ val classToWrapper: MutableMap<TypeToBeWrapped, WrapperType> =
7172
putSootClass(CopyOnWriteArrayList::class, UT_ARRAY_LIST.className)
7273
putSootClass(java.util.LinkedList::class, UT_LINKED_LIST.className)
7374
putSootClass(java.util.AbstractSequentialList::class, UT_LINKED_LIST.className)
74-
// TODO mistake JIRA:1495
75-
putSootClass(java.util.ArrayDeque::class, UT_LINKED_LIST.className)
75+
76+
putSootClass(java.util.ArrayDeque::class, UT_LINKED_LIST_WITH_NULLABLE_CHECK.className)
77+
putSootClass(java.util.concurrent.ConcurrentLinkedDeque::class, UT_LINKED_LIST_WITH_NULLABLE_CHECK.className)
78+
putSootClass(java.util.concurrent.ConcurrentLinkedQueue::class, UT_LINKED_LIST_WITH_NULLABLE_CHECK.className)
79+
putSootClass(java.util.concurrent.LinkedBlockingDeque::class, UT_LINKED_LIST_WITH_NULLABLE_CHECK.className)
80+
putSootClass(java.util.concurrent.LinkedBlockingQueue::class, UT_LINKED_LIST_WITH_NULLABLE_CHECK.className)
7681

7782
putSootClass(java.util.Set::class, UtHashSet::class)
7883
putSootClass(java.util.AbstractSet::class, UtHashSet::class)
@@ -83,6 +88,7 @@ val classToWrapper: MutableMap<TypeToBeWrapped, WrapperType> =
8388
putSootClass(java.util.AbstractMap::class, UtHashMap::class)
8489
putSootClass(java.util.LinkedHashMap::class, UtHashMap::class)
8590
putSootClass(java.util.HashMap::class, UtHashMap::class)
91+
putSootClass(java.util.concurrent.ConcurrentHashMap::class, UtHashMap::class)
8692

8793
putSootClass(java.util.stream.BaseStream::class, UT_STREAM.className)
8894
putSootClass(java.util.stream.Stream::class, UT_STREAM.className)
@@ -143,48 +149,50 @@ private val wrappers = mapOf(
143149
wrap(AssociativeArray::class) { type, addr ->
144150
objectValue(type, addr, AssociativeArrayWrapper())
145151
},
152+
146153
// list wrappers
147-
wrap(java.util.List::class) { _, addr ->
148-
objectValue(ARRAY_LIST_TYPE, addr, ListWrapper(UT_ARRAY_LIST))
149-
},
150-
wrap(java.util.AbstractList::class) { _, addr ->
151-
objectValue(ARRAY_LIST_TYPE, addr, ListWrapper(UT_ARRAY_LIST))
152-
},
153-
wrap(java.util.ArrayList::class) { _, addr ->
154-
objectValue(ARRAY_LIST_TYPE, addr, ListWrapper(UT_ARRAY_LIST))
155-
},
156-
wrap(CopyOnWriteArrayList::class) { _, addr ->
157-
objectValue(ARRAY_LIST_TYPE, addr, ListWrapper(UT_ARRAY_LIST))
158-
},
154+
wrap(java.util.List::class) { _, addr -> objectValue(ARRAY_LIST_TYPE, addr, ListWrapper(UT_ARRAY_LIST)) },
155+
wrap(java.util.AbstractList::class) { _, addr -> objectValue(ARRAY_LIST_TYPE, addr, ListWrapper(UT_ARRAY_LIST)) },
156+
wrap(java.util.ArrayList::class) { _, addr -> objectValue(ARRAY_LIST_TYPE, addr, ListWrapper(UT_ARRAY_LIST)) },
159157

160-
wrap(java.util.LinkedList::class) { _, addr ->
161-
objectValue(LINKED_LIST_TYPE, addr, ListWrapper(UT_LINKED_LIST))
162-
},
163-
wrap(java.util.AbstractSequentialList::class) { _, addr ->
164-
objectValue(LINKED_LIST_TYPE, addr, ListWrapper(UT_LINKED_LIST))
158+
159+
wrap(CopyOnWriteArrayList::class) { type, addr -> objectValue(type, addr, ListWrapper(UT_ARRAY_LIST)) },
160+
161+
wrap(java.util.LinkedList::class) { _, addr -> objectValue(LINKED_LIST_TYPE, addr, ListWrapper(UT_LINKED_LIST)) },
162+
wrap(java.util.AbstractSequentialList::class) { _, addr -> objectValue(LINKED_LIST_TYPE, addr, ListWrapper(UT_LINKED_LIST)) },
163+
164+
// queue, deque wrappers
165+
wrap(java.util.ArrayDeque::class) { type, addr ->
166+
objectValue(type, addr, ListWrapper(UT_LINKED_LIST_WITH_NULLABLE_CHECK))
165167
},
166-
// TODO mistake JIRA:1495
167-
wrap(java.util.ArrayDeque::class) { _, addr ->
168-
objectValue(LINKED_LIST_TYPE, addr, ListWrapper(UT_LINKED_LIST))
168+
wrap(java.util.ArrayDeque::class) { type, addr ->
169+
objectValue(type, addr, ListWrapper(UT_LINKED_LIST_WITH_NULLABLE_CHECK))
169170
},
170-
// set wrappers
171-
wrap(java.util.Set::class) { _, addr ->
172-
objectValue(LINKED_HASH_SET_TYPE, addr, SetWrapper())
171+
wrap(java.util.concurrent.ConcurrentLinkedDeque::class) { type, addr ->
172+
objectValue(type, addr, ListWrapper(UT_LINKED_LIST_WITH_NULLABLE_CHECK))
173173
},
174-
wrap(java.util.AbstractSet::class) { _, addr ->
175-
objectValue(LINKED_HASH_SET_TYPE, addr, SetWrapper())
174+
wrap(java.util.concurrent.ConcurrentLinkedQueue::class) { type, addr ->
175+
objectValue(type, addr, ListWrapper(UT_LINKED_LIST_WITH_NULLABLE_CHECK))
176176
},
177-
wrap(java.util.HashSet::class) { _, addr ->
178-
objectValue(HASH_SET_TYPE, addr, SetWrapper())
177+
wrap(java.util.concurrent.LinkedBlockingDeque::class) { type, addr ->
178+
objectValue(type, addr, ListWrapper(UT_LINKED_LIST_WITH_NULLABLE_CHECK))
179179
},
180-
wrap(java.util.LinkedHashSet::class) { _, addr ->
181-
objectValue(LINKED_HASH_SET_TYPE, addr, SetWrapper())
180+
wrap(java.util.concurrent.LinkedBlockingQueue::class) { type, addr ->
181+
objectValue(type, addr, ListWrapper(UT_LINKED_LIST_WITH_NULLABLE_CHECK))
182182
},
183+
184+
// set wrappers
185+
wrap(java.util.Set::class) { _, addr -> objectValue(LINKED_HASH_SET_TYPE, addr, SetWrapper()) },
186+
wrap(java.util.AbstractSet::class) { _, addr -> objectValue(LINKED_HASH_SET_TYPE, addr, SetWrapper()) },
187+
wrap(java.util.HashSet::class) { _, addr -> objectValue(HASH_SET_TYPE, addr, SetWrapper()) },
188+
wrap(java.util.LinkedHashSet::class) { _, addr -> objectValue(LINKED_HASH_SET_TYPE, addr, SetWrapper()) },
189+
183190
// map wrappers
184191
wrap(java.util.Map::class) { _, addr -> objectValue(LINKED_HASH_MAP_TYPE, addr, MapWrapper()) },
185192
wrap(java.util.AbstractMap::class) { _, addr -> objectValue(LINKED_HASH_MAP_TYPE, addr, MapWrapper()) },
186193
wrap(java.util.LinkedHashMap::class) { _, addr -> objectValue(LINKED_HASH_MAP_TYPE, addr, MapWrapper()) },
187194
wrap(java.util.HashMap::class) { _, addr -> objectValue(HASH_MAP_TYPE, addr, MapWrapper()) },
195+
wrap(java.util.concurrent.ConcurrentHashMap::class) { _, addr -> objectValue(HASH_MAP_TYPE, addr, MapWrapper()) },
188196

189197
// stream wrappers
190198
wrap(java.util.stream.BaseStream::class) { _, addr -> objectValue(STREAM_TYPE, addr, CommonStreamWrapper()) },

utbot-framework/src/main/kotlin/org/utbot/engine/Traverser.kt

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2437,6 +2437,9 @@ class Traverser(
24372437
val method = invokeExpr.retrieveMethod()
24382438
val parameters = resolveParameters(invokeExpr.args, method.parameterTypes)
24392439
val invocation = Invocation(instance, method, parameters, InvocationTarget(instance, method))
2440+
2441+
// Calls with super syntax are represented by invokeSpecial instruction, but we don't support them in wrappers
2442+
// TODO: https://github.com/UnitTestBot/UTBotJava/issues/819 -- Support super calls in inherited wrappers
24402443
return commonInvokePart(invocation)
24412444
}
24422445

@@ -2455,7 +2458,23 @@ class Traverser(
24552458
* Returns results of native calls cause other calls push changes directly to path selector.
24562459
*/
24572460
private fun TraversalContext.commonInvokePart(invocation: Invocation): List<MethodResult> {
2458-
// First, check if there is override for the invocation itself, not for the targets
2461+
/**
2462+
* First, check if there is override for the invocation itself, not for the targets.
2463+
*
2464+
* Note that calls with super syntax are represented by invokeSpecial instruction, but we don't support them in wrappers,
2465+
* so here we resolve [invocation] to the inherited method invocation if it's something like:
2466+
*
2467+
* ```java
2468+
* public class InheritedWrapper extends BaseWrapper {
2469+
* public void add(Object o) {
2470+
* // some stuff
2471+
* super.add(o); // this resolves to InheritedWrapper::add instead of BaseWrapper::add
2472+
* }
2473+
* }
2474+
* ```
2475+
*
2476+
* TODO: https://github.com/UnitTestBot/UTBotJava/issues/819 -- Support super calls in inherited wrappers
2477+
*/
24592478
val artificialMethodOverride = overrideInvocation(invocation, target = null)
24602479

24612480
// If so, return the result of the override

0 commit comments

Comments
 (0)