Arcane  v3.14.10.0
Documentation développeur
Chargement...
Recherche...
Aucune correspondance
UnitTestModule.cc
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2024 CEA (www.cea.fr) IFPEN (www.ifpenergiesnouvelles.com)
4// See the top-level COPYRIGHT file for details.
5// SPDX-License-Identifier: Apache-2.0
6//-----------------------------------------------------------------------------
7/*---------------------------------------------------------------------------*/
8/* UnitTestModule.cc (C) 2000-2024 */
9/* */
10/* Module pour les tests unitaires. */
11/*---------------------------------------------------------------------------*/
12/*---------------------------------------------------------------------------*/
13
14#include "arcane/utils/ScopedPtr.h"
15
16#include "arcane/core/IUnitTest.h"
17#include "arcane/core/ISubDomain.h"
18#include "arcane/core/IApplication.h"
19#include "arcane/core/ITimeLoop.h"
20#include "arcane/core/ITimeLoopMng.h"
21#include "arcane/core/IXmlDocumentHolder.h"
22#include "arcane/core/IIOMng.h"
23#include "arcane/core/ArcaneException.h"
24#include "arcane/core/TimeLoopEntryPointInfo.h"
25#include "arcane/core/Directory.h"
26#include "arcane/core/XmlNode.h"
27#include "arcane/core/IParallelMng.h"
28#include "arcane/core/DomUtils.h"
29
30#include "arcane/std/UnitTest_axl.h"
31
32/*---------------------------------------------------------------------------*/
33/*---------------------------------------------------------------------------*/
34
35namespace Arcane
36{
37
38/*---------------------------------------------------------------------------*/
39/*---------------------------------------------------------------------------*/
45{
46 public:
47
48 explicit UnitTestModule(const ModuleBuildInfo& cb);
49
50 public:
51
52 static void staticInitialize(ISubDomain* sd);
53 VersionInfo versionInfo() const override { return VersionInfo(2, 0, 0); }
54
55 public:
56
57 void unitTestBuild() override;
58 void unitTestInit() override;
59 void unitTestDoTest() override;
60 void unitTestExit() override;
61
62 private:
63
65 bool m_success = true;
66
67 private:
68
69 void _checkCreateXmlTestDocument();
70};
71
72/*---------------------------------------------------------------------------*/
73/*---------------------------------------------------------------------------*/
74
75ARCANE_REGISTER_MODULE_UNITTEST(UnitTestModule);
76
77/*---------------------------------------------------------------------------*/
78/*---------------------------------------------------------------------------*/
79
80UnitTestModule::
81UnitTestModule(const ModuleBuildInfo& mb)
83, m_tests_doc(domutils::createXmlDocument())
84{
85 XmlNode doc = m_tests_doc->documentNode();
86 XmlElement root(doc, "unit-tests-results");
87}
88
89/*---------------------------------------------------------------------------*/
90/*---------------------------------------------------------------------------*/
91
92void UnitTestModule::
93staticInitialize(ISubDomain* sd)
94{
95 String time_loop_name("UnitTest");
96 ITimeLoopMng* tlm = sd->timeLoopMng();
97 ITimeLoop* time_loop = tlm->createTimeLoop(time_loop_name);
98
99 {
100 List<TimeLoopEntryPointInfo> clist;
101 clist.add(TimeLoopEntryPointInfo("UnitTest.UnitTestBuild"));
102 time_loop->setEntryPoints(ITimeLoop::WBuild, clist);
103 }
104
105 {
106 List<TimeLoopEntryPointInfo> clist;
107 clist.add(TimeLoopEntryPointInfo("UnitTest.UnitTestInit"));
108 time_loop->setEntryPoints(ITimeLoop::WInit, clist);
109 }
110
111 {
112 List<TimeLoopEntryPointInfo> clist;
113 clist.add(TimeLoopEntryPointInfo("UnitTest.UnitTestDoTest"));
114 time_loop->setEntryPoints(ITimeLoop::WComputeLoop, clist);
115 }
116
117 {
118 List<TimeLoopEntryPointInfo> clist;
119 clist.add(TimeLoopEntryPointInfo("UnitTest.UnitTestExit"));
120 time_loop->setEntryPoints(ITimeLoop::WExit, clist);
121 }
122
123 {
124 StringList clist;
125 clist.add("UnitTest");
126 clist.add("ArcanePostProcessing");
127 time_loop->setRequiredModulesName(clist);
128 }
129
130 tlm->registerTimeLoop(time_loop);
131}
132
133/*---------------------------------------------------------------------------*/
134/*---------------------------------------------------------------------------*/
135
138{
139 for (IUnitTest* service : options()->test)
140 service->buildInitializeTest();
141
142 for (IXmlUnitTest* service : options()->xmlTest)
143 service->buildInitializeTest();
144}
145
146/*---------------------------------------------------------------------------*/
147/*---------------------------------------------------------------------------*/
148
149void UnitTestModule::
150unitTestInit()
151{
152 // Initialise au cas où aucun test ne le fait
153 m_global_deltat = 1.0;
154
155 for (IUnitTest* service : options()->test)
156 service->initializeTest();
157
158 for (IXmlUnitTest* service : options()->xmlTest)
159 service->initializeTest();
160}
161
162/*---------------------------------------------------------------------------*/
163/*---------------------------------------------------------------------------*/
164
165void UnitTestModule::
166unitTestDoTest()
167{
168 subDomain()->timeLoopMng()->stopComputeLoop(false);
169
170 for (IUnitTest* service : options()->test)
171 service->executeTest();
172
173 if (options()->xmlTest.size() > 0) {
174 XmlNode xtests = m_tests_doc->documentNode().documentElement();
175 for (IXmlUnitTest* service : options()->xmlTest) {
176 XmlNode xservice = xtests.createAndAppendElement("service");
177 if (!service->executeTest(xservice))
178 m_success = false;
179 }
180 }
181}
182
183/*---------------------------------------------------------------------------*/
184/*---------------------------------------------------------------------------*/
185
186void UnitTestModule::
187unitTestExit()
188{
189 for (IUnitTest* service : options()->test)
190 service->finalizeTest();
191
192 for (IXmlUnitTest* service : options()->xmlTest)
193 service->finalizeTest();
194
195 if (options()->xmlTest.size() > 0) {
196 // ecriture du rapport XML.
197 // En parallèle, seul le processeur maitre écrit le fichier
198 IParallelMng* pm = subDomain()->parallelMng();
199 if (pm->isMasterIO()) {
200 Directory listing_dir(subDomain()->listingDirectory());
201 String filename(listing_dir.file("unittests.xml"));
202 info() << "Output of the report of the unit test in '" << filename << "'";
203 subDomain()->ioMng()->writeXmlFile(m_tests_doc.get(), filename);
204 }
205
206 // sortie en exception si demandé
207 if (!m_success)
208 ARCANE_FATAL("Some errors have occured in the unit tests.");
209 }
210}
211
212/*---------------------------------------------------------------------------*/
213/*---------------------------------------------------------------------------*/
214
215} // End namespace Arcane
216
217/*---------------------------------------------------------------------------*/
218/*---------------------------------------------------------------------------*/
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
ISubDomain * subDomain() const override
Sous-domaine associé au module.
Generation de la classe de base du Module.
CaseOptionsUnitTest * options() const
Options du jeu de données du module.
VariableScalarReal m_global_deltat
Delta T global.
virtual bool isMasterIO() const =0
true si l'instance est un gestionnaire maître des entrées/sorties.
Interface du gestionnaire d'un sous-domaine.
Definition ISubDomain.h:74
virtual IIOMng * ioMng()=0
Retourne le gestionnaire des entrées/sorties.
virtual IParallelMng * parallelMng()=0
Retourne le gestionnaire de parallélisme.
virtual ITimeLoopMng * timeLoopMng()=0
Retourne le gestionnaire de la boucle en temps.
static const char * WExit
appelé lors de la terminaison du code.
Definition ITimeLoop.h:60
static const char * WBuild
appelé lors de la lecture du jeu de données
Definition ITimeLoop.h:50
static const char * WComputeLoop
appelé pendant la boucle de calcul
Definition ITimeLoop.h:48
static const char * WInit
appelé pendant l'initialisation, l'initialisation d'une reprise ou d'un nouveau cas
Definition ITimeLoop.h:52
Interface d'un service de test unitaire.
Definition IUnitTest.h:34
Interface d'un service de test unitaire fournissant un rapport de test sous forme d'un noeud XML.
Definition IUnitTest.h:62
Lecteur des fichiers de maillage via la bibliothèque LIMA.
Definition Lima.cc:120
Informations pour construire un module.
ScopedPtrT< IXmlDocumentHolder > m_tests_doc
Traces des tests unitaires.
VersionInfo versionInfo() const override
Version du module.
bool m_success
Vrai tant qu'un test unitaire n'a pas retourné d'erreur.
void unitTestBuild() override
points d'entrée
Informations sur une version.
Definition VersionInfo.h:46
Elément d'un arbre DOM.
Definition XmlNode.h:396
Noeud d'un arbre DOM.
Definition XmlNode.h:51
TraceMessage info() const
Flot pour un message d'information.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
List< String > StringList
Tableau de chaînes de caractères unicode.
Definition UtilsTypes.h:667