cmCTestTestHandler.h 7.96 KB
Newer Older
1
2
3
/*============================================================================
  CMake - Cross Platform Makefile Generator
  Copyright 2000-2009 Kitware, Inc.
Ken Martin's avatar
Ken Martin committed
4

5
6
  Distributed under the OSI-approved BSD License (the "License");
  see accompanying file Copyright.txt for details.
Ken Martin's avatar
Ken Martin committed
7

8
9
10
11
  This software is distributed WITHOUT ANY WARRANTY; without even the
  implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  See the License for more information.
============================================================================*/
Ken Martin's avatar
Ken Martin committed
12
13
14
15
16

#ifndef cmCTestTestHandler_h
#define cmCTestTestHandler_h


17
#include "cmCTestGenericHandler.h"
18
#include <cmsys/RegularExpression.hxx>
Ken Martin's avatar
Ken Martin committed
19
20
21
22
23
24
25

class cmMakefile;

/** \class cmCTestTestHandler
 * \brief A class that handles ctest -S invocations
 *
 */
26
class cmCTestTestHandler : public cmCTestGenericHandler
Ken Martin's avatar
Ken Martin committed
27
{
28
  friend class cmCTestRunTest;
29
  friend class cmCTestMultiProcessHandler;
30
  friend class cmCTestBatchTestHandler;
Ken Martin's avatar
Ken Martin committed
31
public:
32
  cmTypeMacro(cmCTestTestHandler, cmCTestGenericHandler);
Ken Martin's avatar
Ken Martin committed
33

34
  /**
Ken Martin's avatar
Ken Martin committed
35
36
   * The main entry point for this class
   */
37
  int ProcessHandler();
Andy Cedilnik's avatar
Andy Cedilnik committed
38

39
  /**
40
41
42
43
   * When both -R and -I are used should te resulting test list be the
   * intersection or the union of the lists. By default it is the
   * intersection.
   */
Andy Cedilnik's avatar
Andy Cedilnik committed
44
  void SetUseUnion(bool val) { this->UseUnion = val; }
45

46
47
48
  /**
   * This method is called when reading CTest custom file
   */
49
  void PopulateCustomVectors(cmMakefile *mf);
Andy Cedilnik's avatar
Andy Cedilnik committed
50

Ken Martin's avatar
Ken Martin committed
51
52
53
54
55
56
  ///! Control the use of the regular expresisons, call these methods to turn
  ///them on
  void UseIncludeRegExp();
  void UseExcludeRegExp();
  void SetIncludeRegExp(const char *);
  void SetExcludeRegExp(const char *);
Andy Cedilnik's avatar
Andy Cedilnik committed
57

58
59
  void SetMaxIndex(int n) {this->MaxIndex = n;}
  int GetMaxIndex() {return this->MaxIndex;}
Ken Martin's avatar
Ken Martin committed
60
61
62
63

  ///! pass the -I argument down
  void SetTestsToRunInformation(const char*);

64
  cmCTestTestHandler();
Ken Martin's avatar
Ken Martin committed
65

66
67
68
  /*
   * Add the test to the list of tests to be executed
   */
69
  bool AddTest(const std::vector<std::string>& args);
70

71
72
73
74
75
  /*
   * Set tests properties
   */
  bool SetTestsProperties(const std::vector<std::string>& args);

76
77
  void Initialize();

Bill Hoffman's avatar
Bill Hoffman committed
78
79
80
81
  // NOTE: This struct is Saved/Restored
  // in cmCTestTestHandler, if you add to this class
  // then you must add the new members to that code or
  // ctest -j N will break for that feature
Andy Cedilnik's avatar
Andy Cedilnik committed
82
83
  struct cmCTestTestProperties
  {
Andy Cedilnik's avatar
Andy Cedilnik committed
84
85
86
    cmStdString Name;
    cmStdString Directory;
    std::vector<std::string> Args;
87
    std::vector<std::string> RequiredFiles;
88
    std::vector<std::string> Depends;
89
    std::vector<std::string> AttachedFiles;
90
    std::vector<std::string> AttachOnFail;
Bill Hoffman's avatar
Bill Hoffman committed
91
92
93
94
    std::vector<std::pair<cmsys::RegularExpression,
                          std::string> > ErrorRegularExpressions;
    std::vector<std::pair<cmsys::RegularExpression,
                          std::string> > RequiredRegularExpressions;
95
    std::map<cmStdString, cmStdString> Measurements;
Andy Cedilnik's avatar
Andy Cedilnik committed
96
97
    bool IsInBasedOnREOptions;
    bool WillFail;
98
    float Cost;
99
    int PreviousRuns;
100
    bool RunSerial;
101
    double Timeout;
102
    bool ExplicitTimeout;
103
    int Index;
104
105
    //Requested number of process slots
    int Processors;
106
    std::vector<std::string> Environment;
107
    std::vector<std::string> Labels;
Zach's avatar
Zach committed
108
    std::set<std::string> LockedResources;
Andy Cedilnik's avatar
Andy Cedilnik committed
109
110
  };

111
112
113
114
  struct cmCTestTestResult
  {
    std::string Name;
    std::string Path;
115
    std::string Reason;
116
117
118
119
    std::string FullCommandLine;
    double      ExecutionTime;
    int         ReturnValue;
    int         Status;
120
    bool        CompressOutput;
121
122
123
124
125
126
127
    std::string CompletionStatus;
    std::string Output;
    std::string RegressionImages;
    int         TestCount;
    cmCTestTestProperties* Properties;
  };

128
129
130
131
132
133
134
135
136
137
138
139
140
141
  // add configuraitons to a search path for an executable
  static void AddConfigurations(cmCTest *ctest, 
                                std::vector<std::string> &attempted,
                                std::vector<std::string> &attemptedConfigs,
                                std::string filepath,
                                std::string &filename);

  // full signature static method to find an executable
  static std::string FindExecutable(cmCTest *ctest,
                                    const char *testCommand,
                                    std::string &resultingConfig,
                                    std::vector<std::string> &extraPaths,
                                    std::vector<std::string> &failed);

142
  typedef std::vector<cmCTestTestProperties> ListOfTests;
Andy Cedilnik's avatar
Andy Cedilnik committed
143
protected:
144
  // comput a final test list
145
146
  virtual int PreProcessHandler();
  virtual int PostProcessHandler();
Zach's avatar
Zach committed
147
  virtual void GenerateTestCommand(std::vector<std::string>& args);
148
149
  int ExecuteCommands(std::vector<cmStdString>& vec);

150
151
  void WriteTestResultHeader(std::ostream& os, cmCTestTestResult* result);
  void WriteTestResultFooter(std::ostream& os, cmCTestTestResult* result);
152
153
154
  // Write attached test files into the xml
  void AttachFiles(std::ostream& os, cmCTestTestResult* result);
  // Helper function to encode attached test files
155
  std::string EncodeFile(std::string file);
156

157
158
159
  //! Clean test output to specified length
  bool CleanTestOutput(std::string& output, size_t length);

Andy Cedilnik's avatar
Andy Cedilnik committed
160
  double                  ElapsedTestingTime;
161

Andy Cedilnik's avatar
Andy Cedilnik committed
162
163
  typedef std::vector<cmCTestTestResult> TestResultsVector;
  TestResultsVector    TestResults;
Ken Martin's avatar
Ken Martin committed
164

Andy Cedilnik's avatar
Andy Cedilnik committed
165
166
167
  std::vector<cmStdString> CustomTestsIgnore;
  std::string             StartTest;
  std::string             EndTest;
168
169
  unsigned int            StartTestTime;
  unsigned int            EndTestTime;
Andy Cedilnik's avatar
Andy Cedilnik committed
170
  bool MemCheck;
171
172
  int CustomMaximumPassedTestOutputSize;
  int CustomMaximumFailedTestOutputSize;
173
  int MaxIndex;
174
public:
175
176
177
178
179
180
181
182
183
184
185
186
  enum { // Program statuses
    NOT_RUN = 0,
    TIMEOUT,
    SEGFAULT,
    ILLEGAL,
    INTERRUPT,
    NUMERICAL,
    OTHER_FAULT,
    FAILED,
    BAD_COMMAND,
    COMPLETED
  };
Ken Martin's avatar
Ken Martin committed
187

188
private:
Ken Martin's avatar
Ken Martin committed
189
190
191
  /**
   * Generate the Dart compatible output
   */
192
  virtual void GenerateDartOutput(std::ostream& os);
Ken Martin's avatar
Ken Martin committed
193

194
  void PrintLabelSummary();
Ken Martin's avatar
Ken Martin committed
195
  /**
196
   * Run the tests for a directory and any subdirectories
Ken Martin's avatar
Ken Martin committed
197
   */
Andy Cedilnik's avatar
Andy Cedilnik committed
198
  void ProcessDirectory(std::vector<cmStdString> &passed,
199
                        std::vector<cmStdString> &failed);
Andy Cedilnik's avatar
Andy Cedilnik committed
200

Ken Martin's avatar
Ken Martin committed
201
202
203
  /**
   * Get the list of tests in directory and subdirectories.
   */
204
  void GetListOfTests();
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
  // compute the lists of tests that will actually run
  // based on union regex and -I stuff
  void ComputeTestList();
  
  bool GetValue(const char* tag,
                std::string& value,
                std::ifstream& fin);
  bool GetValue(const char* tag,
                int& value,
                std::ifstream& fin);
  bool GetValue(const char* tag,
                size_t& value,
                std::ifstream& fin);
  bool GetValue(const char* tag,
                bool& value,
                std::ifstream& fin);
  bool GetValue(const char* tag,
                double& value,
                std::ifstream& fin);
Ken Martin's avatar
Ken Martin committed
224
225
226
227
228
229
  /**
   * Find the executable for a test
   */
  std::string FindTheExecutable(const char *exe);

  const char* GetTestStatus(int status);
Bill Hoffman's avatar
Bill Hoffman committed
230
  void ExpandTestsToRunInformation(size_t numPossibleTests);
Ken Martin's avatar
Ken Martin committed
231

Andy Cedilnik's avatar
Andy Cedilnik committed
232
233
  std::vector<cmStdString> CustomPreTest;
  std::vector<cmStdString> CustomPostTest;
Ken Martin's avatar
Ken Martin committed
234

Andy Cedilnik's avatar
Andy Cedilnik committed
235
  std::vector<int>        TestsToRun;
Ken Martin's avatar
Ken Martin committed
236

237
238
  bool UseIncludeLabelRegExpFlag;
  bool UseExcludeLabelRegExpFlag;
Andy Cedilnik's avatar
Andy Cedilnik committed
239
240
241
  bool UseIncludeRegExpFlag;
  bool UseExcludeRegExpFlag;
  bool UseExcludeRegExpFirst;
242
243
  std::string IncludeLabelRegExp;
  std::string ExcludeLabelRegExp;
Andy Cedilnik's avatar
Andy Cedilnik committed
244
245
  std::string IncludeRegExp;
  std::string ExcludeRegExp;
246
247
  cmsys::RegularExpression IncludeLabelRegularExpression;
  cmsys::RegularExpression ExcludeLabelRegularExpression;
Andy Cedilnik's avatar
Andy Cedilnik committed
248
249
  cmsys::RegularExpression IncludeTestsRegularExpression;
  cmsys::RegularExpression ExcludeTestsRegularExpression;
Ken Martin's avatar
Ken Martin committed
250
251

  std::string GenerateRegressionImages(const std::string& xml);
Bill Hoffman's avatar
Bill Hoffman committed
252
  cmsys::RegularExpression DartStuff1;
253
254
255
  void CheckLabelFilter(cmCTestTestProperties& it);
  void CheckLabelFilterExclude(cmCTestTestProperties& it);
  void CheckLabelFilterInclude(cmCTestTestProperties& it);
Ken Martin's avatar
Ken Martin committed
256
257

  std::string TestsToRunString;
Andy Cedilnik's avatar
Andy Cedilnik committed
258
259
  bool UseUnion;
  ListOfTests TestList;
260
  size_t TotalNumberOfTests;
Andy Cedilnik's avatar
Andy Cedilnik committed
261
  cmsys::RegularExpression DartStuff;
Andy Cedilnik's avatar
Andy Cedilnik committed
262

Andy Cedilnik's avatar
Andy Cedilnik committed
263
  std::ostream* LogFile;
Ken Martin's avatar
Ken Martin committed
264
265
266
};

#endif