source: anotherchoice/tags/jsp-1.4.4-full-UTF8/cfg/base/testsuite.cpp@ 26

Last change on this file since 26 was 26, checked in by ykominami, 10 years ago

initial

File size: 11.2 KB
Line 
1/*
2 * TOPPERS/JSP Kernel
3 * Toyohashi Open Platform for Embedded Real-Time Systems/
4 * Just Standard Profile Kernel
5 *
6 * Copyright (C) 2003 by Embedded and Real-Time Systems Laboratory
7 * Toyohashi Univ. of Technology, JAPAN
8 *
9 * 上記著作権者
10は,以下の (1)〜(4) の条件か,Free Software Foundation
11 * によってå…
12¬è¡¨ã•ã‚Œã¦ã„ã‚‹ GNU General Public License の Version 2 に記
13 * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア
14 * を改変したものを含む.以下同じ)を使用・複製・改変・再é…
15å¸ƒï¼ˆä»¥ä¸‹ï¼Œ
16 * 利用と呼ぶ)することを無償で許諾する.
17 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
18 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
19 * スコード中に含まれていること.
20 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
21 * 用できる形で再é…
22å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œå†é…
23å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨
24 * 者
25マニュアルなど)に,上記の著作権表示,この利用条件および下記
26 * の無保証規定を掲載すること.
27 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
28 * 用できない形で再é…
29å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œæ¬¡ã®ã„ずれかの条件を満たすこ
30 * と.
31 * (a) 再é…
32å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨è€…
33マニュアルなど)に,上記の著
34 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
35 * (b) 再é…
36å¸ƒã®å½¢æ…
37‹ã‚’,別に定める方法によって,TOPPERSプロジェクトに
38 * 報告すること.
39 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
40 * 害からも,上記著作権者
41およびTOPPERSプロジェクトをå…
42è²¬ã™ã‚‹ã“と.
43 *
44 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者
45お
46 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も
47 * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直
48 * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない.
49 *
50 * @(#) $Id: testsuite.cpp,v 1.3 2003/12/15 07:32:14 takayuki Exp $
51 */
52
53// $Header: /home/CVS/configurator/base/testsuite.cpp,v 1.3 2003/12/15 07:32:14 takayuki Exp $
54
55#include "base/testsuite.h"
56
57#include "base/coverage_defs.h"
58#include "base/coverage_undefs.h"
59
60#ifdef TESTSUITE
61
62#undef main //テストスィート用のmainを定義するのでundefする
63#undef cin
64#undef cout
65#undef cerr
66
67#include <stdlib.h> //EXIT_SUCCESS|EXIT_FAILURE用
68#include <fstream> //作業関数用
69#include <cstdio>
70#include <iomanip>
71
72using namespace std;
73
74/* ストリームå…
75¥æ›ãˆç”¨ã®å¤‰æ•°å®šç¾© */
76namespace std {
77 stringstream _cin;
78 stringstream _cout;
79 stringstream _cerr;
80}
81
82/*
83 * テストスィートの実行制御クラス ; class TestSuiteControl
84 */
85
86
87 //コンストラクタ
88TestSuiteControl::TestSuiteControl(ostream & _out, const char * _pattern) : target_session(_pattern), out(&_out), fail(false), verbose(false), case_count(0), fail_count(0)
89{}
90
91 //シナリオ名の取得
92string TestSuiteControl::get_suitename(const char * name) const
93{
94 string result;
95 list<string>::const_iterator scope;
96
97 scope = session.begin();
98 while(scope != session.end()) {
99 result += *scope;
100 result += '.';
101 ++ scope;
102 }
103
104 if(name != NULL)
105 result += name;
106
107 return result;
108}
109
110
111 //テストシナリオの表題設定 (返却値 : 実行する必
112要があるかどうか)
113bool TestSuiteControl::_enter_case(const char * session, const char * description, const char * filename, long lineno)
114{
115 bool result;
116 stringstream buf;
117
118 //表題の設定
119 current_session.assign(get_suitename(session));
120
121 //詳細情
122報の設定
123 if(description != 0)
124 buf << description;
125
126 //ファイル名 (filename:lineno) の生成
127 if(filename != 0) {
128 string work(filename);
129 string::size_type pos;
130
131 //フルパスで来たら短く切る
132 pos = work.find_last_of("/\\");
133 if(pos != string::npos)
134 work.erase(0, pos + 1);
135
136 buf << '(' << work;
137 if(lineno != -1)
138 buf << ':' << lineno;
139 buf << ')';
140 }
141 current_description = buf.str();
142
143 //実行する必
144要の有無の確認
145 result = (target_session.empty() || current_session.find(target_session) != string::npos);
146
147 if(result) {
148 if(verbose) {
149 string indent;
150 indent.assign(2 * this->session.size(), ' ');
151 (*out) << indent << '[' << session << "] " << current_description << endl;
152
153 //(*out) << '[' << current_session << "] " << current_description << endl;
154 }
155
156 enter_session(session);
157 ++ case_count;
158 }
159
160 return result;
161}
162
163 //テストセッション名 (シナリオプレフィクス) の設定
164void TestSuiteControl::enter_session(const string & _session)
165{ session.push_back(_session); }
166
167 //テストセッション名 (シナリオプレフィクス) の解除
168void TestSuiteControl::leave_session(void)
169{ session.pop_back(); }
170
171 //テストシナリオの失敗報告
172void TestSuiteControl::fail_in_suite(string msg)
173{
174 fail = true;
175 (*out) << "Failed : [" << current_session << "]\n " << current_description << endl;
176 if(!msg.empty())
177 (*out) << " #" << msg << endl;
178 ++ fail_count;
179}
180
181
182 //スィート情
183報コンストラクタ
184TestSuite::SuiteContainerNode::SuiteContainerNode(const char * _session, SuiteFunction _suite) : session(_session), suite(_suite)
185{}
186
187 //スィート情
188報コンストラクタ
189TestSuite::SuiteContainerNode::SuiteContainerNode(const SuiteContainerNode & src) : session(src.session), suite(src.suite)
190{}
191
192 //スィートの実行
193bool TestSuite::SuiteContainerNode::invoke(TestSuiteControl & suite_control)
194{
195 if(suite != 0) {
196 suite_control.enter_session(session);
197 (*suite)(suite_control);
198 suite_control.leave_session();
199 }
200
201 return !suite_control.is_failed();
202}
203
204/*
205 * テストスィート実行クラス
206 */
207
208 //コンストラクタ
209TestSuite::TestSuite(const char * session, SuiteFunction suite) : fail(false)
210{ Singleton<SuiteContainer>::getInstance()->push_back(SuiteContainerNode(session, suite)); }
211
212
213 //デストラクタ
214TestSuite::~TestSuite(void)
215{}
216
217
218 //テストスィートの実行 (返却値:スィートを実行したかどうか)
219bool TestSuite::performTestSuite(int flags, const char * pattern)
220{
221 bool result;
222 TestSuiteControl suite_control(cerr, pattern);
223 SuiteContainer * container;
224 SuiteContainer::iterator scope;
225
226 //実行スィートリストの参ç…
227§
228 container = Singleton<SuiteContainer>::getInstance();
229
230 //冗長出力設定
231 if( (flags & VERBOSE) != 0 )
232 suite_control.set_verbose();
233
234 //å…
235¨ç™»éŒ²ã‚¹ã‚£ãƒ¼ãƒˆã®å®Ÿè¡Œ
236 scope = container->begin();
237 while(scope != container->end()) {
238
239 result = scope->invoke(suite_control);
240
241 //いちいち止める or 通しで実行
242 if( !result && (flags & THROUGH) == 0)
243 break;
244
245 ++ scope;
246 }
247
248 //エラーがなければOK表示
249 if(!suite_control.is_failed())
250 cerr << "OK (" << suite_control.countCases() << " passed)" << endl;
251 else
252 cerr << "Failed (" << suite_control.countFails() << '/' << suite_control.countCases() << ')' << endl;
253
254 return !suite_control.is_failed(); //スィートを正常に実行できたらtrue
255}
256
257
258 //登録されているトップレベルスィートの一覧表示
259void TestSuite::listTestSuite(void)
260{
261 SuiteContainer::iterator scope;
262 int count;
263 SuiteContainer * container;
264
265 count = 0;
266 container = Singleton<SuiteContainer>::getInstance();
267
268 scope = container->begin();
269 while(scope != container->end()) {
270 cout << " ";
271 cout.width(3);
272 cout << count << ':' << scope->getName() << endl;
273
274 ++ count;
275 ++ scope;
276 }
277 cout << "Total " << count << " sets of suite exist.\n";
278}
279
280
281
282/*
283 * チェックポイント用関数
284 */
285
286bool TestSuite::isReached(std::string checkname)
287{
288 set<string>::iterator scope;
289
290 scope = Singleton<Checkpoint>::getInstance()->find(checkname);
291
292 return scope != Singleton<Checkpoint>::getInstance()->end();
293}
294
295
296/*
297 * テストスィート実行用作業関数
298 */
299
300 //ファイル内
301容比較
302bool TestSuite::compareFileContents(const char * filename, const char * filecontents, bool _remove)
303{
304 fstream file(filename,ios::in);
305 int ch;
306 bool result = true;
307
308 //内
309容チェック
310 while(result && *filecontents != '\x0' && file.good()) {
311 ch = file.get();
312
313 if(ch != (int)*filecontents)
314 result = false;
315
316 ++ filecontents;
317 }
318
319 //EOFに達しているか
320 if(result) {
321 if(!file.good() || file.get() != EOF)
322 result = false;
323 }
324
325 file.close();
326
327 if(_remove)
328 ::remove(filename);
329
330 return result;
331}
332
333
334/*
335 * テストスィート実行用main関数
336 */
337int main(int argc, char ** argv)
338{
339 int result;
340 int pos;
341 int flags;
342 string category;
343
344 flags = TestSuite::DEFAULT;
345
346 for(pos = 1; pos < argc; ++ pos) {
347 if(*argv[pos] == '-') {
348 switch(argv[pos][1]) {
349 case 'v':
350 flags |= TestSuite::VERBOSE;
351 break;
352 case 'V':
353 flags &= ~TestSuite::VERBOSE;
354 break;
355 case 't':
356 flags |= TestSuite::THROUGH;
357 break;
358 case 'T':
359 flags &= ~TestSuite::THROUGH;
360 break;
361 case 'l':
362 TestSuite::listTestSuite();
363 return EXIT_SUCCESS;
364 case 'h':
365 cerr << "Usage : program (option) (suite)\n"
366 " -v, -V : Verbose output on(-v) / off(-V)\n"
367 " -t, -T : Go through with the suite, on(-t) / off(-T)\n"
368 " -l : List the top level suites\n";
369 return EXIT_SUCCESS;
370 default:
371 cerr << "Unknown option [" << argv[pos] << "]\n";
372 return EXIT_FAILURE;
373 }
374 }
375 else {
376 if(!category.empty()) {
377 cerr << "Two or more category specified.\n";
378 return EXIT_FAILURE;
379 }
380 category.assign(argv[pos]);
381 }
382 }
383
384 result = EXIT_FAILURE;
385 if(TestSuite::performTestSuite(flags, category.c_str()))
386 result = EXIT_SUCCESS;
387
388#ifdef COVERAGE
389 fstream fout("coverage.txt",ios::out);
390 if(fout.is_open()) {
391 Coverage::printCoverage(fout);
392 fout.close();
393 }
394#endif
395
396 return result;
397}
398
399#endif //TESTSUITE
400
Note: See TracBrowser for help on using the repository browser.