Salome HOME
PADDER FIX: run with the plugin all the unit tests of the executable programs (Sphere... V6_6_0rc1
authorboulant <boulant>
Mon, 26 Nov 2012 08:26:46 +0000 (08:26 +0000)
committerboulant <boulant>
Mon, 26 Nov 2012 08:26:46 +0000 (08:26 +0000)
src/Tools/padder/meshjob/impl/MeshJobManager_i.cxx
src/Tools/padder/spadderpy/gui/inputdialog.py
src/Tools/padder/spadderpy/padder.cfg.in
src/Tools/padder/unittests/usecase_meshJobManager.py

index d1760f2ab6566f740a918a5bbb26e96615267fda..612906070fcc2cea2670c78ce35a77d85f553742 100644 (file)
@@ -67,6 +67,21 @@ static bool myStartsWith(const std::string& text,const std::string& token){
   return (text.compare(0, token.length(), token) == 0);
 }
 
+/*!
+ * This function returns true if the file exists on the local file
+ * system.
+ */
+#include <iostream>
+#include <fstream>
+static bool fexists(const char *filename)
+{
+  std::ifstream ifile(filename);
+  if ((bool)ifile && ifile.good()) {
+    return true;
+  }
+  return false;
+}
+
 //
 // ====================================================================
 // Constructor/Destructor
@@ -134,7 +149,16 @@ static std::string REMOTE_WORKDIR("/tmp/spadder.remote.workdir."+USER);
  * input data (list of filenames and groupnames) and returns the path
  * of the created file. This function is the one that knows the format
  * of the padder input file. If the input file format changes, then
- * this function (and only this one) should be updated.
+ * this function (and only this one) should be updated. The file
+ * format is the following ([] means that the variable is optional):
+ *
+ * [<concreteMeshFile>   <concreteGroupName>]
+ * nbSteelBarMeshes <N>
+ * <steelBarMeshFile_1>   <steelBarGroupName_1>
+ * <steelBarMeshFile_2>   <steelBarGroupName_2>
+ * ...
+ * <steelBarMeshFile_N>   <steelBarGroupName_N>
+ * <outputMedFile>
  */
 const char * MeshJobManager_i::_writeDataFile(std::vector<MESHJOB::MeshJobParameter> listConcreteMesh,
                                               std::vector<MESHJOB::MeshJobParameter> listSteelBarMesh) {
@@ -147,27 +171,29 @@ const char * MeshJobManager_i::_writeDataFile(std::vector<MESHJOB::MeshJobParame
   // Make it static so that it's allocated once (constant name)
   static std::string * dataFilename = new std::string(LOCAL_INPUTDIR+"/"+DATAFILE);
   std::ofstream dataFile(dataFilename->c_str());
-  
-  // We first specify the concrete mesh data (filename and groupname)
+
+  // Note that we use here the basename of the files because the files
+  // are supposed to be copied in the REMOTE_WORKDIR for execution.
   std::string line;
+
+  // We first specify the concrete mesh data (filename and groupname)
+  if ( listConcreteMesh.size() > 0 ) {
 #ifdef WIN32
-  char fname[ _MAX_FNAME ];
-  _splitpath( listConcreteMesh[0].file_name, NULL, NULL, fname, NULL );
-  char* bname = &fname[0];
+    char fname[ _MAX_FNAME ];
+    _splitpath( listConcreteMesh[0].file_name, NULL, NULL, fname, NULL );
+    char* bname = &fname[0];
 #else
-  char* bname = basename(listConcreteMesh[0].file_name);
+    char* bname = basename(listConcreteMesh[0].file_name);
 #endif
-  line = std::string(bname) + " " + std::string(listConcreteMesh[0].group_name);
-  dataFile << line.c_str() << std::endl;
-  // Note that we use here the basename because the files are supposed
-  // to be copied in the REMOTE_WORKDIR for execution.
-  
-  // The, we can specify the steelbar mesh data, starting by the
+    line = std::string(bname) + " " + std::string(listConcreteMesh[0].group_name);
+    dataFile << line.c_str() << std::endl;
+  }
+  // Then, we can specify the steelbar mesh data, starting by the
   // number of meshes
-  int nbSteelBarMesh=listSteelBarMesh.size();
-  line = std::string("nbSteelbarMesh") + SEPARATOR + ToString(nbSteelBarMesh);
+  int nbSteelBarMeshes=listSteelBarMesh.size();
+  line = std::string("nbSteelBarMeshes") + SEPARATOR + ToString(nbSteelBarMeshes);
   dataFile << line.c_str() << std::endl;
-  for (int i=0; i<nbSteelBarMesh; i++) {
+  for (int i=0; i<nbSteelBarMeshes; i++) {
 #ifdef WIN32
         char fname[ _MAX_FNAME ];
         _splitpath( listSteelBarMesh[i].file_name, NULL, NULL, fname, NULL );
@@ -252,9 +278,6 @@ CORBA::Long MeshJobManager_i::initialize(const MESHJOB::MeshJobParameterList & m
                                          const char * configId)
 {
   beginService("MeshJobManager_i::initialize");
-  std::cerr << "##################################### initialize" << std::endl;
-  std::cerr << "#####################################" << std::endl;
-
   //
   // We first analyse the CORBA sequence to store data in C++ vectors
   //
@@ -350,24 +373,37 @@ CORBA::Long MeshJobManager_i::initialize(const MESHJOB::MeshJobParameterList & m
   // We specify the input files that are required to execute the
   // job_file. If basenames are specified, then the files are supposed
   // to be located in local_directory.
-  int nbFiles = listSteelBarMesh.size()+2;
+  int nbcmesh = listConcreteMesh.size();
+  int nbsmesh = listSteelBarMesh.size();
+  int nbFiles = nbsmesh+nbcmesh+1;
   // The number of input file is: 
   //   (nb. of steelbar meshfile)
-  // + (1 concrete meshfile)
+  // + (1 or 0 concrete meshfile)
   // + (1 padder input file)
-  // = nb steelbar meshfile + 2
   jobParameters->in_files.length(nbFiles);
-  jobParameters->in_files[0] = CORBA::string_dup(listConcreteMesh[0].file_name);
-  for (int i=0; i<listSteelBarMesh.size(); i++) {
-    jobParameters->in_files[1+i] = CORBA::string_dup(listSteelBarMesh[i].file_name);
+  for (int i=0; i<nbcmesh; i++) {
+    jobParameters->in_files[i] = CORBA::string_dup(listConcreteMesh[i].file_name);
+  }
+  for (int i=0; i<nbsmesh; i++) {
+    jobParameters->in_files[nbcmesh+i] = CORBA::string_dup(listSteelBarMesh[i].file_name);
   }
-  jobParameters->in_files[1+listSteelBarMesh.size()] = CORBA::string_dup(dataFilename);
+  jobParameters->in_files[nbcmesh+nbsmesh] = CORBA::string_dup(dataFilename);
   // Note that all these input files will be copied in the
-  // REMOTE_WORKDIR on the remote host
-  
-  // Then, we have to specify the existance of an output
-  // filenames. The path is supposed to be a path on the remote
-  // resource, i.e. where the job is executed.
+  // REMOTE_WORKDIR on the remote host. At this step, they should
+  // all exist, so we can check their presence on the local
+  // filesystem.
+  for (int i=0; i<nbFiles; i++) {
+    if ( fexists(jobParameters->in_files[i]) != true ) {
+      _lastErrorMessage = std::string("The input file ") + std::string(jobParameters->in_files[i]);
+      _lastErrorMessage+= std::string(" does not exists. Can't initialize the job");
+      LOG(_lastErrorMessage);
+      return JOBID_UNDEFINED;      
+    }
+  }
+
+  // Then, we have to specify the existance of an output filename. The
+  // path is supposed to be a path on the remote resource, i.e. where
+  // the job is executed.
   jobParameters->out_files.length(1);
   std::string outputfile_name = std::string(jobPaths->remote_workdir)+"/"+OUTPUTFILE;
   jobParameters->out_files[0] = CORBA::string_dup(outputfile_name.c_str());
index c9d8ae618cb9bcca0cbde8a6ce73112be00f5b77..a8ea8283bc772e3357b8ee149aaca80d2c3a2a77 100644 (file)
@@ -312,8 +312,8 @@ class InputDialog(GenericDialog):
         This function checks if the data are valid, from the dialog
         window point of view.
         """
-        if self.__nbConcreteMesh < 1:
-            self.checkDataMessage = "You must define at least one CONCRETE mesh"
+        if self.__nbConcreteMesh == 0 and self.__nbSteelbarMesh == 0:
+            self.checkDataMessage = "You must define at least one mesh (CONCRETE or STEELBAR)"
             return False        
         if self.__nbConcreteMesh > 1:
             self.checkDataMessage  = "You define multiple CONCRETE meshes."
@@ -321,9 +321,7 @@ class InputDialog(GenericDialog):
             # just warn the user, but don't block
             QMessageBox.information(self, "Info", self.checkDataMessage)
             return True
-        if self.__nbSteelbarMesh < 1:
-            self.checkDataMessage = "You must define at least one STEELBAR mesh"
-            return False
+
         return True
 
 
index 4962a336a05314a23fc54549cb53c177d4295613..e872230a02517946a9f0034961faf5c93ec69eea 100644 (file)
@@ -33,3 +33,9 @@ envpath = /usr/local/share/envPadder.sh
 resname = nepal@nepal
 binpath = /usr/local/bin/padder.exe
 envpath = /usr/local/share/envPadder.sh
+
+[devel]
+resname = localhost
+binpath = /opt/programs/padder/subversion/trunk/padder.exe
+envpath = /opt/programs/padder/subversion/trunk/padder.env
+
index ecc613831bdcc0fcf0af6cd94da9668dbd69d25b..fadfd403f99f3c05f699f8b8dbafab6fd45893a6 100644 (file)
 #
 
 # This script illustrates the standard use case of the component
-# MeshJobManager from within a SALOME script.
+# MeshJobManager from within a SALOME script. It could be used as a
+# unit test of the component.
 
 #
+# =======================================================================
 # Preparing the configuration parameters
+# =======================================================================
 #
 import sys
 import os
@@ -58,8 +61,16 @@ component.configure(configId,config)
 
 
 #
-# Prepare the job parameters and initialize the job
+# =======================================================================
+# Define several datasets for the different use cases
+# =======================================================================
 #
+
+# We define several functions that create each a dataset of med files
+# for testing the component. The test function number corresponds to
+# the number of the test defined in the SpherePadder installation
+# directory.
+
 def test00_parameters():
     """Test using a concrete mesh and a single steelbar mesh""" 
     file_concrete=os.path.join(spadder.getTestDataDir(),"concrete.med")
@@ -127,13 +138,16 @@ def test03_parameters():
     return meshJobParameterList
 
 #
-# Choose here the use case
+# =======================================================================
+# Prepare the job parameters and initialize the job
+# =======================================================================
 #
 
+# Choose here the use case
 #meshJobParameterList = test00_parameters()
 #meshJobParameterList = test01_parameters()
-meshJobParameterList = test02_parameters()
-#meshJobParameterList = test03_parameters()
+#meshJobParameterList = test02_parameters()
+meshJobParameterList = test03_parameters()
 
 #
 # Prepare, start and follow-up the job
@@ -154,6 +168,11 @@ while not created:
     time.sleep(0.5)
     nbiter+=1
 
+
+#
+# =======================================================================
+# Submit the job and start the supervision
+# =======================================================================
 #
 # Start the execution of the job identified by its job id.
 #