X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=Workspace%2FSiman-Common%2Fsrc%2Ftest%2Fsplat%2Fservice%2FTestScenarioService.java;h=9776fc2727b8ceaeec3c21129d4ea4688a238eba;hb=657225200c39f23a3e5abd97dc7ccfafe4e308ad;hp=39d000f48ef1d02a6a9a38a14ab48ddd6669a5fa;hpb=891c6f0b5ef531d35648969b807282c31a2bb336;p=tools%2Fsiman.git diff --git a/Workspace/Siman-Common/src/test/splat/service/TestScenarioService.java b/Workspace/Siman-Common/src/test/splat/service/TestScenarioService.java index 39d000f..9776fc2 100644 --- a/Workspace/Siman-Common/src/test/splat/service/TestScenarioService.java +++ b/Workspace/Siman-Common/src/test/splat/service/TestScenarioService.java @@ -15,15 +15,24 @@ import java.io.IOException; import java.sql.SQLException; import java.util.ArrayList; import java.util.Date; +import java.util.HashMap; import java.util.List; +import java.util.Map; +import java.util.Set; +import org.splat.dal.bo.kernel.Relation; import org.splat.dal.bo.kernel.User; import org.splat.dal.bo.som.Document; -import org.splat.dal.bo.som.Document.Properties; import org.splat.dal.bo.som.DocumentType; +import org.splat.dal.bo.som.KnowledgeElementType; import org.splat.dal.bo.som.Publication; import org.splat.dal.bo.som.Scenario; +import org.splat.dal.bo.som.SimulationContext; +import org.splat.dal.bo.som.SimulationContextType; import org.splat.dal.bo.som.Study; +import org.splat.dal.bo.som.UsedByRelation; +import org.splat.dal.bo.som.UsesRelation; +import org.splat.dal.bo.som.Document.Properties; import org.splat.dal.dao.som.Database; import org.splat.dal.dao.som.ScenarioDAO; import org.splat.kernel.InvalidPropertyException; @@ -33,25 +42,28 @@ import org.splat.kernel.MultiplyDefinedException; import org.splat.kernel.NotApplicableException; import org.splat.log.AppLogger; import org.splat.service.DocumentTypeService; +import org.splat.service.KnowledgeElementTypeService; import org.splat.service.PublicationService; import org.splat.service.ScenarioService; +import org.splat.service.SimulationContextService; import org.splat.service.StepService; import org.splat.service.dto.DocumentDTO; import org.splat.service.dto.FileDTO; import org.splat.service.dto.StepDTO; import org.splat.service.technical.ProjectSettingsService; -import org.splat.service.technical.ProjectSettingsService.Step; import org.splat.service.technical.RepositoryService; +import org.splat.service.technical.ProjectSettingsService.Step; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.orm.hibernate3.HibernateTemplate; import org.testng.Assert; import org.testng.annotations.Test; +import org.testng.reporters.Files; import test.splat.common.BaseTest; /** - * Test class for KnowledgeElementDAO. + * Test class for ScenarioService. * * @author Roman Kozlov (RKV) * @@ -99,6 +111,13 @@ public class TestScenarioService extends BaseTest { @Qualifier("stepService") private transient StepService _stepService; + /** + * The SimulationContextService. Later injected by Spring. + */ + @Autowired + @Qualifier("simulationContextService") + private transient SimulationContextService _simulationContextService; + /** * The ProjectSettingsService. Later injected by Spring. */ @@ -113,6 +132,13 @@ public class TestScenarioService extends BaseTest { @Qualifier("documentTypeService") private transient DocumentTypeService _documentTypeService; + /** + * The KnowledgeElementTypeService. Later injected by Spring. + */ + @Autowired + @Qualifier("knowledgeElementTypeService") + private transient KnowledgeElementTypeService _knowledgeElementTypeService; + /** * Test of getting a scenario content for building siman-salome.conf.
* Description :
@@ -145,11 +171,13 @@ public class TestScenarioService extends BaseTest { * @throws SQLException * if scenario creation is failed */ - @Test + @Test(groups = { "checkout", "sevice", "functional", "business" }) public void testGetScenarioInfo() throws InvalidPropertyException, MissedPropertyException, MultiplyDefinedException, IOException, SQLException { LOG.debug(">>>>> BEGIN testGetScenarioInfo()"); + startNestedTransaction(); + long scenarioId = createScenario(); // Call DAO's create method for a good transient knowledge element. List steps = _scenarioService.getScenarioInfo(scenarioId); @@ -228,7 +256,7 @@ public class TestScenarioService extends BaseTest { } } else { // Outdated Assert.assertEquals(file.getState(), 'O', - "File state must be actual ('O')."); + "File state must be outdated ('O')."); Assert .assertEquals(file.getProcessing(), "file-download", @@ -251,6 +279,7 @@ public class TestScenarioService extends BaseTest { LOG.debug("Expected exception is thrown: " + e.getClass().getSimpleName() + ": " + e.getMessage()); } + rollbackNestedTransaction(); LOG.debug(">>>>> END testGetScenarioInfo()"); } @@ -265,7 +294,9 @@ public class TestScenarioService extends BaseTest { *
  • presentation of the previous version is removed
  • *
  • uses relations are copied correctly
  • *
  • files are moved correctly
  • + *
  • formats of files are new if they are according to the document's type on the study step
  • *
  • new documents are created for new data
  • + *
  • new documents have correctly generated names
  • *
  • uses relations are created correctly
  • *
  • files are moved correctly
  • * @@ -303,29 +334,58 @@ public class TestScenarioService extends BaseTest { * @throws MismatchException * if checkin failed */ - @Test(groups = {"checkin", "sevice", "functional", "business"}) + @Test(groups = { "checkin", "sevice", "functional", "business" }) public void testCheckin() throws InvalidPropertyException, MissedPropertyException, MultiplyDefinedException, IOException, SQLException, MismatchException, NotApplicableException { LOG.debug(">>>>> BEGIN testCheckin()"); + startNestedTransaction(); + _projectSettings.getAllSteps().clear(); // Clear config to be able to load it again _projectSettings.configure(ClassLoader .getSystemResource("test/som.xml").getPath()); + getHibernateTemplate().flush(); long scenarioId = createScenario(); Scenario aScen = _scenarioDAO.get(scenarioId); User user = aScen.getAuthor(); long userId = user.getIndex(); + // //////////////////////////////////////////////////////// - // Call checkin method for good prepared transient data. + // Call checkin method for empty list of modules. // Simulate checkout List steps = _scenarioService.getScenarioInfo(scenarioId); _scenarioService.checkout(aScen, user); + _scenarioDAO.flush(); + // Check that scenario is no more marked as checked out + aScen = _scenarioDAO.get(scenarioId); + Assert.assertTrue(aScen.isCheckedout(), + "Scenario is not marked as checked out after checkout."); // Prepare test data for checkin // Checkin only two first steps (geom and mesh) List stepsToCheckin = new ArrayList(); + // Do test checkin + _scenarioService.checkin(scenarioId, userId, stepsToCheckin); + + _scenarioDAO.flush(); + // Check that scenario is no more marked as checked out + aScen = _scenarioDAO.get(scenarioId); + Assert.assertFalse(aScen.isCheckedout(), + "Scenario is still marked as checked out after checkin."); + + + + // //////////////////////////////////////////////////////// + // Call checkin method for good prepared transient data. + + // Simulate checkout + steps = _scenarioService.getScenarioInfo(scenarioId); + _scenarioService.checkout(aScen, user); + + // Prepare test data for checkin + // Checkin only two first steps (geom and mesh) for (StepDTO step : steps) { // Prepare GEOM: checkin actual brep StepDTO stepToCheckin = createDocDTOForModule(null, "GEOM", "brep", @@ -336,6 +396,7 @@ public class TestScenarioService extends BaseTest { // Do test checkin _scenarioService.checkin(scenarioId, userId, stepsToCheckin); + _scenarioDAO.flush(); // Check that scenario is no more marked as checked out aScen = _scenarioDAO.get(scenarioId); Assert.assertFalse(aScen.isCheckedout(), @@ -346,6 +407,7 @@ public class TestScenarioService extends BaseTest { if ((docDTO.getId() != 0) && (docDTO.getId() != null)) { boolean found = false; Document prevDoc = null; + Document curDoc = null; Publication newPub = null; for (Publication pub : aScen.getDocums()) { prevDoc = pub.value().getPreviousVersion(); @@ -356,28 +418,98 @@ public class TestScenarioService extends BaseTest { break; } } + if (pub.value().getIndex() == docDTO.getId()) { + // Document version was not changed, old document is still published + curDoc = pub.value(); + break; + } } - Assert.assertTrue(found, - "New version of the existing checked in document \"" + Assert.assertTrue(found || (curDoc != null), + "New version or new attached file of the existing checked in document \"" + docDTO.getTitle() + "\" (id=" + docDTO.getId() + ") is not found in the scenario."); - // Check that presentation of the previous version is removed - Assert.assertFalse(aScen.publishes(prevDoc)); - // Check that files are moved correctly - for (int j = 0; j < docDTO.getFiles().size(); j++) { - FileDTO fileDTO = docDTO.getFiles().get(j); - Assert - .assertFalse( - new File(fileDTO.getPath()).exists(), - "File" - + fileDTO.getPath() - + " was not removed from downloads directory."); - String format = fileDTO.getPath().substring( - fileDTO.getPath().lastIndexOf('.') + 1); + // If previous version is found then the format must be the same + String newFormat = docDTO.getFiles().get(0).getPath() + .substring( + docDTO.getFiles().get(0).getPath() + .lastIndexOf('.') + 1); + if (found) { + Assert.assertEquals(prevDoc.getFormat(), newFormat, + "Formats of versions must be same"); + Assert.assertFalse(aScen.publishes(prevDoc)); + // Check that presentation of the previous version is removed + checkFiles(docDTO, newPub); + + // Formats of files are new if they are according to the document's type on the study step + if ("py".equals(prevDoc.getFormat()) + && "geometry".equals(prevDoc.getType().getName())) { + Assert.assertEquals(newPub.value().getFormat(), "brep"); + Assert.assertEquals(newPub.getSourceFile().getFormat(), + "brep"); + Assert.assertEquals(newPub.getSourceFile() + .getRelativePath().substring( + newPub.getSourceFile() + .getRelativePath().lastIndexOf( + '.') + 1), "brep"); + } + + // Check that uses relations are copied correctly + + // 1. Get all uses relations of the previous document version + for (Relation rel : prevDoc + .getRelations(UsesRelation.class)) { + Document used = ((UsesRelation) rel).getTo(); + // 2.1. Get the latest version of the document published in this scenario + Publication toBeUsed = aScen.getPublication(used); + if (toBeUsed == null) { + // Find the latest published version + for (Publication lastPub : aScen.getDocums()) { + if ((lastPub.value().getPreviousVersion() != null) + && (lastPub.value() + .getPreviousVersion() + .getIndex() == used.getIndex())) { + toBeUsed = lastPub; + break; + } + } + } + if ((toBeUsed != null) && (!toBeUsed.isOutdated())) { + // 2.2. For each used document check that its latest not outdated version + // is used by the new checked in document version. + checkUsesRelation(newPub, toBeUsed); + } + } + // 1. Get all usedBy relations of the previous document version + for (Relation rel : prevDoc + .getRelations(UsedByRelation.class)) { + Document using = ((UsedByRelation) rel).getTo(); + // Check that not checked in dependent documents became outdated + Publication usingPub = aScen.getPublication(using); + if (usingPub != null) { // if the document using the old version is still published + Assert.assertTrue(usingPub.isOutdated(), + "Not checked in dependent document " + + using.getTitle() + " (" + + using.getType().getName() + + ") must become outdated."); + } + } + } else { + // Otherwise the new file format must differ from the previous one + // and the new file must be attached to the same document + org.splat.dal.bo.som.File attFile = curDoc + .getAttachedFile(newFormat); + Assert.assertNotNull(attFile, "File " + + docDTO.getFiles().get(0).getPath() + + " must be attached to the document " + + docDTO.getTitle() + "#" + docDTO.getId()); + Assert.assertTrue(attFile.asFile().exists(), "File " + + docDTO.getFiles().get(0).getPath() + + " attached to the document " + + docDTO.getTitle() + "#" + docDTO.getId() + " doesn't exist"); + LOG.debug("Source format: " + curDoc.getFormat() + ", new format: " + newFormat); } - // Check file by its internal content - // Check that uses relations are copied correctly + } else { // Check that new documents are created for new data @@ -385,20 +517,48 @@ public class TestScenarioService extends BaseTest { Publication newPub = null; for (Publication pub : aScen.getDocums()) { if (pub.value().getPreviousVersion() == null) { - found = (docDTO.getTitle().equals(pub.value() - .getTitle())); + found = (pub.value().getTitle().startsWith(pub + .value().getType().getName())); if (found) { // Found next published version of the checked in document - newPub = pub; - break; + String fcontent = Files.readFile(pub + .getSourceFile().asFile()); + found = fcontent.contains(docDTO.getTitle()); + if (found) { + LOG + .debug("Found new document with generated title: " + + pub.value().getTitle()); + newPub = pub; + break; + } } } } Assert.assertTrue(found, "New document is not created for checked in document \"" + docDTO.getTitle() + "\"."); + // Check that uses relations are created correctly - // Check that files are moved correctly + Assert.assertTrue(newPub.value().getTitle().startsWith( + newPub.value().getType().getName() + "_"), + "Document title newPub.value().getTitle() must start with " + + newPub.value().getType().getName() + "_"); + // 1. Find the document type used by this document type + Set usedTypes = newPub.value().getType() + .getDefaultUses(); + // 2. Find documents of used types in the current study step and previous study steps + for (Publication pub : aScen.getDocums()) { + if ((pub.getStep().getNumber() <= step.getNumber()) + && (!pub.isOutdated()) + && usedTypes.contains(pub.value().getType())) { + // 3. Check that there is uses relation to the found document + // if it is not outdated. + checkUsesRelation(newPub, pub); + } + } + + // Check that files are moved correctly + checkFiles(docDTO, newPub); } } } @@ -414,9 +574,66 @@ public class TestScenarioService extends BaseTest { + e.getClass().getSimpleName() + ": " + e.getMessage()); } + // Test checkin with empty list of steps + stepsToCheckin.clear(); + _scenarioService.checkin(scenarioId, userId, stepsToCheckin); + + rollbackNestedTransaction(); LOG.debug(">>>>> END testCheckin()"); } + /** + * Check if there is uses relation from the newPub to pub. + * + * @param newPub + * the new publication + * @param pub + * the publication to be used + */ + private void checkUsesRelation(final Publication newPub, + final Publication pub) { + boolean uses = false; + boolean usesExist = false; + for (Publication usesPub : newPub.getRelations(UsesRelation.class)) { + usesExist = true; + uses = (usesPub.equals(pub)); + if (uses) { + break; + } + } + Assert.assertTrue(usesExist && uses, "The created document " + + newPub.value().getTitle() + "(" + + newPub.value().getType().getName() + ")" + + " has no uses relation to the document " + + pub.value().getTitle() + "(" + + pub.value().getType().getName() + ")"); + } + + /** + * Check that files are moved correctly. + * + * @param docDTO + * checked in document DTO + * @param newPub + * the created document publication + */ + private void checkFiles(final DocumentDTO docDTO, final Publication newPub) { + // Check that original files are deleted + for (int j = 0; j < docDTO.getFiles().size(); j++) { + FileDTO fileDTO = docDTO.getFiles().get(j); + Assert.assertFalse(new File(fileDTO.getPath()).exists(), "File" + + fileDTO.getPath() + + " was not removed from downloads directory."); + String format = fileDTO.getPath().substring( + fileDTO.getPath().lastIndexOf('.') + 1); + } + // TODO: Check file by its internal content + Assert.assertTrue(newPub.getSourceFile().exists(), "File " + + newPub.getSourceFile().asFile().getAbsolutePath() + + " for the document " + docDTO.getTitle() + + " was not created."); + } + /** * Prepare a document with a file for check-in. * @@ -452,7 +669,10 @@ public class TestScenarioService extends BaseTest { DocumentDTO docToCheckin = stepToCheckin.addDoc( doc.getId(), doc.getTitle()); for (FileDTO file : doc.getFiles()) { - if (file.getPath().endsWith(format)) { + if (file.getPath().endsWith(format) + || (file.getPath().endsWith("py") && (format + .equals("brep") || format + .equals("med")))) { // Create a file in the download directory docToCheckin.addFile(createDownloadedFile(userId, doc.getTitle() + "_result", format)); @@ -484,10 +704,27 @@ public class TestScenarioService extends BaseTest { private FileDTO createDownloadedFile(final long userId, final String name, final String format) throws IOException { // Create a file in the download directory - String filePath = getDownloadPath(userId) + name + "." + format; + return createDownloadedFile(userId, name + "." + format); + } + + /** + * Create a file in the user's repository downloads directory. + * + * @param userId + * user id + * @param fname + * file name + * @return created file DTO + * @throws IOException + * if file creation failed + */ + private FileDTO createDownloadedFile(final long userId, final String fname) + throws IOException { + // Create a file in the download directory + String filePath = getDownloadPath(userId) + fname; FileWriter fw = new FileWriter(filePath); - fw.write("Simulation of " + name + "." + format - + " file for checkin at " + new Date()); + fw.write("Simulation of " + fname + " file for checkin at " + + new Date()); fw.close(); return new FileDTO(filePath); } @@ -573,6 +810,8 @@ public class TestScenarioService extends BaseTest { Document.Properties dprop = new Document.Properties().setAuthor( anAuthor).setDate(new Date()); int i = 0; + Publication usedPub = null; + Map usedMap = new HashMap(); for (Step step : steps) { LOG.debug("Create scenario step: " + i); @@ -585,16 +824,25 @@ public class TestScenarioService extends BaseTest { // .brep // .med dprop.setName("document" + i++).setType(dtype); - if (step.getNumber() > 3) { +/* if (step.getNumber() > 3) { dprop.setFormat("med"); } else { - dprop.setFormat("brep"); +*/ dprop.setFormat("py"); +// } + dprop.setLocalPath(dprop.getName() + "." + dprop.getFormat()); + Publication pub = createDoc(aScenario, aScStep, dprop, "med", + false); + if (usedPub != null) { + pub.addDependency(usedPub); + ht.saveOrUpdate(pub.value()); + + usedMap.put(pub.getIndex(), usedPub.getIndex()); } - createDoc(aScenario, aScStep, dprop, "med", false); + usedPub = pub; // Create another document with outdated publication - dprop.setName("document" + i++).setType(dtype) - .setFormat("brep"); + dprop.setName("document" + i++).setType(dtype).setFormat("py"); + dprop.setLocalPath(dprop.getName() + "." + dprop.getFormat()); createDoc(aScenario, aScStep, dprop, "med", true); } @@ -636,6 +884,30 @@ public class TestScenarioService extends BaseTest { Assert.assertTrue(i > 0, "More then one document must be in the database"); + // Check created uses relations + Assert + .assertTrue(usedMap.size() > 0, + "Uses relations must be created."); + boolean foundAny = false; + for (Long usingId : usedMap.keySet()) { + for (Publication pub : aScen.getDocums()) { + if (pub.getIndex() == usingId) { + boolean found = false; + for (Publication used : aScen.getDocums()) { + found = (used.getIndex() == usedMap.get(usingId)); + if (found) { + break; + } + } + Assert.assertTrue(found, + "Uses relation was not created in the database."); + foundAny = foundAny || found; + } + } + } + Assert.assertTrue(foundAny, + "No Uses relation was created in the database."); + return aScenario.getIndex(); } @@ -671,6 +943,8 @@ public class TestScenarioService extends BaseTest { // document: document type[0] - first type used on the step // .brep // .med + createDownloadedFile(aScenario.getAuthor().getIndex(), dprop + .getLocalPath()); Publication pub = _stepService.createDocument(aScStep, dprop); Assert.assertNotNull(pub.getOwner(), "The publication must be attached to the scenario."); @@ -685,9 +959,121 @@ public class TestScenarioService extends BaseTest { ht.saveOrUpdate(pub); // Attach a file + createDownloadedFile(aScenario.getAuthor().getIndex(), dprop + .getLocalPath().substring(0, + dprop.getLocalPath().lastIndexOf(".") - 1), + attachedFileExt); ht.save(pub.value()); ht.saveOrUpdate(_publicationService.attach(pub, attachedFileExt)); return pub; } + + /** + * Test check-in scenario operation to be performed after SALOME session.
    + * Description :
    + * Create a scenario and try to check-in it with some simulated SALOME results data.
    + * After check-in verify following points: + *
      + *
    • scenario is no more marked as checked out
    • + *
    • new document versions are created for checked in documents
    • + *
    • presentation of the previous version is removed
    • + *
    • uses relations are copied correctly
    • + *
    • files are moved correctly
    • + *
    • new documents are created for new data
    • + *
    • uses relations are created correctly
    • + *
    • files are moved correctly
    • + *
    + *

    + * Action :
    + * 1. call the method for an existing scenario id.
    + * 2. call the method for a not existing scenario id.
    + * Test data :
    + * no input parameters
    + * no input parameters
    + * + * Outcome results:
    + * + *
      + *
    • New version of existing documents must be created and new documents must be imported for documents with zero id. Correct + * relations must be created.
      + *
    • + *
    • Exception is thrown
      + *
    • + *
    + *
    + * + * @throws InvalidPropertyException + * if an invalid property is used when creating objects + * @throws MultiplyDefinedException + * when trying to create an object with already existing id + * @throws MissedPropertyException + * if a mandatory property is not defined for an object to be created + * @throws IOException + * if scenario creation is failed + * @throws SQLException + * if scenario creation is failed + * @throws NotApplicableException + * if checkin failed + * @throws MismatchException + * if checkin failed + */ + @Test(groups = { "study", "sevice", "functional", "business" }) + public void testCreateStudy() throws InvalidPropertyException, + MissedPropertyException, MultiplyDefinedException, IOException, + SQLException, MismatchException, NotApplicableException { + LOG.debug(">>>>> BEGIN testCreateStudy()"); + startNestedTransaction(); + + Database.getInstance().reset(); + _projectSettings.getAllSteps().clear(); // Clear config to be able to load it again + _projectSettings.configure(ClassLoader + .getSystemResource("test/som.xml").getPath()); + + // Create a test user + User.Properties uprop = new User.Properties(); + uprop.setUsername("TST_Username").setName("TST_SimanUnitTestsUser") + .setFirstName("TST_FirstName").setDisplayName("TST_test.user") + .addRole("TST_user").setMailAddress( + "noreply@salome-platform.org"); + uprop.disableCheck(); + User anAuthor = new User(uprop); + + getHibernateTemplate().saveOrUpdate(anAuthor); + KnowledgeElementType ucase = _knowledgeElementTypeService + .selectType("usecase"); + Assert.assertNotNull(ucase, + "Knowledge type 'usecase' must be created in the database."); + SimulationContextType prodtype = _simulationContextService + .selectType("product"); + Assert + .assertNotNull(prodtype, + "Simulation context type 'product' must be created in the database."); + + // Create admin + uprop.clear(); + uprop.setUsername("TST_Admin").setName("TST_SimanUnitTestsAdmin") + .setFirstName("TST_AdminFirstName").setDisplayName( + "TST_test.admin").addRole("TST_user,sysadmin") + .setMailAddress("noreply@salome-platform.org"); + uprop.disableCheck(); + + getHibernateTemplate().saveOrUpdate(new User(uprop)); + getHibernateTemplate().flush(); + + Study.Properties sprop = new Study.Properties(); + sprop.setTitle("Test study creation").setManager(anAuthor); + Scenario.Properties oprop = new Scenario.Properties(); + oprop.setTitle("Test scenario for the created study"); + + // Addition of the entered project context + SimulationContext.Properties cprop = new SimulationContext.Properties(); + // Input of new project context + cprop.setType(_simulationContextService.selectType("product")) + .setValue("Test Simulation Context: Product"); + Study study = _scenarioService.createStudy(sprop, oprop, cprop); + + rollbackNestedTransaction(); + LOG.debug(">>>>> END testCreateStudy()"); + } }