Skip to content

Commit c19bf8d

Browse files
committed
Merge branch 'streamline-testing' of https://github.com/LearnLib/alex into streamline-testing
2 parents b80bda2 + 1c673df commit c19bf8d

File tree

45 files changed

+251
-231
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

45 files changed

+251
-231
lines changed

backend/src/main/java/de/learnlib/alex/data/dao/ProjectEnvironmentDAO.java

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -34,17 +34,16 @@
3434
import de.learnlib.alex.learning.repositories.LearnerSetupRepository;
3535
import de.learnlib.alex.testing.repositories.TestExecutionConfigRepository;
3636
import de.learnlib.alex.testing.repositories.TestReportRepository;
37+
import java.util.ArrayList;
38+
import java.util.List;
39+
import java.util.stream.Collectors;
40+
import javax.validation.ValidationException;
3741
import org.apache.shiro.authz.UnauthorizedException;
3842
import org.hibernate.Hibernate;
3943
import org.springframework.beans.factory.annotation.Autowired;
4044
import org.springframework.stereotype.Service;
4145
import org.springframework.transaction.annotation.Transactional;
4246

43-
import javax.validation.ValidationException;
44-
import java.util.ArrayList;
45-
import java.util.List;
46-
import java.util.stream.Collectors;
47-
4847
@Service
4948
@Transactional(rollbackFor = Exception.class)
5049
public class ProjectEnvironmentDAO {

backend/src/main/java/de/learnlib/alex/data/services/export/ProjectExporter.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,12 +34,11 @@
3434
import de.learnlib.alex.testing.entities.export.TestExecutionConfigExportableEntity;
3535
import de.learnlib.alex.testing.entities.export.TestsExportableEntity;
3636
import de.learnlib.alex.testing.services.export.TestsExporter;
37+
import java.util.List;
3738
import org.springframework.beans.factory.annotation.Autowired;
3839
import org.springframework.stereotype.Service;
3940
import org.springframework.transaction.annotation.Transactional;
4041

41-
import java.util.List;
42-
4342
@Service
4443
@Transactional(rollbackFor = Exception.class, readOnly = true)
4544
public class ProjectExporter extends EntityExporter {

backend/src/main/java/de/learnlib/alex/learning/repositories/LearnerSetupRepository.java

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,24 +16,20 @@
1616

1717
package de.learnlib.alex.learning.repositories;
1818

19-
import de.learnlib.alex.data.entities.ProjectEnvironment;
2019
import de.learnlib.alex.learning.entities.LearnerSetup;
20+
import java.util.List;
2121
import org.springframework.data.jpa.repository.JpaRepository;
2222
import org.springframework.data.jpa.repository.Query;
2323
import org.springframework.data.repository.query.Param;
2424
import org.springframework.stereotype.Repository;
2525

26-
import java.util.List;
27-
2826
@Repository
2927
public interface LearnerSetupRepository extends JpaRepository<LearnerSetup, Long> {
3028

3129
List<LearnerSetup> findAllByProject_Id(Long projectId);
3230

3331
void deleteAllByProject_Id(Long projectId);
3432

35-
List<LearnerSetup> findAllByEnvironmentsContains(ProjectEnvironment environment);
36-
3733
@Query(value = "select ls "
3834
+ "from LearnerSetup ls join ls.environments e "
3935
+ "where ls.project.id = :projectId and e.id = :environmentId")

backend/src/main/java/de/learnlib/alex/learning/rest/LearnerSetupResource.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@
3232
import org.springframework.beans.factory.annotation.Autowired;
3333
import org.springframework.http.HttpStatus;
3434
import org.springframework.http.ResponseEntity;
35-
import org.springframework.transaction.annotation.Transactional;
3635
import org.springframework.validation.annotation.Validated;
3736
import org.springframework.web.bind.annotation.DeleteMapping;
3837
import org.springframework.web.bind.annotation.GetMapping;
@@ -45,7 +44,6 @@
4544

4645
@RestController
4746
@RequestMapping("/rest/projects/{projectId}/learner/setups")
48-
@Transactional(rollbackFor = Exception.class)
4947
public class LearnerSetupResource {
5048

5149
private final AuthContext authContext;

backend/src/main/java/de/learnlib/alex/learning/services/LearnerService.java

Lines changed: 29 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -64,12 +64,12 @@
6464
import org.springframework.context.annotation.Lazy;
6565
import org.springframework.stereotype.Service;
6666
import org.springframework.transaction.annotation.Transactional;
67+
import org.springframework.transaction.support.TransactionTemplate;
6768

6869
/**
6970
* Basic class to control and monitor a learn process. This class is a high level abstraction of the LearnLib.
7071
*/
7172
@Service
72-
@Transactional(rollbackFor = Exception.class)
7373
public class LearnerService {
7474

7575
private static final Logger logger = LoggerFactory.getLogger(LearnerService.class);
@@ -91,6 +91,7 @@ public enum LearnerPhase {
9191
private final ApplicationContext applicationContext;
9292
private final TestService testService;
9393
private final UserDAO userDAO;
94+
private final TransactionTemplate transactionTemplate;
9495

9596
/** The learner threads for users (userId -> thread). */
9697
private final Map<Long, LearnerThread> learnerThreads;
@@ -102,14 +103,16 @@ public LearnerService(LearnerSetupDAO learnerSetupDAO,
102103
PreparedConnectorContextHandlerFactory contextHandlerFactory,
103104
ProjectDAO projectDAO,
104105
@Lazy TestService testService,
105-
UserDAO userDAO) {
106+
UserDAO userDAO,
107+
TransactionTemplate transactionTemplate) {
106108
this.learnerSetupDAO = learnerSetupDAO;
107109
this.learnerResultDAO = learnerResultDAO;
108110
this.contextHandlerFactory = contextHandlerFactory;
109111
this.projectDAO = projectDAO;
110112
this.applicationContext = applicationContext;
111113
this.testService = testService;
112114
this.userDAO = userDAO;
115+
this.transactionTemplate = transactionTemplate;
113116

114117
this.learnerThreads = new HashMap<>();
115118
}
@@ -131,22 +134,27 @@ public LearnerService(LearnerSetupDAO learnerSetupDAO,
131134
* If the symbols specified in the configuration could not be found.
132135
*/
133136
public LearnerResult start(User user, Project project, LearnerStartConfiguration startConfiguration) {
134-
User userInDb = this.userDAO.getByID(user.getId());
137+
final var userInDb = this.userDAO.getByID(user.getId());
135138
checkRunningProcesses(userInDb, project.getId());
136139

137-
final var setup = startConfiguration.getSetup();
138-
final var createdSetup = setup.getId() != null ? setup : learnerSetupDAO.create(user, project.getId(), setup);
140+
final var createdResult = transactionTemplate.execute(t -> {
141+
final var setup = startConfiguration.getSetup();
142+
final var createdSetup = setup.getId() != null ? setup : learnerSetupDAO.create(user, project.getId(), setup);
139143

140-
final var options = startConfiguration.getOptions();
141-
if (options.getComment() == null || options.getComment().trim().equals("")) {
142-
options.setComment(createdSetup.getName());
143-
}
144+
final var options = startConfiguration.getOptions();
145+
if (options.getComment() == null || options.getComment().trim().equals("")) {
146+
options.setComment(createdSetup.getName());
147+
}
144148

145-
final var result = new LearnerResult();
146-
result.setSetup(createdSetup);
147-
result.setComment(startConfiguration.getOptions().getComment());
149+
final var result = new LearnerResult();
150+
result.setSetup(createdSetup);
151+
result.setComment(startConfiguration.getOptions().getComment());
148152

149-
final var createdResult = learnerResultDAO.create(user, project.getId(), result);
153+
final var r = learnerResultDAO.create(user, project.getId(), result);
154+
t.flush();
155+
156+
return r;
157+
});
150158

151159
enqueueLearningProcess(
152160
project.getId(),
@@ -168,8 +176,9 @@ public LearnerResult start(User user, Project project, LearnerStartConfiguration
168176
* @param configuration
169177
* The configuration to use for the next learning steps.
170178
*/
179+
@Transactional(rollbackFor = Exception.class)
171180
public LearnerResult resume(User user, Long projectId, Long testNo, LearnerResumeConfiguration configuration) {
172-
User userInDb = this.userDAO.getByID(user.getId());
181+
final var userInDb = this.userDAO.getByID(user.getId());
173182
checkRunningProcesses(userInDb, projectId);
174183

175184
configuration.checkConfiguration();
@@ -266,6 +275,7 @@ private void validateCounterexample(User user, LearnerResult result, LearnerResu
266275
* @param projectId
267276
* The id of the project that is learned.
268277
*/
278+
@Transactional(rollbackFor = Exception.class)
269279
public void abort(User user, Long projectId, Long testNo) {
270280
final var project = projectDAO.getByID(user, projectId); // access check
271281
final var result = learnerResultDAO.getByTestNo(user, projectId, testNo);
@@ -294,10 +304,12 @@ public boolean isActive(Long projectId) {
294304
return learnerThreads.containsKey(projectId);
295305
}
296306

307+
@Transactional(rollbackFor = Exception.class)
297308
public boolean hasRunningOrPendingTasks(User user, Long projectId) {
298309
if (!isActive(projectId)) {
299310
return false;
300311
}
312+
301313
LearnerStatus learnerStatus = this.getStatus(user, projectId);
302314

303315
List<LearnerResult> currentProcessSingletonList = Optional.ofNullable(learnerStatus.getCurrentProcess())
@@ -326,6 +338,7 @@ public long getNumberOfUserOwnedLearnProcesses(User user) {
326338
* The id of the project.
327339
* @return A snapshot of the Learner status.
328340
*/
341+
@Transactional(rollbackFor = Exception.class)
329342
public LearnerStatus getStatus(User user, Long projectId) {
330343
if (isActive(projectId)) {
331344
final var thread = learnerThreads.get(projectId);
@@ -373,6 +386,7 @@ public LearnerStatus getStatus(User user, Long projectId) {
373386
* @throws LearnerException
374387
* If something went wrong while testing the symbols.
375388
*/
389+
@Transactional(rollbackFor = Exception.class)
376390
public List<ExecuteResult> readOutputs(User user, Project project, ProjectEnvironment environment, ParameterizedSymbol resetSymbol,
377391
List<ParameterizedSymbol> symbols, ParameterizedSymbol postSymbol, WebDriverConfig driverConfig)
378392
throws LearnerException {
@@ -399,6 +413,7 @@ public List<ExecuteResult> readOutputs(User user, Project project, ProjectEnviro
399413
* The config to use.
400414
* @return The outputs of the SUL.
401415
*/
416+
@Transactional(rollbackFor = Exception.class)
402417
public List<ExecuteResult> readOutputs(
403418
User user,
404419
Project project,

backend/src/main/java/de/learnlib/alex/learning/services/export/TestExecutionConfigsExporter.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,12 +28,11 @@
2828
import de.learnlib.alex.testing.entities.Test;
2929
import de.learnlib.alex.testing.entities.TestExecutionConfig;
3030
import de.learnlib.alex.testing.entities.export.TestExecutionConfigExportableEntity;
31+
import java.util.List;
3132
import org.springframework.beans.factory.annotation.Autowired;
3233
import org.springframework.stereotype.Service;
3334
import org.springframework.transaction.annotation.Transactional;
3435

35-
import java.util.List;
36-
3736
@Service
3837
@Transactional(rollbackFor = Exception.class, readOnly = true)
3938
public class TestExecutionConfigsExporter extends EntityExporter {

backend/src/main/java/de/learnlib/alex/testing/dao/TestExecutionConfigDAO.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,15 +33,13 @@
3333
import java.util.Map;
3434
import java.util.Optional;
3535
import java.util.stream.Collectors;
36-
36+
import javax.persistence.EntityManager;
3737
import org.apache.shiro.authz.UnauthorizedException;
3838
import org.hibernate.Hibernate;
3939
import org.springframework.beans.factory.annotation.Autowired;
4040
import org.springframework.stereotype.Service;
4141
import org.springframework.transaction.annotation.Transactional;
4242

43-
import javax.persistence.EntityManager;
44-
4543
@Service
4644
@Transactional(rollbackFor = Exception.class)
4745
public class TestExecutionConfigDAO {

backend/src/main/java/de/learnlib/alex/testing/rest/TestExecutionConfigResource.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,10 @@
2020
import de.learnlib.alex.security.AuthContext;
2121
import de.learnlib.alex.testing.dao.TestExecutionConfigDAO;
2222
import de.learnlib.alex.testing.entities.TestExecutionConfig;
23-
import java.util.List;
24-
import javax.ws.rs.core.MediaType;
25-
2623
import de.learnlib.alex.testing.entities.TestQueueItem;
2724
import de.learnlib.alex.testing.services.TestService;
25+
import java.util.List;
26+
import javax.ws.rs.core.MediaType;
2827
import org.springframework.beans.factory.annotation.Autowired;
2928
import org.springframework.http.HttpStatus;
3029
import org.springframework.http.ResponseEntity;

backend/src/main/java/de/learnlib/alex/testing/rest/TestResource.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@
3232
import de.learnlib.alex.testing.services.export.TestsExporter;
3333
import de.learnlib.alex.webhooks.services.WebhookService;
3434
import java.util.List;
35-
import javax.print.attribute.standard.Media;
3635
import javax.ws.rs.core.MediaType;
3736
import org.springframework.beans.factory.annotation.Autowired;
3837
import org.springframework.data.domain.Page;

backend/src/main/java/de/learnlib/alex/testing/services/TestService.java

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -28,14 +28,6 @@
2828
import de.learnlib.alex.testing.entities.TestQueueItem;
2929
import de.learnlib.alex.testing.entities.TestReport;
3030
import de.learnlib.alex.testing.entities.TestStatus;
31-
import org.apache.shiro.authz.UnauthorizedException;
32-
import org.springframework.beans.factory.annotation.Autowired;
33-
import org.springframework.context.ApplicationContext;
34-
import org.springframework.context.annotation.Lazy;
35-
import org.springframework.stereotype.Service;
36-
import org.springframework.transaction.annotation.Transactional;
37-
import org.springframework.transaction.support.TransactionTemplate;
38-
3931
import java.util.Collections;
4032
import java.util.HashMap;
4133
import java.util.List;
@@ -44,6 +36,13 @@
4436
import java.util.Optional;
4537
import java.util.stream.Collectors;
4638
import java.util.stream.Stream;
39+
import org.apache.shiro.authz.UnauthorizedException;
40+
import org.springframework.beans.factory.annotation.Autowired;
41+
import org.springframework.context.ApplicationContext;
42+
import org.springframework.context.annotation.Lazy;
43+
import org.springframework.stereotype.Service;
44+
import org.springframework.transaction.annotation.Transactional;
45+
import org.springframework.transaction.support.TransactionTemplate;
4746

4847
/** The service that executes tests. */
4948
@Service
@@ -93,7 +92,7 @@ public TestQueueItem start(User user, Long projectId, TestExecutionConfig config
9392
final var project = projectDAO.getByID(user, projectId);
9493
User userInDb = this.userDAO.getByID(user.getId());
9594

96-
final var createdReport = transactionTemplate.execute((t) -> {
95+
final var createdReport = transactionTemplate.execute(t -> {
9796
checkRunningProcesses(userInDb, projectId);
9897

9998
final var r = new TestReport();
@@ -102,7 +101,10 @@ public TestQueueItem start(User user, Long projectId, TestExecutionConfig config
102101
r.setProject(project);
103102
r.setDescription(config.getDescription());
104103

105-
return testReportDAO.create(user, projectId, r);
104+
final var cr = testReportDAO.create(user, projectId, r);
105+
t.flush();
106+
107+
return cr;
106108
});
107109

108110
final var item = new TestProcessQueueItem(

0 commit comments

Comments
 (0)