@@ -89,130 +89,6 @@ class JavaFuzzingTest {
89
89
assertEquals(probe1, probe2)
90
90
}
91
91
92
- @Test
93
- fun `recursive generic types are recognized correctly` () {
94
- runBlockingWithContext {
95
- val methods = Stubs ::class .java.methods
96
- val method = methods.first { it.name == " resolve" && it.returnType == Int ::class .javaPrimitiveType }
97
- val typeCache = IdentityHashMap <Type , FuzzedType >()
98
- val type = toFuzzerType(method.genericParameterTypes.first(), typeCache)
99
- assertEquals(1 , typeCache.size)
100
- assertTrue(typeCache.values.all { type == = it })
101
- assertEquals(1 , type.generics.size)
102
- assertTrue(typeCache.values.all { type.generics[0 ] == = it })
103
-
104
- try {
105
- // If FuzzerType has implemented `equals` and `hashCode` or is data class,
106
- // that implements those methods implicitly,
107
- // then adding it to hash table throws [StackOverflowError]
108
- val set = HashSet <FuzzedType >()
109
- set + = type
110
- } catch (soe: StackOverflowError ) {
111
- fail(" Looks like FuzzerType implements equals and hashCode, " +
112
- " which leads unstable behaviour in recursive generics " , soe)
113
- }
114
- }
115
- }
116
-
117
- @Test
118
- fun `can pass types through` () {
119
- runBlockingWithContext {
120
- val cache = HashMap <Type , FuzzedType >()
121
- val methods = Stubs ::class .java.methods
122
- val method = methods.first { it.name == " types" }
123
- val types = method.genericParameterTypes.map {
124
- toFuzzerType(it, cache)
125
- }
126
- assertEquals(3 , cache.size) { " Cache should contain following types: List<Number>, Number and T[] for $method " }
127
- assertTrue(cache.keys.any { t ->
128
- t is Class <* > && t == java.lang.Number ::class .java
129
- })
130
- assertTrue(cache.keys.any { t ->
131
- t is ParameterizedType
132
- && t.rawType == java.util.List ::class .java
133
- && t.actualTypeArguments.size == 1
134
- && t.actualTypeArguments.first() == java.lang.Number ::class .java
135
- })
136
- assertTrue(cache.keys.any { t ->
137
- t is GenericArrayType
138
- && t.typeName == " T[]"
139
- })
140
- }
141
- }
142
-
143
- @Test
144
- fun `arrays with generics can be resolved` () {
145
- runBlockingWithContext {
146
- val cache = HashMap <Type , FuzzedType >()
147
- val methods = Stubs ::class .java.methods
148
- val method = methods.first { it.name == " arrayLength" }
149
- method.genericParameterTypes.map {
150
- toFuzzerType(it, cache)
151
- }
152
- assertEquals(4 , cache.size) { " Cache should contain following types: List<Number>, Number and T[] for $method " }
153
- assertTrue(cache.keys.any { t ->
154
- t is Class <* > && t == java.lang.Number ::class .java
155
- })
156
- assertTrue(cache.keys.any { t ->
157
- t is ParameterizedType
158
- && t.rawType == java.util.List ::class .java
159
- && t.actualTypeArguments.size == 1
160
- && t.actualTypeArguments.first().typeName == " T"
161
- })
162
- assertTrue(cache.keys.any { t ->
163
- t is GenericArrayType
164
- && t.typeName == " java.util.List<T>[]"
165
- })
166
- assertTrue(cache.keys.any { t ->
167
- t is GenericArrayType
168
- && t.typeName == " java.util.List<T>[][]"
169
- })
170
- }
171
- }
172
-
173
- @Test
174
- fun `run complex type dependency call` () {
175
- runBlockingWithContext {
176
- val cache = HashMap <Type , FuzzedType >()
177
- val methods = Stubs ::class .java.methods
178
- val method = methods.first { it.name == " example" }
179
- val types = method.genericParameterTypes
180
- assertTrue(types.size == 3 && types[0 ].typeName == " A" && types[1 ].typeName == " B" && types[2 ].typeName == " C" ) { " bad input parameters" }
181
- method.genericParameterTypes.map {
182
- toFuzzerType(it, cache)
183
- }
184
- assertEquals(4 , cache.size)
185
- val typeIterableB = cache[types[0 ].replaceWithUpperBoundUntilNotTypeVariable()]!!
186
- val genericOfIterableB = with (typeIterableB) {
187
- assertEquals(iterableClassId, classId)
188
- assertEquals(1 , generics.size)
189
- generics[0 ]
190
- }
191
- val typeListA = cache[types[1 ].replaceWithUpperBoundUntilNotTypeVariable()]!!
192
- val genericOfListA = with (typeListA) {
193
- assertEquals(java.util.List ::class .id, classId)
194
- assertEquals(1 , generics.size)
195
- generics[0 ]
196
- }
197
- assertEquals(1 , genericOfIterableB.generics.size)
198
- assertEquals(1 , genericOfListA.generics.size)
199
- assertTrue(genericOfIterableB.generics[0 ] == = typeIterableB) { " Because of recursive types generic of B must depend on B itself" }
200
- assertTrue(genericOfListA.generics[0 ] == = typeListA) { " Because of recursive types generic of A must depend on A itself" }
201
-
202
- val typeListC = cache[types[2 ].replaceWithUpperBoundUntilNotTypeVariable()]!!
203
- val genericOfListC = with (typeListC) {
204
- assertEquals(java.util.List ::class .id, classId)
205
- assertEquals(1 , generics.size)
206
- generics[0 ]
207
- }
208
-
209
- assertEquals(1 , genericOfListC.generics.size)
210
- assertEquals(iterableClassId, genericOfListC.generics[0 ].classId)
211
- assertTrue(genericOfListC.generics[0 ].generics[0 ] == = typeListA) { " Generic of C must lead to type A" }
212
-
213
- }
214
- }
215
-
216
92
@Test
217
93
fun `fuzzing should not generate values of private classes` () {
218
94
var exec = 0
@@ -353,16 +229,6 @@ class JavaFuzzingTest {
353
229
assertNotEquals(0 , valueProvider.generate) { " Generate is never called for ${valueProvider.name} " }
354
230
assertEquals(0 , executions) { " Execution must be never called, because of empty seed supply for ${valueProvider.name} " }
355
231
}
356
-
357
- private fun <T > runBlockingWithContext (block : suspend () -> T ) : T {
358
- return withUtContext(UtContext (this ::class .java.classLoader)) {
359
- runBlocking {
360
- withTimeout(10000 ) {
361
- block()
362
- }
363
- }
364
- }
365
- }
366
232
}
367
233
368
234
class MarkerValueProvider <T , R , D : Description <T >>(
0 commit comments