OSDN Git Service

Modified method behavior Ethna_Plugin_Cachemanager::getNamespace
[ethna/ethna.git] / test / Ethna_MockProject.php
1 <?php
2 // vim: foldmethod=marker
3 /**
4  *  Ethna_MockProject.php
5  *
6  *  @author     Yoshinari Takaoka <takaoka@beatcraft.com>
7  *  @version    $Id$
8  */
9
10 define('ETHNA_TEST_DIR', ETHNA_BASE . '/test');
11 define('ETHNA_TEST_PROJECT', 'mockproject');
12 define('ETHNA_TEST_SKELDIR', ETHNA_TEST_DIR . '/skel/');
13 define('ETHNA_TEST_SKELTPLDIR', ETHNA_TEST_SKELDIR . '/template/');
14
15 /**
16  *  ethna command, and project Emulator Class. 
17  *  
18  *  @access public
19  */
20 class Ethna_MockProject
21 {
22     var $basedir;
23     var $skel_dir;
24     var $project_name;
25     var $proj_basedir;
26     var $is_created;
27
28     /*
29      *  コンストラクタ
30      * 
31      *  @param $basedir プロジェクトベースディレクトリ  
32      *  @param $project_name プロジェクト名
33      *  @param $skel_dir スケルトンディレクトリ
34      *  @access public
35      */
36     function Ethna_MockProject($basedir = ETHNA_TEST_DIR,
37                                $project_name = ETHNA_TEST_PROJECT,
38                                $skel_dir = ETHNA_TEST_SKELDIR)
39     {
40         $this->basedir = $basedir;
41         $this->skel_dir = $skel_dir;
42         $this->project_name = $project_name;
43         $this->proj_basedir = "${basedir}/${project_name}";
44         $this->is_created = false;
45     }
46
47     /*
48      *  プロジェクトを作成します。
49      *  ethna add-project コマンドをエミュレートします。
50      * 
51      *  @access public
52      *  @return 成功したらtrue, 失敗したらEthna_Error 
53      */
54     function create()
55     {
56         $this->is_created = true;
57
58         if (!is_dir($this->proj_basedir)) {
59             do {
60                 sleep(0.1);
61                 $r = Ethna_Util::mkdir($this->proj_basedir, 0775);
62             } while ($r == false || is_dir($this->proj_basedir) == false);
63         }
64
65         //  fire ethna add-project command
66         $id = 'add-project';
67         $options = array(
68                        '-b',
69                        $this->basedir . '/' . $this->project_name,
70                        '-s',
71                        $this->skel_dir, 
72                        $this->project_name,
73                    );
74         $r = $this->runCmd($id, $options); 
75         if (Ethna::isError($r)) {
76             return $r;
77         }
78
79         return true;
80     } 
81
82     /*
83      *  作成したプロジェクトに対してコマンドを
84      *  実行することで、ethna コマンドをエミュレートします。
85      *  (プロジェクトがない場合は作成されます)
86      * 
87      *  @access public
88      *  @param string $id  コマンドID (e.x add-action)
89      *  @param array  $options コマンドラインオプション
90      *                e.x ethna add-action -b /tmp test の場合
91      *                    array('-b', '/tmp', 'test') を指定
92      *  @return 成功したらtrue, 失敗したらEthna_Error 
93      */
94     function runCmd($id, $options = array())
95     {
96         if (($r = $this->create_ifnot_exists()) !== true) {
97             return $r;
98         }
99
100         //   supplement basedir option.
101         $in_basedir_opt = false;
102         foreach ($options as $opt) {
103             if ($opt == '-b' || $opt == '--basedir') {
104                 $in_basedir_opt = true;
105             }
106         }
107         if (!$in_basedir_opt) { 
108             $base_opt = array('-b', $this->proj_basedir);
109             $options = array_merge($base_opt, $options);
110         }
111
112         $eh =& new Ethna_Handle();
113         $handler =& $eh->getHandler($id);
114         if (Ethna::isError($handler)) {
115             return $r;
116         }
117
118         ob_start(); //  supress output.
119         $handler->setArgList($options);
120         $r = $handler->perform();
121         ob_end_clean();
122
123         if (Ethna::isError($r)) {
124             return $r;
125         }
126
127         //  set plain ActionForm
128         $ctl =& $this->getController();
129         $backend =& $ctl->getBackend();
130         $af =& new Ethna_ActionForm($ctl);
131         $backend->setActionForm($af);
132
133         return true;
134     }
135
136     /**
137      *  アプリケーションのエントリポイントをエミュレートします。
138      *
139      *  @access public
140      *  @param  mixed   $action_name    指定のアクション名(省略可)
141      *  @param  array   $submit_value   ブラウザからSubmitする値 
142      *  @return string  ブラウザへの出力
143      */
144     function runMain($action_name = 'index', $submit_value = array())
145     {
146         if (($r = $this->create_ifnot_exists()) !== true) {
147             return $r;
148         }
149
150         $_SERVER['REQUEST_METHOD'] = 'POST';
151         $_POST["action_${action_name}"] = true;
152         $_POST = array_merge($_POST, $submit_value);
153
154         $c =& $this->getController();
155         $c->setGateway(GATEWAY_WWW);
156         ob_start();
157         @$c->trigger($action_name, "");  // suppress header related error.
158         $c->end();
159         $result = ob_get_contents();
160         ob_end_clean();
161
162         return $result;
163     }
164
165     /*
166      *  作成したプロジェクトのコントローラクラス
167      *  のインスタンスを取得します。
168      *  (プロジェクトがない場合は作成されます)
169      * 
170      *  @access public
171      *  @return Ethna_Controller コントローラクラスのインスタンス
172      *          失敗したらEthna_Error 
173      */
174     function &getController()
175     {
176         if (($r = $this->create_ifnot_exists()) !== true) {
177             return $r;
178         }
179         $ctl =& Ethna_Handle::getAppController($this->proj_basedir);
180
181         //   キャッシュが返されるため、$GLOBALSが設定されない場合がある
182         $GLOBALS['_Ethna_controller'] =& $ctl;
183         return $ctl;
184     }
185
186     /*
187      *  作成したプロジェクトのベースディレクトリを取得します。
188      *
189      *  @access public 
190      *  @return string  プロジェクトのベースディレクトリ
191      */
192     function getBaseDir()
193     {
194         return $this->proj_basedir;
195     }
196
197     /*
198      *  プロジェクトを削除します。
199      *
200      *  @access public 
201      */
202     function delete()
203     {
204         Ethna_Util::purgeDir($this->proj_basedir);
205     }
206
207     /*
208      *  プロジェクトが既に作成されているかをチェックし,
209      *  存在しない場合は作成します。
210      *
211      *  @access private
212      *  @return boolean  既に作成している場合はtrue.
213      *                   プロジェクトの作成に失敗したらEthna_Error 
214      */
215     function create_ifnot_exists()
216     {
217         if ($this->is_created === false) {
218             $r = $this->create();
219             if (Ethna::isError($r)) {
220                 return $r;
221             }
222         }
223         return true;
224     }
225 }
226
227 ?>