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

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

initial

File size: 9.9 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) 2000-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: manager.cpp,v 1.11 2003/12/15 07:32:13 takayuki Exp $
51 */
52
53// $Header: /home/CVS/configurator/base/manager.cpp,v 1.11 2003/12/15 07:32:13 takayuki Exp $
54
55#ifdef _MSC_VER
56# pragma warning(disable:4786)
57# define CDECL __cdecl
58#else
59# define CDECL
60#endif
61
62#include <stdlib.h>
63#include <fstream>
64#include <iostream>
65
66#include "base/event.h"
67#include "base/message.h"
68#include "base/component.h"
69#include "base/directorymap.h"
70
71using namespace std;
72
73Event<StartupEvent> startupEvent;
74Event<ShutdownEvent> shutdownEvent;
75
76int CDECL main(int argc, char ** argv)
77{
78 ShutdownEvent evt;
79 OptionParameter & option= getOptionParameter();
80
81 evt.exit_code = EXIT_FAILURE;
82
83 if(SingletonBase::isValid() && Component::isValid()) {
84
85 option.parseOption(argc, argv, "-h");
86
87 try {
88 startupEvent.raise();
89 Component::executeComponents(option);
90 evt.exit_code = EXIT_SUCCESS;
91 }
92 catch(Exception & e)
93 {
94 cerr << Message("Program failed in its process by following reason.\n","プログラムは致命的なエラーにより中断されました.\n");
95 cerr << " " << e.getDetails() << '\n';
96 }
97 catch(ExceptionMessage & e) {
98 CHECKPOINT("catch(ExceptionMessage)");
99 cerr << "Program failed : " << e << '\n';
100 }
101 catch(bad_alloc & e) {
102 CHECKPOINT("catch(bad_alloc)");
103 cerr << "Program failed : bad_alloc (" << e.what() << ")\n";
104 }
105 catch(...) {
106 CHECKPOINT("catch(...)");
107 cerr << "Program filed : Unknown Exception Occured\n";
108 }
109 }
110 else
111 cerr << "Program initialization failure\n";
112
113 try {
114 DebugMessage("shutdown event - exitcode(%)\n") << evt.exit_code;
115 shutdownEvent.raise(evt);
116 }
117 catch(Exception & e)
118 {
119 DebugMessage("exception was raised in the event - %\n") << e.getDetails();
120 cerr << Message("Program failed in its process by following reason.\n","プログラムは致命的なエラーにより中断されました.\n");
121 cerr << " " << e.getDetails() << '\n';
122 }
123
124 catch(...) {
125 DebugMessage("exception was raised in the event\n");
126 CHECKPOINT("catch(...) in shutdownEvent::raise");
127 evt.exit_code = EXIT_FAILURE;
128 }
129
130 DebugMessage("Exit code (%)\n") << evt.exit_code;
131
132 return evt.exit_code;
133}
134
135/************************************* テストスィート *************************************/
136
137#ifdef TESTSUITE
138#include "coverage_undefs.h"
139
140namespace {
141
142 extern void testsuite(TestSuiteControl & _suite_control);
143 TestSuite testsuite_onTop("Entrypoint(main)", testsuite);
144
145 class TestComponent : public Component
146 {
147 public:
148 int mode;
149
150 void parseOption(OptionParameter &)
151 {
152 switch(mode) {
153 case 0:
154 CHECKPOINT("TestComponent::case 0");
155 break;
156 case 1:
157 ExceptionMessage("exception").throwException();
158 case 2:
159 throw bad_alloc();
160 }
161 }
162 };
163
164 void dummyStartupHandler(StartupEvent &)
165 {
166 TestSuite::check("dummyStartupHandler");
167 }
168
169 int dummyShutdownHandler_exit_code;
170 void dummyShutdownHandler(ShutdownEvent & evt)
171 {
172 dummyShutdownHandler_exit_code = evt.exit_code;
173 TestSuite::check("dummyShutdownHandler");
174 }
175
176 //テストスィートの本体
177 void testsuite(TestSuiteControl & _suite_control)
178 {
179 SingletonBase::ContextChain chain;
180
181 chain.saveContext<Component::ComponentInfo>();
182 chain.saveContext<Event<StartupEvent>::handler_list_type>();
183 chain.saveContext<Event<ShutdownEvent>::handler_list_type>();
184
185 BEGIN_CASE("1","main関数単体 + コンポーネントなし") {
186 chain.renewInstance();
187
188 Event<StartupEvent>::add(dummyStartupHandler);
189 Event<ShutdownEvent>::add(dummyShutdownHandler);
190
191 BEGIN_CASE("1","普通に実行する") {
192 TestSuite::clearCheckpoints();
193
194 char * argv[] = { "test.exe" };
195
196 Exception::setThrowControl(true);
197 TestComponent test;
198 test.mode = 0;
199
200 TEST_CASE("1","main関数はEXIT_SUCCESSを返す", main(1, argv) == EXIT_SUCCESS);
201
202 TEST_CASE("2","例外が実行されない catch(Exception)", !TestSuite::isReached("catch(Exception)"));
203 TEST_CASE("3","例外が実行されない catch(bad_alloc)", !TestSuite::isReached("catch(bad_alloc)"));
204 TEST_CASE("4","例外が実行されない catch(...)", !TestSuite::isReached("catch(...)"));
205 TEST_CASE("5","Componentが実行されている", TestSuite::isReached("TestComponent::case 0"));
206 TEST_CASE("6","スタートアップハンドラが起動されている", TestSuite::isReached("dummyStartupHandler"));
207 TEST_CASE("7","シャットダウンハンドラが起動されている", TestSuite::isReached("dummyShutdownHandler"));
208 TEST_CASE("8","シャットダウンハンドラはEXIT_SUCCESSを受けている", dummyShutdownHandler_exit_code == EXIT_SUCCESS);
209 } END_CASE;
210
211 BEGIN_CASE("2","Exception例外を返す") {
212 TestSuite::clearCheckpoints();
213
214 char * argv[] = { "test.exe" };
215
216 Exception::setThrowControl(true);
217 TestComponent test;
218 test.mode = 1;
219
220 TEST_CASE("1","main関数はEXIT_FAILUREを返す", main(1, argv) == EXIT_FAILURE);
221
222 TEST_CASE("2","例外が実行される catch(Exception)", TestSuite::isReached("catch(Exception)"));
223 TEST_CASE("3","例外が実行されない catch(bad_alloc)", !TestSuite::isReached("catch(bad_alloc)"));
224 TEST_CASE("4","例外が実行されない catch(...)", !TestSuite::isReached("catch(...)"));
225 TEST_CASE("5","スタートアップハンドラが起動されている", TestSuite::isReached("dummyStartupHandler"));
226 TEST_CASE("6","シャットダウンハンドラが起動されている", TestSuite::isReached("dummyShutdownHandler"));
227 TEST_CASE("7","シャットダウンハンドラはEXIT_FAILUREを受けている", dummyShutdownHandler_exit_code == EXIT_FAILURE);
228 } END_CASE;
229
230 BEGIN_CASE("3","bad_alloc例外を返す") {
231 TestSuite::clearCheckpoints();
232
233 char * argv[] = { "test.exe" };
234
235 Exception::setThrowControl(true);
236 TestComponent test;
237 test.mode = 2;
238
239 TEST_CASE("1","main関数はEXIT_FAILUREを返す", main(1, argv) == EXIT_FAILURE);
240
241 TEST_CASE("2","対応するcatchのみが実行されている", !TestSuite::isReached("catch(Exception)") && TestSuite::isReached("catch(bad_alloc)") && !TestSuite::isReached("catch(...)"));
242 TEST_CASE("3","スタートアップハンドラが起動されている", TestSuite::isReached("dummyStartupHandler"));
243 TEST_CASE("4","シャットダウンハンドラが起動されている", TestSuite::isReached("dummyShutdownHandler"));
244 TEST_CASE("5","シャットダウンハンドラはEXIT_FAILUREを受けている", dummyShutdownHandler_exit_code == EXIT_FAILURE);
245 } END_CASE;
246 } END_CASE;
247
248 chain.restoreContext();
249 }
250
251}
252
253#endif
254
255
Note: See TracBrowser for help on using the repository browser.