PADDER FIX: run with the plugin all the unit tests of the executable programs (SpherePadder).

This commit is contained in:
boulant 2012-11-26 08:26:46 +00:00
parent a6bc2b5a1c
commit ee5cb3d25c
4 changed files with 100 additions and 41 deletions

View File

@ -67,6 +67,21 @@ static bool myStartsWith(const std::string& text,const std::string& token){
return (text.compare(0, token.length(), token) == 0); 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 // 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 * 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 created file. This function is the one that knows the format
* of the padder input file. If the input file format changes, then * 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, const char * MeshJobManager_i::_writeDataFile(std::vector<MESHJOB::MeshJobParameter> listConcreteMesh,
std::vector<MESHJOB::MeshJobParameter> listSteelBarMesh) { 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) // Make it static so that it's allocated once (constant name)
static std::string * dataFilename = new std::string(LOCAL_INPUTDIR+"/"+DATAFILE); static std::string * dataFilename = new std::string(LOCAL_INPUTDIR+"/"+DATAFILE);
std::ofstream dataFile(dataFilename->c_str()); 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; std::string line;
// We first specify the concrete mesh data (filename and groupname)
if ( listConcreteMesh.size() > 0 ) {
#ifdef WIN32 #ifdef WIN32
char fname[ _MAX_FNAME ]; char fname[ _MAX_FNAME ];
_splitpath( listConcreteMesh[0].file_name, NULL, NULL, fname, NULL ); _splitpath( listConcreteMesh[0].file_name, NULL, NULL, fname, NULL );
char* bname = &fname[0]; char* bname = &fname[0];
#else #else
char* bname = basename(listConcreteMesh[0].file_name); char* bname = basename(listConcreteMesh[0].file_name);
#endif #endif
line = std::string(bname) + " " + std::string(listConcreteMesh[0].group_name); line = std::string(bname) + " " + std::string(listConcreteMesh[0].group_name);
dataFile << line.c_str() << std::endl; 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. // Then, we can specify the steelbar mesh data, starting by the
// The, we can specify the steelbar mesh data, starting by the
// number of meshes // number of meshes
int nbSteelBarMesh=listSteelBarMesh.size(); int nbSteelBarMeshes=listSteelBarMesh.size();
line = std::string("nbSteelbarMesh") + SEPARATOR + ToString(nbSteelBarMesh); line = std::string("nbSteelBarMeshes") + SEPARATOR + ToString(nbSteelBarMeshes);
dataFile << line.c_str() << std::endl; dataFile << line.c_str() << std::endl;
for (int i=0; i<nbSteelBarMesh; i++) { for (int i=0; i<nbSteelBarMeshes; i++) {
#ifdef WIN32 #ifdef WIN32
char fname[ _MAX_FNAME ]; char fname[ _MAX_FNAME ];
_splitpath( listSteelBarMesh[i].file_name, NULL, NULL, fname, NULL ); _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) const char * configId)
{ {
beginService("MeshJobManager_i::initialize"); 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 // 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 // We specify the input files that are required to execute the
// job_file. If basenames are specified, then the files are supposed // job_file. If basenames are specified, then the files are supposed
// to be located in local_directory. // 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: // The number of input file is:
// (nb. of steelbar meshfile) // (nb. of steelbar meshfile)
// + (1 concrete meshfile) // + (1 or 0 concrete meshfile)
// + (1 padder input file) // + (1 padder input file)
// = nb steelbar meshfile + 2
jobParameters->in_files.length(nbFiles); jobParameters->in_files.length(nbFiles);
jobParameters->in_files[0] = CORBA::string_dup(listConcreteMesh[0].file_name); for (int i=0; i<nbcmesh; i++) {
for (int i=0; i<listSteelBarMesh.size(); i++) { jobParameters->in_files[i] = CORBA::string_dup(listConcreteMesh[i].file_name);
jobParameters->in_files[1+i] = CORBA::string_dup(listSteelBarMesh[i].file_name);
} }
jobParameters->in_files[1+listSteelBarMesh.size()] = CORBA::string_dup(dataFilename); for (int i=0; i<nbsmesh; i++) {
jobParameters->in_files[nbcmesh+i] = CORBA::string_dup(listSteelBarMesh[i].file_name);
}
jobParameters->in_files[nbcmesh+nbsmesh] = CORBA::string_dup(dataFilename);
// Note that all these input files will be copied in the // Note that all these input files will be copied in the
// REMOTE_WORKDIR on the remote host // REMOTE_WORKDIR on the remote host. At this step, they should
// all exist, so we can check their presence on the local
// Then, we have to specify the existance of an output // filesystem.
// filenames. The path is supposed to be a path on the remote for (int i=0; i<nbFiles; i++) {
// resource, i.e. where the job is executed. 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); jobParameters->out_files.length(1);
std::string outputfile_name = std::string(jobPaths->remote_workdir)+"/"+OUTPUTFILE; std::string outputfile_name = std::string(jobPaths->remote_workdir)+"/"+OUTPUTFILE;
jobParameters->out_files[0] = CORBA::string_dup(outputfile_name.c_str()); jobParameters->out_files[0] = CORBA::string_dup(outputfile_name.c_str());

View File

@ -312,8 +312,8 @@ class InputDialog(GenericDialog):
This function checks if the data are valid, from the dialog This function checks if the data are valid, from the dialog
window point of view. window point of view.
""" """
if self.__nbConcreteMesh < 1: if self.__nbConcreteMesh == 0 and self.__nbSteelbarMesh == 0:
self.checkDataMessage = "You must define at least one CONCRETE mesh" self.checkDataMessage = "You must define at least one mesh (CONCRETE or STEELBAR)"
return False return False
if self.__nbConcreteMesh > 1: if self.__nbConcreteMesh > 1:
self.checkDataMessage = "You define multiple CONCRETE meshes." self.checkDataMessage = "You define multiple CONCRETE meshes."
@ -321,9 +321,7 @@ class InputDialog(GenericDialog):
# just warn the user, but don't block # just warn the user, but don't block
QMessageBox.information(self, "Info", self.checkDataMessage) QMessageBox.information(self, "Info", self.checkDataMessage)
return True return True
if self.__nbSteelbarMesh < 1:
self.checkDataMessage = "You must define at least one STEELBAR mesh"
return False
return True return True

View File

@ -33,3 +33,9 @@ envpath = /usr/local/share/envPadder.sh
resname = nepal@nepal resname = nepal@nepal
binpath = /usr/local/bin/padder.exe binpath = /usr/local/bin/padder.exe
envpath = /usr/local/share/envPadder.sh 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

View File

@ -21,10 +21,13 @@
# #
# This script illustrates the standard use case of the component # 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 # Preparing the configuration parameters
# =======================================================================
# #
import sys import sys
import os 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(): def test00_parameters():
"""Test using a concrete mesh and a single steelbar mesh""" """Test using a concrete mesh and a single steelbar mesh"""
file_concrete=os.path.join(spadder.getTestDataDir(),"concrete.med") file_concrete=os.path.join(spadder.getTestDataDir(),"concrete.med")
@ -127,13 +138,16 @@ def test03_parameters():
return meshJobParameterList return meshJobParameterList
# #
# Choose here the use case # =======================================================================
# Prepare the job parameters and initialize the job
# =======================================================================
# #
# Choose here the use case
#meshJobParameterList = test00_parameters() #meshJobParameterList = test00_parameters()
#meshJobParameterList = test01_parameters() #meshJobParameterList = test01_parameters()
meshJobParameterList = test02_parameters() #meshJobParameterList = test02_parameters()
#meshJobParameterList = test03_parameters() meshJobParameterList = test03_parameters()
# #
# Prepare, start and follow-up the job # Prepare, start and follow-up the job
@ -154,6 +168,11 @@ while not created:
time.sleep(0.5) time.sleep(0.5)
nbiter+=1 nbiter+=1
#
# =======================================================================
# Submit the job and start the supervision
# =======================================================================
# #
# Start the execution of the job identified by its job id. # Start the execution of the job identified by its job id.
# #