From ee5cb3d25c6148c7de732339aa84653a45e81f7f Mon Sep 17 00:00:00 2001 From: boulant Date: Mon, 26 Nov 2012 08:26:46 +0000 Subject: [PATCH] PADDER FIX: run with the plugin all the unit tests of the executable programs (SpherePadder). --- .../padder/meshjob/impl/MeshJobManager_i.cxx | 98 +++++++++++++------ src/Tools/padder/spadderpy/gui/inputdialog.py | 8 +- src/Tools/padder/spadderpy/padder.cfg.in | 6 ++ .../unittests/usecase_meshJobManager.py | 29 +++++- 4 files changed, 100 insertions(+), 41 deletions(-) diff --git a/src/Tools/padder/meshjob/impl/MeshJobManager_i.cxx b/src/Tools/padder/meshjob/impl/MeshJobManager_i.cxx index d1760f2ab..612906070 100644 --- a/src/Tools/padder/meshjob/impl/MeshJobManager_i.cxx +++ b/src/Tools/padder/meshjob/impl/MeshJobManager_i.cxx @@ -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 +#include +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): + * + * [ ] + * nbSteelBarMeshes + * + * + * ... + * + * */ const char * MeshJobManager_i::_writeDataFile(std::vector listConcreteMesh, std::vector listSteelBarMesh) { @@ -147,27 +171,29 @@ const char * MeshJobManager_i::_writeDataFile(std::vectorc_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; iin_files.length(nbFiles); - jobParameters->in_files[0] = CORBA::string_dup(listConcreteMesh[0].file_name); - for (int i=0; iin_files[1+i] = CORBA::string_dup(listSteelBarMesh[i].file_name); + for (int i=0; iin_files[i] = CORBA::string_dup(listConcreteMesh[i].file_name); + } + for (int i=0; iin_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; iin_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()); diff --git a/src/Tools/padder/spadderpy/gui/inputdialog.py b/src/Tools/padder/spadderpy/gui/inputdialog.py index c9d8ae618..a8ea8283b 100644 --- a/src/Tools/padder/spadderpy/gui/inputdialog.py +++ b/src/Tools/padder/spadderpy/gui/inputdialog.py @@ -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 diff --git a/src/Tools/padder/spadderpy/padder.cfg.in b/src/Tools/padder/spadderpy/padder.cfg.in index 4962a336a..e872230a0 100644 --- a/src/Tools/padder/spadderpy/padder.cfg.in +++ b/src/Tools/padder/spadderpy/padder.cfg.in @@ -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 + diff --git a/src/Tools/padder/unittests/usecase_meshJobManager.py b/src/Tools/padder/unittests/usecase_meshJobManager.py index ecc613831..fadfd403f 100644 --- a/src/Tools/padder/unittests/usecase_meshJobManager.py +++ b/src/Tools/padder/unittests/usecase_meshJobManager.py @@ -21,10 +21,13 @@ # # 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. # -- 2.39.2