Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,8 @@ public class ControllerConstants {

public static final String REDIS_INSERTION = "/redisInsertion";

public static final String DYNAMODB_INSERTION = "/dynamoDbInsertion";

public static final String POST_SEARCH_ACTION = "/postSearchAction";

public static final String DERIVE_PARAMS = "/deriveParams";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -119,6 +119,11 @@ public final void setExecutingInitRedis(boolean executingInitRedis) {
ExecutionTracer.setExecutingInitRedis(executingInitRedis);
}

@Override
public final void setExecutingInitDynamoDb(boolean executingInitDynamoDb) {
ExecutionTracer.setExecutingInitDynamoDB(executingInitDynamoDb);
}

@Override
public final void setExecutingAction(boolean executingAction){
ExecutionTracer.setExecutingAction(executingAction);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -530,6 +530,14 @@ public final void setExecutingInitRedis(boolean executingInitRedis) {
ExecutionTracer.setExecutingInitRedis(executingInitRedis);
}

@Override
public final void setExecutingInitDynamoDb(boolean executingInitDynamoDb) {
checkInstrumentation();
serverController.setExecutingInitDynamoDb(executingInitDynamoDb);
// sync executingInitDynamoDb on the local ExecutionTracer
ExecutionTracer.setExecutingInitDynamoDB(executingInitDynamoDb);
}

@Override
public final void setExecutingAction(boolean executingAction){
checkInstrumentation();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,14 @@ default void setupForGeneratedTest(){}

RedisInsertionResultsDto execInsertionsIntoRedisDatabase(List<RedisInsertionDto> insertions);

/**
* Executes DynamoDB initialization insertions.
*
* @param insertions items to insert
* @return insertion results
*/
DynamoDbInsertionResultsDto execInsertionsIntoDynamoDb(List<DynamoDbInsertionDto> insertions);

/**
* <p>
* return an instance of a client of an RPC service.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
import org.evomaster.client.java.controller.api.dto.problem.rpc.ScheduleTaskInvocationsDto;
import org.evomaster.client.java.controller.api.dto.problem.rpc.ScheduleTaskInvocationsResult;
import org.evomaster.client.java.controller.mongo.MongoScriptRunner;
import org.evomaster.client.java.controller.dynamodb.DynamoDbCommandExecutor;
import org.evomaster.client.java.controller.problem.*;
import org.evomaster.client.java.controller.redis.RedisCommandExecutor;
import org.evomaster.client.java.controller.redis.ReflectionBasedRedisClient;
Expand Down Expand Up @@ -1065,4 +1066,47 @@ public Response executeRedisInsertion(
sutController.setExecutingInitRedis(false);
}
}

/**
* Executes DynamoDB initialization insertions.
*
* @param dto insertion commands
* @param httpServletRequest request metadata
* @return insertion results
*/
@Path(ControllerConstants.DYNAMODB_INSERTION)
@Consumes(Formats.JSON_V1)
@POST
public Response executeDynamoDbInsertion(
DynamoDbDatabaseCommandsDto dto,
@Context HttpServletRequest httpServletRequest) {

assert trackRequestSource(httpServletRequest);
try {
sutController.setExecutingInitDynamoDb(true);
Object connection = noKillSwitch(sutController::getDynamoDbConnection);
if (connection == null) {
return Response.status(400)
.entity(WrappedResponseDto.withError("No active DynamoDB connection")).build();
}
if (dto == null || dto.insertions == null || dto.insertions.isEmpty()) {
return Response.status(400)
.entity(WrappedResponseDto.withError("No input command")).build();
}
if (dto.insertions.stream().anyMatch(i -> i == null || i.tableName == null
|| i.tableName.isEmpty() || i.attributes == null || i.attributes.isEmpty())) {
return Response.status(400)
.entity(WrappedResponseDto.withError("Insertion with no table or attributes")).build();
}
DynamoDbInsertionResultsDto results = DynamoDbCommandExecutor.executeInsert(
connection, dto.insertions);
return Response.status(200).entity(WrappedResponseDto.withData(results)).build();
} catch (RuntimeException e) {
String msg = "Thrown exception: " + e.getMessage();
SimpleLogger.error(msg, e);
return Response.status(500).entity(WrappedResponseDto.withError(msg)).build();
} finally {
sutController.setExecutingInitDynamoDb(false);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,8 @@
import org.evomaster.client.java.controller.internal.db.OpenSearchHandler;
import org.evomaster.client.java.controller.internal.db.redis.RedisHandler;
import org.evomaster.client.java.controller.internal.db.dynamodb.DynamoDbHandler;
import org.evomaster.client.java.controller.internal.db.dynamodb.DynamoDbCommandWithDistance;
import org.evomaster.client.java.controller.dynamodb.DynamoDbCommandExecutor;
import org.evomaster.client.java.controller.redis.RedisCommandExecutor;
import org.evomaster.client.java.controller.redis.ReflectionBasedRedisClient;
import org.evomaster.client.java.sql.DbCleaner;
Expand Down Expand Up @@ -314,6 +316,15 @@ public RedisInsertionResultsDto execInsertionsIntoRedisDatabase(
return RedisCommandExecutor.executeInsert(connection, insertions);
}

@Override
public DynamoDbInsertionResultsDto execInsertionsIntoDynamoDb(List<DynamoDbInsertionDto> insertions) {
Object connection = getDynamoDbConnection();
if (connection == null) {
throw new IllegalStateException("No connection to DynamoDB");
}
return DynamoDbCommandExecutor.executeInsert(connection, insertions);
}

public int getActionIndex(){
return actionIndex;
}
Expand Down Expand Up @@ -476,7 +487,7 @@ private boolean isRedisHeuristicsComputationAllowed() {
}

private boolean isDynamoDbHeuristicsComputationAllowed() {
return dynamoDbHandler.isCalculateHeuristics();
return dynamoDbHandler.isCalculateHeuristics() || dynamoDbHandler.isExtractDynamoDbExecution();
}

private void computeSQLHeuristics(ExtraHeuristicsDto dto, List<AdditionalInfo> additionalInfoList, boolean queryFromDatabase) {
Expand Down Expand Up @@ -658,23 +669,26 @@ public final void computeRedisHeuristics(ExtraHeuristicsDto dto, List<Additional
*/
public final void computeDynamoDbHeuristics(ExtraHeuristicsDto dto,
List<AdditionalInfo> additionalInfoList) {
if (!dynamoDbHandler.isCalculateHeuristics()) {
return;
}
if (!additionalInfoList.isEmpty()) {
AdditionalInfo last = additionalInfoList.get(additionalInfoList.size() - 1);
last.getDynamoDbInfoData().forEach(dynamoDbHandler::handle);
}

dynamoDbHandler.getEvaluatedDynamoDbCommands().stream()
.map(evaluated -> new ExtraHeuristicEntryDto(
ExtraHeuristicEntryDto.Type.DYNAMODB,
ExtraHeuristicEntryDto.Objective.MINIMIZE_TO_ZERO,
evaluated.getHeuristicId(),
evaluated.getDistanceWithMetrics().getDistance(),
evaluated.getDistanceWithMetrics().getNumberOfEvaluatedItems(),
evaluated.getDistanceWithMetrics().isEvaluationFailure()))
.forEach(dto.heuristics::add);
List<DynamoDbCommandWithDistance> evaluated = dynamoDbHandler.getEvaluatedDynamoDbCommands();
if (dynamoDbHandler.isCalculateHeuristics()) {
evaluated.stream()
.map(command -> new ExtraHeuristicEntryDto(
ExtraHeuristicEntryDto.Type.DYNAMODB,
ExtraHeuristicEntryDto.Objective.MINIMIZE_TO_ZERO,
command.getHeuristicId(),
command.getDistanceWithMetrics().getDistance(),
command.getDistanceWithMetrics().getNumberOfEvaluatedItems(),
command.getDistanceWithMetrics().isEvaluationFailure()))
.forEach(dto.heuristics::add);
}
if (dynamoDbHandler.isExtractDynamoDbExecution()) {
dto.dynamoDbExecutionsDto = dynamoDbHandler.getExecutionDto();
}
}

/**
Expand Down Expand Up @@ -1713,6 +1727,8 @@ public abstract List<TargetInfo> getTargetInfos(Collection<Integer> ids,

public abstract void setExecutingInitRedis(boolean executingInitRedis);

public abstract void setExecutingInitDynamoDb(boolean executingInitDynamoDb);

public abstract void setExecutingAction(boolean executingAction);


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -529,6 +529,10 @@ class SamplerVerifierTest {
return null
}

override fun executeDynamoDbInsertions(dto: DynamoDbDatabaseCommandsDto): DynamoDbInsertionResultsDto? {
return null
}

override fun getSutInfo(): SutInfoDto? {
return sutInfoDto
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -190,6 +190,10 @@ class SamplerWithArazzoVerifierTest {
return null
}

override fun executeDynamoDbInsertions(dto: DynamoDbDatabaseCommandsDto): DynamoDbInsertionResultsDto? {
return null
}

override fun getSutInfo(): SutInfoDto? {
return sutInfoDto
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,9 @@ abstract class ResourceTestBase : ExtractTestBaseH2(), ResourceBasedTestInterfac
return null
}

override fun executeDynamoDbInsertions(dto: DynamoDbDatabaseCommandsDto): DynamoDbInsertionResultsDto? {
return null
}
override fun executeDatabaseCommandAndGetQueryResults(dto: DatabaseCommandDto): QueryResultDto? {
return SqlScriptRunner.execCommand(connection, dto.command).toDto()
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,4 +34,10 @@ interface DatabaseExecutor {
* Return the result of whether it success
*/
fun executeRedisDatabaseInsertions(dto: RedisDatabaseCommandsDto): RedisInsertionResultsDto?
}

/**
* Execute the given INSERT DynamoDB command (in DTO format).
* Return the result of whether it success
*/
fun executeDynamoDbInsertions(dto: DynamoDbDatabaseCommandsDto): DynamoDbInsertionResultsDto?
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package org.evomaster.core.problem.enterprise
import org.evomaster.core.database.mongo.MongoDbAction
import org.evomaster.core.problem.externalservice.HostnameResolutionAction
import org.evomaster.core.database.redis.RedisDbAction
import org.evomaster.core.database.dynamodb.DynamoDbAction
import org.evomaster.core.scheduletask.ScheduleTaskAction
import org.evomaster.core.search.action.Action
import org.evomaster.core.search.action.ActionComponent
Expand All @@ -23,6 +24,7 @@ import org.evomaster.core.database.sql.SqlAction
return SqlAction::class.java.isAssignableFrom(t)
|| MongoDbAction::class.java.isAssignableFrom(t)
|| RedisDbAction::class.java.isAssignableFrom(t)
|| DynamoDbAction::class.java.isAssignableFrom(t)
|| HostnameResolutionAction::class.java.isAssignableFrom(t)
|| ScheduleTaskAction::class.java.isAssignableFrom(t)
}
Expand Down
Loading
Loading