Skip to content

Commit

Permalink
Merge pull request #41 from Amaralus/exec-runtime-2
Browse files Browse the repository at this point in the history
Exec runtime
  • Loading branch information
Amaralus authored Dec 16, 2023
2 parents 5e62d95 + 34fd470 commit b825829
Show file tree
Hide file tree
Showing 24 changed files with 277 additions and 137 deletions.
2 changes: 1 addition & 1 deletion docker/docker-compose.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ version: '3.7'
services:

no-code-qa-platform:
image: 'amaralus/qa-platform:0.0.25'
image: 'amaralus/qa-platform:0.0.26'
container_name: qa-platform
volumes:
- ./data/qa-platform:/rocksdb
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "no-code-qa-platform",
"version": "0.0.25",
"version": "0.0.26",
"license": "Apache-2.0",
"dependencies": {
"react": "^16.5.2",
Expand Down
2 changes: 1 addition & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@

<groupId>apps.amaralus</groupId>
<artifactId>no-code-qa-platform</artifactId>
<version>0.0.25</version>
<version>0.0.26</version>
<packaging>jar</packaging>

<licenses>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
package apps.amaralus.qa.platform.runtime;

import apps.amaralus.qa.platform.runtime.execution.ExecutionGraph;
import apps.amaralus.qa.platform.runtime.execution.ExecutionGraphDelegate;
import apps.amaralus.qa.platform.runtime.execution.StageTask;
import apps.amaralus.qa.platform.runtime.report.TestCaseReport;
import apps.amaralus.qa.platform.runtime.report.Timer;
import lombok.Getter;
import apps.amaralus.qa.platform.runtime.report.ReportSupplier;
import apps.amaralus.qa.platform.runtime.report.TestReport;
import lombok.Setter;
import lombok.extern.slf4j.Slf4j;

Expand All @@ -14,26 +14,14 @@
import static apps.amaralus.qa.platform.runtime.TestState.*;

@Slf4j
public class ExecutableTestCase implements StageTask {

@Getter
private final TestCaseInfo testCaseInfo;
private final AtomicBoolean canceled = new AtomicBoolean();
public class ExecutableTestCase extends ExecutableTestSupport implements StageTask, ExecutionGraphDelegate {
private final AtomicBoolean failed = new AtomicBoolean();
private final Timer timer;
@Setter
private ExecutionGraph stepsExecutionGraph;
@Getter
private List<ExecutableTestStep> testSteps;
private ExecutionGraph executionGraph;
@Setter
private Runnable taskFinishCallback;
@Setter
@Getter
private TestState state = CREATED;

public ExecutableTestCase(TestCaseInfo testCaseInfo) {
this.testCaseInfo = testCaseInfo;
timer = new Timer();
public ExecutableTestCase(TestInfo testInfo) {
super(testInfo);
}

@Override
Expand All @@ -43,16 +31,17 @@ public void execute() {

timer.start();
setState(RUNNING);
stepsExecutionGraph.execute();
executionGraph.execute();
}

public void stepsGraphFinishedCallback() {
@Override
public void executionGraphFinishedCallback() {
if (!isCanceled() && !isFailed()) {
setState(COMPLETED);
timer.stop();
}

log.debug("Test {}#\"{}\" finished as {}", testCaseInfo.id(), testCaseInfo.name(), state);
log.debug("Test {}#\"{}\" finished as {}", testInfo.id(), testInfo.name(), state);
if (taskFinishCallback != null)
taskFinishCallback.run();
}
Expand All @@ -62,41 +51,41 @@ public void testStepFailCallback() {
setState(FAILED);
timer.stop();

stepsExecutionGraph.cancel();
stepsGraphFinishedCallback();
executionGraph.cancel();
executionGraphFinishedCallback();
}

@Override
public void cancel() {
if (isFailed())
return;
canceled.set(true);
super.cancel();
setState(CANCELED);
timer.stop();
stepsExecutionGraph.cancel();
}

@Override
public boolean isCanceled() {
return canceled.get();
executionGraph.cancel();
}

public boolean isFailed() {
return failed.get();
}

public void setTestSteps(List<ExecutableTestStep> testSteps) {
this.testSteps = testSteps;
testSteps.forEach(testStep -> testStep.setTaskFailCallback(this::testStepFailCallback));
@Override
public void setExecutionGraph(ExecutionGraph executionGraph) {
this.executionGraph = executionGraph;
getTestSteps().forEach(testStep -> testStep.setTaskFailCallback(this::testStepFailCallback));
}

public TestCaseReport getReport() {
return new TestCaseReport(
testCaseInfo.name(),
state,
timer.getElapsedAsLocalTime(),
getTestSteps().stream()
.map(ExecutableTestStep::getReport)
.toList());
public List<ExecutableTestStep> getTestSteps() {
return executionGraph.getTasks(ExecutableTestStep.class);
}

@Override
public TestReport getReport() {
var report = super.getReport();
report.setSubReports(getTestSteps().stream()
.map(ReportSupplier::getReport)
.toList());
report.setDeep(1);
return report;
}
}
Original file line number Diff line number Diff line change
@@ -1,35 +1,55 @@
package apps.amaralus.qa.platform.runtime;

import apps.amaralus.qa.platform.runtime.execution.Cancelable;
import apps.amaralus.qa.platform.runtime.execution.Executable;
import apps.amaralus.qa.platform.runtime.execution.ExecutionGraph;
import lombok.RequiredArgsConstructor;
import apps.amaralus.qa.platform.runtime.execution.ExecutionGraphDelegate;
import apps.amaralus.qa.platform.runtime.report.ReportSupplier;
import apps.amaralus.qa.platform.runtime.report.TestReport;
import lombok.Setter;

import java.util.List;
import java.util.concurrent.atomic.AtomicBoolean;

@RequiredArgsConstructor
public class ExecutableTestPlan implements Executable, Cancelable {
import static apps.amaralus.qa.platform.runtime.TestState.*;

private final ExecutionGraph executionGraph;
private final List<ExecutableTestCase> testCases;
private final AtomicBoolean canceled = new AtomicBoolean();
public class ExecutableTestPlan extends ExecutableTestSupport implements ExecutionGraphDelegate {
@Setter
private ExecutionGraph executionGraph;

public ExecutableTestPlan(TestInfo testInfo) {
super(testInfo);
}

@Override
public void execute() {
if (isCanceled())
return;

timer.start();
setState(RUNNING);
executionGraph.execute();
}

@Override
public void cancel() {
canceled.set(true);
super.cancel();
setState(CANCELED);
executionGraph.cancel();
}

@Override
public boolean isCanceled() {
return canceled.get();
public void executionGraphFinishedCallback() {
setState(COMPLETED);
}

public List<ExecutableTestCase> getTestCases() {
return executionGraph.getTasks(ExecutableTestCase.class);
}

@Override
public TestReport getReport() {
var report = super.getReport();
report.setSubReports(getTestCases().stream()
.map(ReportSupplier::getReport)
.toList());
return report;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,33 +5,26 @@
import apps.amaralus.qa.platform.runtime.execution.RuntimeExecutorAware;
import apps.amaralus.qa.platform.runtime.execution.StageTask;
import apps.amaralus.qa.platform.runtime.report.TestReport;
import apps.amaralus.qa.platform.runtime.report.Timer;
import apps.amaralus.qa.platform.runtime.result.ErrorResult;
import apps.amaralus.qa.platform.runtime.result.ExecutionResult;
import apps.amaralus.qa.platform.runtime.result.TestFailedException;
import apps.amaralus.qa.platform.runtime.result.TimeoutResult;
import com.google.common.base.Throwables;
import lombok.Getter;
import lombok.Setter;
import lombok.extern.slf4j.Slf4j;

import java.util.concurrent.CancellationException;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicBoolean;

import static apps.amaralus.qa.platform.runtime.TestState.*;

@Slf4j
public class ExecutableTestStep implements StageTask, RuntimeExecutorAware {
public class ExecutableTestStep extends ExecutableTestSupport implements StageTask, RuntimeExecutorAware {

@Getter
private final TestStepInfo testStepInfo;
private final StepAction stepAction;
// временно тут
private final TestContext testContext = new TestContext();
private final AtomicBoolean canceled = new AtomicBoolean();
private final Timer timer;
@Setter
private TestContext testContext;
@Setter
private RuntimeExecutor runtimeExecutor;
private long timeout;
Expand All @@ -40,19 +33,14 @@ public class ExecutableTestStep implements StageTask, RuntimeExecutorAware {
private Runnable taskFinishCallback;
@Setter
private Runnable taskFailCallback;
@Getter
@Setter
private TestState state = CREATED;
@Getter
private String resultMessage = "";
private CompletableFuture<ExecutionResult> stepTask;

public ExecutableTestStep(TestStepInfo testStepInfo, StepAction stepAction) {
this.testStepInfo = testStepInfo;
public ExecutableTestStep(TestInfo testInfo, StepAction stepAction) {
super(testInfo);
this.stepAction = stepAction;
timer = new Timer();
}


@Override
public void execute() {
if (isCanceled())
Expand All @@ -71,21 +59,16 @@ public void execute() {

@Override
public void cancel() {
canceled.set(true);
super.cancel();
if (stepTask != null)
// значение true никак не влияет на прерывание потока, всегда работает как false
stepTask.cancel(false);
else {
timer.stop();
state = CANCELED;
setState(CANCELED);
}
}

@Override
public boolean isCanceled() {
return canceled.get();
}

private ExecutionResult executeAction() {
stepAction.execute(testContext);
return testContext.getExecutionResult();
Expand Down Expand Up @@ -115,7 +98,7 @@ else if (result.isCanceled())

timer.stop();
resultMessage = result.message();
log.debug("Step \"{}\" finished as {}: {}", testStepInfo.name(), state, resultMessage);
log.debug("Step \"{}\" finished as {}: {}", testInfo.name(), state, resultMessage);
}

private ExecutionResult handleException(Throwable throwable) {
Expand Down Expand Up @@ -143,7 +126,10 @@ public void timeout(long timeout, TimeUnit timeUnit) {
this.timeUnit = timeUnit;
}

@Override
public TestReport getReport() {
return new TestReport(testStepInfo.name(), state, resultMessage, timer.getElapsedAsLocalTime());
var report = super.getReport();
report.setDeep(2);
return report;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package apps.amaralus.qa.platform.runtime;

import apps.amaralus.qa.platform.runtime.execution.Cancelable;
import apps.amaralus.qa.platform.runtime.execution.Executable;
import apps.amaralus.qa.platform.runtime.report.ReportSupplier;
import apps.amaralus.qa.platform.runtime.report.TestReport;
import apps.amaralus.qa.platform.runtime.report.Timer;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import lombok.Setter;

import java.util.concurrent.atomic.AtomicBoolean;

import static apps.amaralus.qa.platform.runtime.TestState.CREATED;

@RequiredArgsConstructor
public abstract class ExecutableTestSupport implements Executable, Cancelable, ReportSupplier {
@Getter
protected final TestInfo testInfo;
protected final Timer timer = new Timer();
protected final AtomicBoolean canceled = new AtomicBoolean();
@Getter
protected String resultMessage = "";
@Setter
@Getter
protected TestState state = CREATED;

@Override
public void cancel() {
canceled.set(true);
}

@Override
public boolean isCanceled() {
return canceled.get();
}

@Override
public TestReport getReport() {
return new TestReport(testInfo, state, resultMessage, timer.getElapsedAsLocalTime());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,12 @@

import apps.amaralus.qa.platform.runtime.action.ActionType;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.concurrent.TimeUnit;

@Data
@NoArgsConstructor
public class StepExecutionProperties {
private long executionAction;
private ActionType actionType = ActionType.NONE;
Expand Down
Loading

0 comments on commit b825829

Please sign in to comment.