Skip to content

Commit 2635c7a

Browse files
author
Alexander Bainczyk
committed
Merge branch 'streamline-testing' into developer
2 parents 108ea4b + 1c673df commit 2635c7a

File tree

81 files changed

+1704
-234
lines changed

Some content is hidden

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

81 files changed

+1704
-234
lines changed

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

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -46,8 +46,10 @@
4646
import de.learnlib.alex.modelchecking.entities.LtsFormula;
4747
import de.learnlib.alex.modelchecking.entities.LtsFormulaSuite;
4848
import de.learnlib.alex.testing.dao.TestDAO;
49+
import de.learnlib.alex.testing.dao.TestExecutionConfigDAO;
4950
import de.learnlib.alex.testing.dao.TestReportDAO;
5051
import de.learnlib.alex.testing.entities.Test;
52+
import de.learnlib.alex.testing.entities.TestExecutionConfig;
5153
import de.learnlib.alex.testing.entities.TestSuite;
5254
import de.learnlib.alex.testing.repositories.TestExecutionConfigRepository;
5355
import de.learnlib.alex.testing.repositories.TestReportRepository;
@@ -60,6 +62,7 @@
6062
import java.util.Collection;
6163
import java.util.HashMap;
6264
import java.util.List;
65+
import java.util.Map;
6366
import java.util.stream.Collectors;
6467
import javax.validation.ValidationException;
6568
import org.apache.shiro.authz.UnauthorizedException;
@@ -106,6 +109,7 @@ public class ProjectDAO {
106109
private final LtsFormulaDAO ltsFormulaDAO;
107110
private final LearnerResultStepRepository learnerResultStepRepository;
108111
private final LearnerSetupDAO learnerSetupDAO;
112+
private final TestExecutionConfigDAO testExecutionConfigDAO;
109113

110114
@Autowired
111115
public ProjectDAO(ProjectRepository projectRepository,
@@ -133,8 +137,8 @@ public ProjectDAO(ProjectRepository projectRepository,
133137
@Lazy TestReportDAO testReportDAO,
134138
@Lazy LtsFormulaSuiteDAO ltsFormulaSuiteDAO,
135139
@Lazy LtsFormulaDAO ltsFormulaDAO,
136-
@Lazy LearnerSetupDAO learnerSetupDAO
137-
) {
140+
@Lazy LearnerSetupDAO learnerSetupDAO,
141+
@Lazy TestExecutionConfigDAO testExecutionConfigDAO) {
138142
this.projectRepository = projectRepository;
139143
this.learnerResultRepository = learnerResultRepository;
140144
this.fileDAO = fileDAO;
@@ -161,6 +165,7 @@ public ProjectDAO(ProjectRepository projectRepository,
161165
this.ltsFormulaDAO = ltsFormulaDAO;
162166
this.learnerResultStepRepository = learnerResultStepRepository;
163167
this.learnerSetupDAO = learnerSetupDAO;
168+
this.testExecutionConfigDAO = testExecutionConfigDAO;
164169
}
165170

166171
public Project create(final User user, final CreateProjectForm projectForm) {
@@ -243,13 +248,13 @@ public void delete(User user, Long projectId) {
243248

244249
symbolActionRepository.deleteAllBySymbol_Project_Id(projectId);
245250
symbolStepRepository.deleteAllBySymbol_Project_Id(projectId);
251+
testExecutionConfigRepository.deleteAllByProject_Id(projectId);
246252
testReportRepository.deleteAllByProject_Id(projectId);
247253
testRepository.deleteAllByProject_Id(projectId);
248254
learnerResultStepRepository.deleteAllByResult_Project_Id(projectId);
249255
learnerResultRepository.deleteAllByProject_Id(projectId);
250256
learnerSetupRepository.deleteAllByProject_Id(projectId);
251257
parameterizedSymbolRepository.deleteAllBySymbol_Project_Id(projectId);
252-
testExecutionConfigRepository.deleteAllByProject_Id(projectId);
253258
symbolParameterRepository.deleteAllBySymbol_Project_Id(projectId);
254259
uploadableFileRepository.deleteAllByProject_Id(projectId);
255260

@@ -290,13 +295,15 @@ public Project importProject(User user, ProjectExportableEntity projectExportabl
290295
final List<Test> tests;
291296
final List<LtsFormulaSuite> formulaSuites;
292297
final List<LearnerSetup> learnerSetups;
298+
final List<TestExecutionConfig> testExecutionConfigs;
293299

294300
try {
295301
project = om.readValue(projectExportableEntity.getProject().toString(), Project.class);
296302
groups = Arrays.asList(om.readValue(projectExportableEntity.getGroups().toString(), SymbolGroup[].class));
297303
tests = Arrays.asList(om.readValue(projectExportableEntity.getTests().toString(), Test[].class));
298304
formulaSuites = Arrays.asList(om.readValue(projectExportableEntity.getFormulaSuites().toString(), LtsFormulaSuite[].class));
299305
learnerSetups = Arrays.asList(om.readValue(projectExportableEntity.getLearnerSetups().toString(), LearnerSetup[].class));
306+
testExecutionConfigs = Arrays.asList(om.readValue(projectExportableEntity.getTestExecutionConfigs().toString(), TestExecutionConfig[].class));
300307
} catch (IOException e) {
301308
e.printStackTrace();
302309
throw new ValidationException("The input is not formatted correctly");
@@ -331,8 +338,14 @@ public Project importProject(User user, ProjectExportableEntity projectExportabl
331338

332339
symbolGroupDAO.importGroups(user, createdProject, groups, new HashMap<>());
333340

341+
/* oldTestId -> newTestId
342+
* maps the exported testids to the corresponding newly created ones,
343+
* enabling correct referencing when importing testExecutionConfigs
344+
*/
345+
Map<Long, Long> configRefMap = new HashMap<>();
346+
334347
if (!tests.isEmpty()) {
335-
testDAO.importTests(user, createdProject.getId(), tests);
348+
testDAO.importTests(user, createdProject.getId(), tests, configRefMap);
336349
}
337350

338351
for (LtsFormulaSuite suite : formulaSuites) {
@@ -346,6 +359,10 @@ public Project importProject(User user, ProjectExportableEntity projectExportabl
346359
learnerSetupDAO.importLearnerSetups(user, createdProject, learnerSetups);
347360
}
348361

362+
if (!testExecutionConfigs.isEmpty()) {
363+
testExecutionConfigDAO.importTestExecutionConfigs(user, createdProject, testExecutionConfigs, configRefMap);
364+
}
365+
349366
loadLazyRelations(createdProject);
350367
return createdProject;
351368
}

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

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
package de.learnlib.alex.data.dao;
1818

1919
import de.learnlib.alex.auth.entities.User;
20+
import de.learnlib.alex.common.exceptions.ForbiddenOperationException;
2021
import de.learnlib.alex.common.exceptions.NotFoundException;
2122
import de.learnlib.alex.data.entities.Project;
2223
import de.learnlib.alex.data.entities.ProjectEnvironment;
@@ -30,8 +31,8 @@
3031
import de.learnlib.alex.data.repositories.ProjectRepository;
3132
import de.learnlib.alex.data.repositories.ProjectUrlRepository;
3233
import de.learnlib.alex.data.repositories.SymbolActionRepository;
33-
import de.learnlib.alex.learning.entities.LearnerSetup;
3434
import de.learnlib.alex.learning.repositories.LearnerSetupRepository;
35+
import de.learnlib.alex.testing.repositories.TestExecutionConfigRepository;
3536
import de.learnlib.alex.testing.repositories.TestReportRepository;
3637
import java.util.ArrayList;
3738
import java.util.List;
@@ -55,6 +56,7 @@ public class ProjectEnvironmentDAO {
5556
private final SymbolActionRepository symbolActionRepository;
5657
private final TestReportRepository testReportRepository;
5758
private final LearnerSetupRepository learnerSetupRepository;
59+
private final TestExecutionConfigRepository testExecutionConfigRepository;
5860

5961
@Autowired
6062
public ProjectEnvironmentDAO(ProjectDAO projectDAO,
@@ -64,7 +66,8 @@ public ProjectEnvironmentDAO(ProjectDAO projectDAO,
6466
ProjectUrlRepository urlRepository,
6567
SymbolActionRepository symbolActionRepository,
6668
TestReportRepository testReportRepository,
67-
LearnerSetupRepository learnerSetupRepository) {
69+
LearnerSetupRepository learnerSetupRepository,
70+
TestExecutionConfigRepository testExecutionConfigRepository) {
6871
this.projectDAO = projectDAO;
6972
this.projectRepository = projectRepository;
7073
this.environmentRepository = environmentRepository;
@@ -73,6 +76,7 @@ public ProjectEnvironmentDAO(ProjectDAO projectDAO,
7376
this.symbolActionRepository = symbolActionRepository;
7477
this.testReportRepository = testReportRepository;
7578
this.learnerSetupRepository = learnerSetupRepository;
79+
this.testExecutionConfigRepository = testExecutionConfigRepository;
7680
}
7781

7882
public ProjectEnvironment create(User user, Long projectId, ProjectEnvironment environment) {
@@ -138,6 +142,14 @@ public void delete(User user, Long projectId, Long environmentId) {
138142
throw new ValidationException("There has to be at least one environment.");
139143
}
140144

145+
if (!testExecutionConfigRepository.findAllByProject_IdAndEnvironment_Id(projectId, environmentId).isEmpty()) {
146+
throw new ForbiddenOperationException("The environment " + environment.getName() + " is associated with one or more test configs.");
147+
}
148+
149+
if (!learnerSetupRepository.findAllByProject_IdAndEnvironment_Id(projectId, environmentId).isEmpty()) {
150+
throw new ForbiddenOperationException("The environment " + environment.getName() + " is associated with one or more learner setups.");
151+
}
152+
141153
// select next best default environment
142154
if (environment.isDefault()) {
143155
final List<ProjectEnvironment> envs = environmentRepository.findAllByProject_Id(projectId);
@@ -149,18 +161,6 @@ public void delete(User user, Long projectId, Long environmentId) {
149161
// delete test reports that have been executed in the environment
150162
testReportRepository.deleteAllByEnvironment_Id(environment.getId());
151163

152-
// remove environment from learner setups
153-
final List<LearnerSetup> learnerSetups = learnerSetupRepository.findAllByEnvironmentsContains(environment);
154-
for (LearnerSetup learnerSetup : learnerSetups) {
155-
learnerSetup.getEnvironments().remove(environment);
156-
// switch to default environment if the deleted one is the only one
157-
if (learnerSetup.getEnvironments().isEmpty()) {
158-
final var defaultEnvironment = environmentRepository.findByProject_IdAndIs_Default(projectId, true);
159-
learnerSetup.getEnvironments().add(defaultEnvironment);
160-
}
161-
learnerSetupRepository.save(learnerSetup);
162-
}
163-
164164
project.getEnvironments().remove(environment);
165165
projectRepository.save(project);
166166
environmentRepository.delete(environment);

backend/src/main/java/de/learnlib/alex/data/entities/export/ProjectExportableEntity.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@ public class ProjectExportableEntity extends ExportableEntity {
3030

3131
private JsonNode learnerSetups;
3232

33+
private JsonNode testExecutionConfigs;
34+
3335
public ProjectExportableEntity() {
3436
super("-1", "project");
3537
}
@@ -78,4 +80,12 @@ public JsonNode getLearnerSetups() {
7880
public void setLearnerSetups(JsonNode learnerSetups) {
7981
this.learnerSetups = learnerSetups;
8082
}
83+
84+
public JsonNode getTestExecutionConfigs() {
85+
return testExecutionConfigs;
86+
}
87+
88+
public void setTestExecutionConfigs(JsonNode testExecutionConfigs) {
89+
this.testExecutionConfigs = testExecutionConfigs;
90+
}
8191
}

backend/src/main/java/de/learnlib/alex/data/repositories/ProjectEnvironmentRepository.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,4 +37,6 @@ public interface ProjectEnvironmentRepository extends JpaRepository<ProjectEnvir
3737
List<ProjectEnvironment> findAllByIdIn(List<Long> ids);
3838

3939
List<ProjectEnvironment> findByProject_IdAndNameIn(Long projectId, List<String> names);
40+
41+
ProjectEnvironment findByProject_IdAndId(Long projectId, Long environmentId);
4042
}

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

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,10 @@
2828
import de.learnlib.alex.data.entities.export.SymbolGroupsExportableEntity;
2929
import de.learnlib.alex.learning.entities.export.LearnerSetupExportableEntity;
3030
import de.learnlib.alex.learning.services.export.LearnerSetupsExporter;
31+
import de.learnlib.alex.learning.services.export.TestExecutionConfigsExporter;
3132
import de.learnlib.alex.modelchecking.entities.export.LtsFormulaSuitesExportableEntity;
3233
import de.learnlib.alex.modelchecking.services.export.LtsFormulaSuitesExporter;
34+
import de.learnlib.alex.testing.entities.export.TestExecutionConfigExportableEntity;
3335
import de.learnlib.alex.testing.entities.export.TestsExportableEntity;
3436
import de.learnlib.alex.testing.services.export.TestsExporter;
3537
import java.util.List;
@@ -46,20 +48,23 @@ public class ProjectExporter extends EntityExporter {
4648
private final TestsExporter testsExporter;
4749
private final LtsFormulaSuitesExporter formulaSuitesExporter;
4850
private final LearnerSetupsExporter learnerSetupsExporter;
51+
private final TestExecutionConfigsExporter testExecutionConfigsExporter;
4952

5053
@Autowired
5154
public ProjectExporter(
5255
ProjectDAO projectDAO,
5356
SymbolsExporter symbolsExporter,
5457
TestsExporter testsExporter,
5558
LtsFormulaSuitesExporter formulaSuitesExporter,
56-
LearnerSetupsExporter learnerSetupsExporter
59+
LearnerSetupsExporter learnerSetupsExporter,
60+
TestExecutionConfigsExporter testExecutionConfigsExporter
5761
) {
5862
this.projectDAO = projectDAO;
5963
this.symbolsExporter = symbolsExporter;
6064
this.testsExporter = testsExporter;
6165
this.formulaSuitesExporter = formulaSuitesExporter;
6266
this.learnerSetupsExporter = learnerSetupsExporter;
67+
this.testExecutionConfigsExporter = testExecutionConfigsExporter;
6368
}
6469

6570
public ExportableEntity export(User user, Long projectId) throws Exception {
@@ -75,6 +80,7 @@ public ExportableEntity export(User user, Long projectId) throws Exception {
7580
exportableEntity.setTests(((TestsExportableEntity) testsExporter.exportAll(user, projectId)).getTests());
7681
exportableEntity.setFormulaSuites(((LtsFormulaSuitesExportableEntity) formulaSuitesExporter.export(user, projectId)).getFormulaSuites());
7782
exportableEntity.setLearnerSetups(((LearnerSetupExportableEntity) learnerSetupsExporter.export(user, projectId)).getLearnerSetups());
83+
exportableEntity.setTestExecutionConfigs(((TestExecutionConfigExportableEntity) testExecutionConfigsExporter.export(user, projectId)).getTestConfigs());
7884

7985
return exportableEntity;
8086
}

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

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,11 @@
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;
2120
import java.util.List;
2221
import org.springframework.data.jpa.repository.JpaRepository;
22+
import org.springframework.data.jpa.repository.Query;
23+
import org.springframework.data.repository.query.Param;
2324
import org.springframework.stereotype.Repository;
2425

2526
@Repository
@@ -29,5 +30,8 @@ public interface LearnerSetupRepository extends JpaRepository<LearnerSetup, Long
2930

3031
void deleteAllByProject_Id(Long projectId);
3132

32-
List<LearnerSetup> findAllByEnvironmentsContains(ProjectEnvironment environment);
33+
@Query(value = "select ls "
34+
+ "from LearnerSetup ls join ls.environments e "
35+
+ "where ls.project.id = :projectId and e.id = :environmentId")
36+
List<LearnerSetup> findAllByProject_IdAndEnvironment_Id(@Param("projectId") Long projectId, @Param("environmentId") Long environmentId);
3337
}

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;

0 commit comments

Comments
 (0)