@@ -18,6 +18,7 @@ import org.evomaster.core.problem.httpws.service.HttpWsSampler
1818import org.evomaster.core.problem.rest.*
1919import org.evomaster.core.problem.rest.builder.RestActionBuilderV3
2020import org.evomaster.core.problem.rest.builder.RestActionBuilderV3.buildActionBasedOnUrl
21+ import org.evomaster.core.problem.rest.builder.RestGeneSpecialNames
2122import org.evomaster.core.problem.rest.data.Endpoint
2223import org.evomaster.core.problem.rest.data.HttpVerb
2324import org.evomaster.core.problem.rest.data.RestCallAction
@@ -35,10 +36,11 @@ import org.evomaster.core.problem.rest.service.AIResponseClassifier
3536import org.evomaster.core.problem.rest.service.RestIndividualBuilder
3637import org.evomaster.core.remote.SutProblemException
3738import org.evomaster.core.search.action.Action
39+ import org.evomaster.core.search.gene.collection.EnumGene
3840import org.evomaster.core.search.gene.wrapper.CustomMutationRateGene
3941import org.evomaster.core.search.gene.wrapper.OptionalGene
4042import org.evomaster.core.search.gene.string.StringGene
41- import org.evomaster.core.search.service.WarningsAggregator
43+ import org.evomaster.core.search.service.DataPool
4244import org.evomaster.core.search.tracer.Traceable
4345import org.evomaster.core.search.warning.GeneralWarning
4446import org.evomaster.core.search.warning.WarningCategory
@@ -47,6 +49,7 @@ import org.slf4j.LoggerFactory
4749import javax.annotation.PostConstruct
4850
4951
52+
5053abstract class AbstractRestSampler : HttpWsSampler <RestIndividual >() {
5154
5255 companion object {
@@ -68,6 +71,9 @@ abstract class AbstractRestSampler : HttpWsSampler<RestIndividual>() {
6871 @Inject
6972 protected lateinit var externalServiceHandler: HttpWsExternalServiceHandler
7073
74+ @Inject
75+ protected lateinit var dataPool: DataPool
76+
7177 protected val adHocInitialIndividuals: MutableList <RestIndividual > = mutableListOf ()
7278
7379 lateinit var schemaHolder: RestSchema
@@ -139,6 +145,10 @@ abstract class AbstractRestSampler : HttpWsSampler<RestIndividual>() {
139145 initializeDerivedParamRules(problem.derivedParams)
140146 }
141147
148+ if (config.useObjectExampleDataPool){
149+ feedObjectExamplesToDataPool(actionCluster)
150+ }
151+
142152 initSqlInfo(infoDto)
143153
144154 initHostnameInfo(infoDto)
@@ -162,6 +172,8 @@ abstract class AbstractRestSampler : HttpWsSampler<RestIndividual>() {
162172 log.debug(" Done initializing {}" , AbstractRestSampler ::class .simpleName)
163173 }
164174
175+
176+
165177 override fun sampleRandomAction (noAuthP : Double ): HttpWsAction {
166178
167179 val action = super .sampleRandomAction(noAuthP)
@@ -334,6 +346,10 @@ abstract class AbstractRestSampler : HttpWsSampler<RestIndividual>() {
334346 initSeededTests()
335347 }
336348
349+ if (config.useObjectExampleDataPool){
350+ feedObjectExamplesToDataPool(actionCluster)
351+ }
352+
337353 log.debug(" Done initializing {}" , AbstractRestSampler ::class .simpleName)
338354 }
339355
@@ -434,4 +450,18 @@ abstract class AbstractRestSampler : HttpWsSampler<RestIndividual>() {
434450 }
435451 }
436452
453+ private fun feedObjectExamplesToDataPool (actionCluster : Map <String , Action >) {
454+
455+ actionCluster.values.asSequence()
456+ .flatMap { it.seeAllGenes() }
457+ .filterIsInstance<EnumGene <String >>()
458+ // Not the cleanest option, but adding a further tag on Gene would likely had been worse.
459+ // This is based on what done in RestActionBuilderV3
460+ .filter{! it.treatAsNotString && it.valueNames== null && it.values.size == 1 }
461+ .filter{g -> RestGeneSpecialNames .entries.none { e -> e.name == g.name } }
462+ .forEach {
463+ dataPool.addValue(it.name, it.getValueAsRawString())
464+ }
465+ }
466+
437467}
0 commit comments