2 /*********************************************************************************
3 * SugarCRM Community Edition is a customer relationship management program developed by
4 * SugarCRM, Inc. Copyright (C) 2004-2012 SugarCRM Inc.
6 * This program is free software; you can redistribute it and/or modify it under
7 * the terms of the GNU Affero General Public License version 3 as published by the
8 * Free Software Foundation with the addition of the following permission added
9 * to Section 15 as permitted in Section 7(a): FOR ANY PART OF THE COVERED WORK
10 * IN WHICH THE COPYRIGHT IS OWNED BY SUGARCRM, SUGARCRM DISCLAIMS THE WARRANTY
11 * OF NON INFRINGEMENT OF THIRD PARTY RIGHTS.
13 * This program is distributed in the hope that it will be useful, but WITHOUT
14 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
15 * FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
18 * You should have received a copy of the GNU Affero General Public License along with
19 * this program; if not, see http://www.gnu.org/licenses or write to the Free
20 * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
23 * You can contact SugarCRM, Inc. headquarters at 10050 North Wolfe Road,
24 * SW2-130, Cupertino, CA 95014, USA. or at email address contact@sugarcrm.com.
26 * The interactive user interfaces in modified source and object code versions
27 * of this program must display Appropriate Legal Notices, as required under
28 * Section 5 of the GNU Affero General Public License version 3.
30 * In accordance with Section 7(b) of the GNU Affero General Public License version 3,
31 * these Appropriate Legal Notices must retain the display of the "Powered by
32 * SugarCRM" logo. If the display of the logo is not reasonably feasible for
33 * technical reasons, the Appropriate Legal Notices must display the words
34 * "Powered by SugarCRM".
35 ********************************************************************************/
38 if(!defined('sugarEntry')) define('sugarEntry', true);
41 dirname(__FILE__) . PATH_SEPARATOR .
42 dirname(__FILE__) . '/..' . PATH_SEPARATOR .
46 // constant to indicate that we are running tests
47 if (!defined('SUGAR_PHPUNIT_RUNNER'))
48 define('SUGAR_PHPUNIT_RUNNER', true);
50 // initialize the various globals we use
51 global $sugar_config, $db, $fileName, $current_user, $locale, $current_language;
53 if ( !isset($_SERVER['HTTP_USER_AGENT']) )
54 // we are probably running tests from the command line
55 $_SERVER['HTTP_USER_AGENT'] = 'cli';
57 // move current working directory
58 chdir(dirname(__FILE__) . '/..');
60 require_once('include/entryPoint.php');
62 require_once('include/utils/layout_utils.php');
64 $GLOBALS['db'] = DBManagerFactory::getInstance();
66 $current_language = $sugar_config['default_language'];
67 // disable the SugarLogger
68 $sugar_config['logger']['level'] = 'fatal';
70 $GLOBALS['sugar_config']['default_permissions'] = array (
77 $GLOBALS['js_version_key'] = 'testrunner';
79 if ( !isset($_SERVER['SERVER_SOFTWARE']) )
80 $_SERVER["SERVER_SOFTWARE"] = 'PHPUnit';
82 // helps silence the license checking when running unit tests.
83 $_SESSION['VALIDATION_EXPIRES_IN'] = 'valid';
85 $GLOBALS['startTime'] = microtime(true);
87 // clean out the cache directory
88 require_once('modules/Administration/QuickRepairAndRebuild.php');
89 $repair = new RepairAndClear();
90 $repair->module_list = array();
91 $repair->show_output = false;
92 $repair->clearJsLangFiles();
93 $repair->clearJsFiles();
95 // mark that we got by the admin wizard already
96 $focus = new Administration();
97 $focus->retrieveSettings();
98 $focus->saveSetting('system','adminwizard',1);
100 // include the other test tools
101 require_once 'SugarTestObjectUtilities.php';
102 require_once 'SugarTestProjectUtilities.php';
103 require_once 'SugarTestProjectTaskUtilities.php';
104 require_once 'SugarTestUserUtilities.php';
105 require_once 'SugarTestLangPackCreator.php';
106 require_once 'SugarTestThemeUtilities.php';
107 require_once 'SugarTestContactUtilities.php';
108 require_once 'SugarTestEmailUtilities.php';
109 require_once 'SugarTestCampaignUtilities.php';
110 require_once 'SugarTestLeadUtilities.php';
111 require_once 'SugarTestStudioUtilities.php';
112 require_once 'SugarTestMeetingUtilities.php';
113 require_once 'SugarTestCallUtilities.php';
114 require_once 'SugarTestAccountUtilities.php';
115 require_once 'SugarTestTrackerUtility.php';
116 require_once 'SugarTestImportUtilities.php';
117 require_once 'SugarTestMergeUtilities.php';
118 require_once 'SugarTestTaskUtilities.php';
120 $GLOBALS['db']->commit();
122 // define our testcase subclass
123 class Sugar_PHPUnit_Framework_TestCase extends PHPUnit_Framework_TestCase
125 protected $backupGlobals = FALSE;
127 protected $useOutputBuffering = true;
129 protected function assertPreConditions()
131 if(isset($GLOBALS['log'])) {
132 $GLOBALS['log']->info("START TEST: {$this->getName(false)}");
134 SugarCache::instance()->flush();
137 protected function assertPostConditions() {
138 if(!empty($_REQUEST)) {
139 foreach(array_keys($_REQUEST) as $k) {
140 unset($_REQUEST[$k]);
145 foreach(array_keys($_POST) as $k) {
151 foreach(array_keys($_GET) as $k) {
155 if(isset($GLOBALS['log'])) {
156 $GLOBALS['log']->info("DONE TEST: {$this->getName(false)}");
158 // reset error handler in case somebody set it
159 restore_error_handler();
162 public static function tearDownAfterClass()
164 unset($GLOBALS['disable_date_format']);
165 unset($GLOBALS['saving_relationships']);
166 unset($GLOBALS['updating_relationships']);
167 $GLOBALS['timedate']->clearCache();
171 // define output testcase subclass
172 class Sugar_PHPUnit_Framework_OutputTestCase extends PHPUnit_Extensions_OutputTestCase
174 protected $backupGlobals = FALSE;
176 protected $_notRegex;
177 protected $_outputCheck;
179 protected function assertPreConditions()
181 if(isset($GLOBALS['log'])) {
182 $GLOBALS['log']->info("START TEST: {$this->getName(false)}");
184 SugarCache::instance()->flush();
187 protected function assertPostConditions() {
188 if(!empty($_REQUEST)) {
189 foreach(array_keys($_REQUEST) as $k) {
190 unset($_REQUEST[$k]);
195 foreach(array_keys($_POST) as $k) {
201 foreach(array_keys($_GET) as $k) {
205 if(isset($GLOBALS['log'])) {
206 $GLOBALS['log']->info("DONE TEST: {$this->getName(false)}");
210 protected function NotRegexCallback($output)
212 if(empty($this->_notRegex)) {
215 $this->assertNotRegExp($this->_notRegex, $output);
219 public function setOutputCheck($callback)
221 if (!is_callable($callback)) {
222 throw new PHPUnit_Framework_Exception;
225 $this->_outputCheck = $callback;
228 protected function runTest()
230 $testResult = parent::runTest();
231 if($this->_outputCheck) {
232 $this->assertTrue(call_user_func($this->_outputCheck, $this->output));
237 public function expectOutputNotRegex($expectedRegex)
239 if (is_string($expectedRegex) || is_null($expectedRegex)) {
240 $this->_notRegex = $expectedRegex;
243 $this->setOutputCheck(array($this, "NotRegexCallback"));
248 // define a mock logger interface; used for capturing logging messages emited
250 class SugarMockLogger
252 private $_messages = array();
254 public function __call($method, $message)
256 $this->messages[] = strtoupper($method) . ': ' . $message[0];
259 public function getLastMessage()
261 return end($this->messages);
264 public function getMessageCount()
266 return count($this->messages);