Commit:    2a000e34b920604b6633d5a96950d30fdd9285d0
Author:    zoe slattery <z...@php.net>         Wed, 3 Oct 2012 21:32:07 +0100
Parents:   ca7438d6799e51f60e8c56ec93c5a39562f11f71
Branches:  master

Link:       
http://git.php.net/?p=phpruntests.git;a=commitdiff;h=2a000e34b920604b6633d5a96950d30fdd9285d0

Log:
Redirect tests implementaion

Changed paths:
  A  phpt-tests/redirected/tests/sample_test.phpt
  M  phpt-tests/sample_redirect.phpt
  A  phpt-tests/sample_skipif_ini.phpt
  M  src/rtUtil.php
  M  src/taskScheduler/rtTaskScheduler.php
  M  src/taskScheduler/rtTaskTestGroup.php
  M  src/testcase/rtPhpTest.php
  M  src/testcase/rtTestConfiguration.php
  M  src/testcase/rtTestOutputWriter.php
  M  src/testcase/rtTestResults.php
  M  src/testcase/sections/executablesections/rtSkipIfSection.php
  M  src/testcase/sections/informationsections/rtTestHeaderSection.php
  M  src/testgroup/rtGroupConfiguration.php
  M  src/testgroup/rtPhpTestGroup.php
  M  src/testrun/rtPhpTestRun.php
  A  tests/rtGroupConfigurationTest.php
  M  tests/rtPhpTestGroupTest.php

diff --git a/phpt-tests/redirected/tests/sample_test.phpt 
b/phpt-tests/redirected/tests/sample_test.phpt
new file mode 100644
index 0000000..06501aa
--- /dev/null
+++ b/phpt-tests/redirected/tests/sample_test.phpt
@@ -0,0 +1,8 @@
+--TEST--
+Try a sample test
+--FILE--
+<?php
+       echo "Hello world\n";
+?>
+--EXPECT--
+Hello world
diff --git a/phpt-tests/sample_redirect.phpt b/phpt-tests/sample_redirect.phpt
index 778d42b..073620c 100644
--- a/phpt-tests/sample_redirect.phpt
+++ b/phpt-tests/sample_redirect.phpt
@@ -8,6 +8,6 @@ return array(
     'ENV' => array(
             'PDOTEST_DSN' => 'sqlite::memory:'
         ),
-    'TESTS' => 'ext/pdo/tests'
+    'TESTS' => 'phpt-tests/redirected/tests'
     );
 
diff --git a/phpt-tests/sample_skipif_ini.phpt 
b/phpt-tests/sample_skipif_ini.phpt
new file mode 100644
index 0000000..a42606e
--- /dev/null
+++ b/phpt-tests/sample_skipif_ini.phpt
@@ -0,0 +1,41 @@
+--TEST--
+Test to check that the warnings generated by running the INI section don't 
stop SKIPIF fprocessing
+--INI--
+session.upload_progress.freq=200%
+error_log=
+--SKIPIF--
+<?php
+if (!extension_loaded("session") && ini_get("enable_dl")) {
+  $dlext = (substr(PHP_OS, 0, 3) == "WIN") ? ".dll" : ".so";
+  @dl("session$dlext");
+}
+if (!extension_loaded("session")) {
+    die("skip Session module not loaded");
+}
+$save_path = ini_get("session.save_path");
+if ($save_path) {
+    if (!file_exists($save_path)) {
+        die("skip Session save_path doesn't exist");
+    }
+
+    if ($save_path && !@is_writable($save_path)) {
+        if (($p = strpos($save_path, ';')) !== false) {
+            $save_path = substr($save_path, ++$p);
+        }
+        if (!@is_writable($save_path)) {
+            die("skip session.save_path $save_path is not writable\n");
+        }
+    }
+}
+if(substr(PHP_OS, 0, 3) != "WIN")
+        die("skip windows only test");
+?>
+--FILE--
+<?php
+var_dump(ini_get("session.upload_progress.freq"));
+?>
+--EXPECTF--
+Warning: PHP Startup: session.upload_progress.freq cannot be over 100% in %s
+string(2) "1%"
+PHP Warning:  PHP Startup: session.upload_progress.freq cannot be over 100% in 
%s
+
diff --git a/src/rtUtil.php b/src/rtUtil.php
index 66cc9c1..f7573d5 100644
--- a/src/rtUtil.php
+++ b/src/rtUtil.php
@@ -60,8 +60,8 @@ class rtUtil
        {
                $list = array();
                $found = false;
-
                foreach (scandir($path) as $file) { 
+               
        
                        if (substr($file, 0, 1) != '.' && $file != 'CVS') {
        
diff --git a/src/taskScheduler/rtTaskScheduler.php 
b/src/taskScheduler/rtTaskScheduler.php
index 56bc3a8..3a6377c 100644
--- a/src/taskScheduler/rtTaskScheduler.php
+++ b/src/taskScheduler/rtTaskScheduler.php
@@ -18,7 +18,7 @@ class rtTaskScheduler
        protected $taskList = array();   // the list of the tasks to be executed
        protected $resultList = array(); // list of results
        protected $processCount = 0;     // the number of processes
-       protected $reportStatus = 0;     // reprort-status
+       protected $reportStatus = 0;     // the level of repoerting as tests 
atr run (0, 1, 2)
        protected $redirectedTestCases = array(); 
 
        
diff --git a/src/taskScheduler/rtTaskTestGroup.php 
b/src/taskScheduler/rtTaskTestGroup.php
index f1c225e..8509caa 100644
--- a/src/taskScheduler/rtTaskTestGroup.php
+++ b/src/taskScheduler/rtTaskTestGroup.php
@@ -16,12 +16,14 @@ class rtTaskTestGroup extends rtTask implements 
rtTaskInterface
        protected $runConfiguration;
        protected $subDirectory;
        protected $redirectedTestCases = array();
+       protected $groupConfig;
 
        
-       public function __construct($runConfiguration, $subDirectory)
+       public function __construct($runConfiguration, $subDirectory, 
$groupConfig)
        {
                $this->runConfiguration = $runConfiguration;
                $this->subDirectory = $subDirectory;
+               $this->groupConfig = $groupConfig;
        }
        
        
@@ -31,7 +33,7 @@ class rtTaskTestGroup extends rtTask implements 
rtTaskInterface
         */
        public function run()
        {
-               $testGroup = new rtPhpTestGroup($this->runConfiguration, 
$this->subDirectory);
+               $testGroup = new rtPhpTestGroup($this->runConfiguration, 
$this->subDirectory, $this->groupConfig);
                $testGroup->run();
         $this->result = $testGroup->getResults();
                return true;
diff --git a/src/testcase/rtPhpTest.php b/src/testcase/rtPhpTest.php
index 4e572e0..9febda7 100644
--- a/src/testcase/rtPhpTest.php
+++ b/src/testcase/rtPhpTest.php
@@ -24,11 +24,13 @@ class rtPhpTest
     protected $fileSection;
     protected $expectSection;
     protected $sectionHeadings;
+    protected $redirectFromID = null;
 
-    public function __construct(array $contents, $testName, $sectionHeadings, 
$runConfiguration, $testStatus)
+    public function __construct(array $contents, $testName, $sectionHeadings, 
$runConfiguration, $testStatus, $redirectFromID=null)
     {
         $this->contents = $contents;
         $this->testName = $testName;
+        $this->redirectFromID = $redirectFromID;
         $this->sectionHeadings = $sectionHeadings;
         $this->testStatus = $testStatus;
         $this->parse();
@@ -79,11 +81,16 @@ class rtPhpTest
         //Identify the file and expect section types
         $this->fileSection = $this->setFileSection();
         $this->expectSection = $this->setExpectSection();
+        
+        //If the test is being run as a result of being redirected from 
somewhere else, update the TEST section with an identifier
+        if($this->redirectFromID != null) {
+               $this->sections['TEST']->addString(' Redirected ' . 
$this->redirectFromID . ' test');
+        }
     }
 
 
     /**
-     * Initialises the configuration for this test. Uses the configuration 
sections from teh test case
+     * Initialises the configuration for this test. Uses the configuration 
sections from the test case
      *
      * @param rtRunTEstsConfiuration $runConfiguration
      *
@@ -106,12 +113,12 @@ class rtPhpTest
             $this->testStatus = $this->sections['SKIPIF']->run($this, 
$runConfiguration);
             
$this->testStatus->setExecutedPhpCommand($this->sections['SKIPIF']->getPhpCommand());
         }
-        //TODO: D'oh - what is this meant to be?
-        if (!$this->testStatus->getValue('skip') && 
!$this->testStatus->getValue('skip')) {
+        
+        if (!$this->testStatus->getValue('skip')) {
             $this->testStatus = $this->fileSection->run($this, 
$runConfiguration);
             
$this->testStatus->setExecutedPhpCommand($this->fileSection->getPhpCommand());
             
-            //The test can be skipped by file sections if the CGI executable 
is not available
+            //The test status can also be set to 'skip' if the PHP CGI is 
missing, so we need to check it again here.
             if(!$this->testStatus->getValue('skip')) {
                 $this->output = $this->fileSection->getOutput();
                 $this->compareOutput();
diff --git a/src/testcase/rtTestConfiguration.php 
b/src/testcase/rtTestConfiguration.php
index b369d2b..0c540ec 100644
--- a/src/testcase/rtTestConfiguration.php
+++ b/src/testcase/rtTestConfiguration.php
@@ -92,8 +92,9 @@ class rtTestConfiguration
     protected function setPhpCommandLineArguments(rtRuntestsConfiguration 
$runConfiguration, $sections, $fileSection)
     {
         //Use different arguments for running SKIPIF and so on. The INI 
settings may be designed to 
-        //produce an error whaich will inetrfere with SKIPIF processing.
-       $this->phpNonFileSectionCommandLineArguments = 
$runConfiguration->getSetting('PhpCommandLineArguments');
+        //produce an error which will interfere with SKIPIF processing.
+        //TODO: But in some cases the INI section is required for SKIPIF so we 
need another way to deal with this.
+       //$this->phpNonFileSectionCommandLineArguments = 
$runConfiguration->getSetting('PhpCommandLineArguments');
        $this->phpCommandLineArguments = 
$runConfiguration->getSetting('PhpCommandLineArguments');
         if (array_key_exists('INI', $sections)) {
             $sections['INI']->substitutePWD($fileSection->getFileName());
@@ -101,6 +102,8 @@ class rtTestConfiguration
             $args = new rtIniAsCommandLineArgs();
             $this->phpCommandLineArguments = 
$args->settingsToArguments($additionalArguments, 
$this->phpCommandLineArguments);
         }
+        //For SKIPIF sections - supress the error reporting which interferes 
with skip and warn processing
+        $this->phpNonFileSectionCommandLineArguments = 
preg_replace('/error_reporting=32767/', 'error_reporting=0', 
$this->phpCommandLineArguments);
     }
 
     protected function setTestCommandLineArguments($sections)
diff --git a/src/testcase/rtTestOutputWriter.php 
b/src/testcase/rtTestOutputWriter.php
index b582fe6..8cb23ac 100644
--- a/src/testcase/rtTestOutputWriter.php
+++ b/src/testcase/rtTestOutputWriter.php
@@ -98,21 +98,27 @@ abstract class rtTestOutputWriter
      * @param  integer $processCount
      * @return string
      */
-    public function getOverview($groups=NULL, $processCount=NULL)
+    public function getOverview($parallelGroups = 0, $serialGroups= 0, 
$processCount= 1)
     {
        // if the overview was already created retun it
        if (!is_null($this->overview)) {
                return $this->overview;
        }
        
+       /*
+        * Most of the code uses processCount = 0 to indicate serial runs. 
Clearly there must always be one process, 
+        * so it is set to 1 here to make the output make sense.
+        */
+       if($processCount == 0) {
+               $processCount ++;
+       }
+       
        // collect data         
        $state = array();
        $count = 0;
        
-       foreach ($this->resultList as $testGroupResults) {
-               
-               foreach ($testGroupResults as $testResult) {
-               
+       foreach ($this->resultList as $groupResult) { 
+               foreach($groupResult as $testResult) {                  
                                $s = $testResult->getStatus()->__toString();
                                
                                if (!isset($state[$s])) {
@@ -121,40 +127,48 @@ abstract class rtTestOutputWriter
                                
                                $state[$s]++;
                                $count++;
-               }
+               }
        }
        
        // create the output-string
+       $secondColPosition = 30;
        $str = '';
        
        $str .= "\n\n----------------------------------------\n";
-       $str .= "Tests:\t\t$count\n";
+       $str .= "Tests:";
+       $blanks = 30 - strlen("Tests:") - strlen($count);       
+       $str = $this->writeBlanks($str, $blanks);
+       $str .= "$count\n";
        
-       if (is_numeric($groups)) {
+       if (is_numeric($parallelGroups)) {
            
-               $str .= "Groups:\t\t";
-               $blanks = strlen($count)-strlen($groups);
-               for ($b=0; $b<$blanks; $b++) {
-                       $str .= ' ';
-               }
-               $str .= $groups."\n";
+               $str .= "Parallel Groups:";
+               $blanks = 30 - strlen("Parallel Groups:") - 
strlen($parallelGroups);
+               $str = $this->writeBlanks($str, $blanks);
+               $str .= $parallelGroups."\n";
+       }
+       
+       if (is_numeric($serialGroups)) {
+           
+               $str .= "Serial Groups:";
+               $blanks = 30 - strlen("Serial Groups:") - strlen($serialGroups);
+               $str = $this->writeBlanks($str, $blanks);
+               $str .= $serialGroups."\n";
        }
        
        if (is_numeric($processCount)) {
                        
-               $str .= "Processes:\t";
-           $blanks = strlen($count)-strlen($processCount);
-               for ($b=0; $b<$blanks; $b++) {
-                       $str .= ' ';
-               }
+               $str .= "Processes:";
+           $blanks = 30 -strlen("Processes:") - strlen($processCount);
+               $str = $this->writeBlanks($str, $blanks);
                $str .= $processCount."\n";
        }
        
                $str .= "----------------------------------------\n";
-
+               
        foreach ($state as $k => $v) {
 
-               $str .= strtoupper($k).":\t";
+               $str .= substr(strtoupper($k), 0, 5).":\t";
                
                $blanks = strlen($count)-strlen($v);
                for ($b=0; $b<$blanks; $b++) {
@@ -289,6 +303,12 @@ abstract class rtTestOutputWriter
                flush();
     }
     
+    public function writeBlanks($str, $n) {
+    for ($b=0; $b<$n; $b++) {
+                       $str .= ' ';
+               }
+    return $str;
+    }
     
 }
 ?>
\ No newline at end of file
diff --git a/src/testcase/rtTestResults.php b/src/testcase/rtTestResults.php
index 93da986..b8f0e8e 100644
--- a/src/testcase/rtTestResults.php
+++ b/src/testcase/rtTestResults.php
@@ -34,7 +34,7 @@ class rtTestResults
     public function init(rtPhpTest $testCase = null, rtTestStatus $testStatus 
= null)
     {
         if ($testCase != null) {
-            $this->title = 
implode('',$testCase->getSection('TEST')->getContents());
+            $this->title = $testCase->getSection('TEST')->getHeader();
             $this->testStatus = $testCase->getStatus();
             $this->testName = $testCase->getName();
             if($testStatus == 'redirected') {
@@ -109,7 +109,7 @@ class rtTestResults
             if (!$runConfiguration->hasCommandLineOption('keep-all') && 
!$runConfiguration->hasCommandLineOption('keep-clean')) {
                 $testCase->getSection('CLEAN')->deleteFile();
             } else {
-                $this->savedFileNames['clean'] = $this->testName. ".clean";
+                $this->savedFileNames['clean'] = $this->testName. ".clean.php";
             }
         }
 
@@ -148,11 +148,11 @@ class rtTestResults
 
         //Note: if there are clean and skipif files they will not be deleted 
if the test fails
         if ($testCase->hasSection('CLEAN')) {
-            $this->savedFileNames['clean'] = $this->testName. 'clean.php';
+            $this->savedFileNames['clean'] = $this->testName. '.clean.php';
         }
 
         if ($testCase->hasSection('SKIPIF')) {
-            $this->savedFileNames['skipif'] = $this->testName. 'skipif.php';
+            $this->savedFileNames['skipif'] = $this->testName. '.skipif.php';
         }
         
         if($testCase->getStatus()->getValue('leak') == true) {
@@ -163,19 +163,10 @@ class rtTestResults
     protected function onSkip(rtPhpTest $testCase, rtRuntestsConfiguration 
$runConfiguration)
     {
         if ($runConfiguration->hasCommandLineOption('keep-all') || 
$runConfiguration->hasCommandLineOption('keep-skip')) {
-            $this->savedFileNames['skipif'] = $this->testName. 'skipif.php';
+            $this->savedFileNames['skipif'] = $this->testName. '.skipif.php';
         } else if($testCase->hasSection('SKIPIF')) {
             $testCase->getSection('SKIPIF')->deleteFile();
         }
-        
-        //TODO I think this can go? Have since updated code to BORK on finding 
blank sections
-        //It may seem odd to check for an XFAIL if we are skipping the test, 
on the other hand I found
-        //a few windows tests with blank XFAIL sections and wanted to know 
about those.
-        
-        if ($testCase->hasSection('XFAIL')) {
-            $this->testStatus->setTrue('xfail');
-            
$this->testStatus->setMessage('xfail',$testCase->getSection('XFAIL')->getReason());
-        }
     }
 
     
diff --git a/src/testcase/sections/executablesections/rtSkipIfSection.php 
b/src/testcase/sections/executablesections/rtSkipIfSection.php
index 4b20834..f5c828d 100644
--- a/src/testcase/sections/executablesections/rtSkipIfSection.php
+++ b/src/testcase/sections/executablesections/rtSkipIfSection.php
@@ -40,7 +40,7 @@ class rtSkipIfSection extends rtExecutableSection
         $phpCommand .= ' -f '.$this->fileName;
         
         $this->phpCommand = $phpCommand;
-        
+                
         $PhpRunner = new rtPhpRunner($phpCommand,
             $runConfiguration->getEnvironmentVariables(), 
             $runConfiguration->getSetting('WorkingDirectory')
diff --git a/src/testcase/sections/informationsections/rtTestHeaderSection.php 
b/src/testcase/sections/informationsections/rtTestHeaderSection.php
index 241f219..1aa14f8 100644
--- a/src/testcase/sections/informationsections/rtTestHeaderSection.php
+++ b/src/testcase/sections/informationsections/rtTestHeaderSection.php
@@ -26,5 +26,9 @@ class rtTestHeaderSection extends rtInformationSection
     {
         return $this->testHeader;
     }
+    
+    public function addString($string) {
+       $this->testHeader .= $string;
+    }
 }
 ?>
diff --git a/src/testgroup/rtGroupConfiguration.php 
b/src/testgroup/rtGroupConfiguration.php
index 00548e4..4339ee2 100644
--- a/src/testgroup/rtGroupConfiguration.php
+++ b/src/testgroup/rtGroupConfiguration.php
@@ -17,15 +17,105 @@
 class rtGroupConfiguration
 {
        protected $testDirectory;
+       protected $environmentVariables = array();
+       protected $isRedirect=false;
+       protected $serialGroup=false;
+       protected $redirectFromID = null;
        
 
-    public function __construct(rtRuntestsConfiguration $runConfiguration, 
$directory)
-    {
+    public function __construct($directory)
+    {          
         $this->testDirectory = $directory;
     }
     
     public function parseRedirect(rtPHPTest $redirectedTest) {
-       var_dump($redirectedTest->getSection('REDIRECTTEST'));          
+       //Going to assume that we have already parsed the SKIPIF (if it exists)
+       //var_dump($redirectedTest->getSection('REDIRECTTEST')->getContents()); 
        
+       $name = $redirectedTest->getName();
+       
+       $code = 
implode($redirectedTest->getSection('REDIRECTTEST')->getContents(), "\n");
+       
+       //Strip tabs which interfere with eval
+       $code = preg_replace('|\\t|', ' ', $code);
+       
+       $setup = eval($code);
+               
+        $this->environmentVariables = $setup['ENV'];
+        
+        
+        //Remove trailing white space and add a slash to teh directory name
+        //Will need modification if we wanted to be able to give it a list of 
test directories.
+        
+        $dir = trim($setup['TESTS']);
+        if (substr($dir, -1) !== "/") {$dir .= "/";}
+        
+        /*
+         * Some of the PDO tests have __DIR__ in front of them, means you have 
to run then from the same place 
+         * as run-tests.php. This is really annoying because in this case it 
just picks up the location of this class
+         * which is useless for anything.
+         */
+
+        
+        $stripchars = strlen(__DIR__) + 1;
+
+        if ( substr($dir, 0, strlen(__DIR__)) === __DIR__) {
+               $dir = substr($dir, $stripchars);
+        }
+        
+        /*
+         * However... we do need some way of finding the absolute path of the 
tests. I think it is reasonable to assume 
+         * that they are related to the the path of the test that is 
redirecting to them.
+         * Take the first three characters of the directory and try to find 
them in the name of the redirected test.
+         * The best way to do this is really for the test case to specify a 
path relative to the test tgey are redirected from
+         * but this would mean changes to run-tests.php and to the tests. 
+         */
+        
+        $key = substr($dir, 0, 3);
+         
+        //Find the key in the full name of the test contains the redirect      
    
+        $position = strpos($name, $key); 
+        
+        //Take the root strng from before the key
+        $root=substr($name, 0, $position);
+        
+        $title = $redirectedTest->getSection('TEST')->getContents();
+        $this->redirectFromID = $title[0];
+        
+        //And add it on to form a full directory path.
+        $dir = $root . $dir;
+        
+        $this->testDirectory = $dir;
+        
+        $this->isRedirect = true;
+        
+        //Finaly add the directory name to the env variables - checked by 
SKIPIF
+        $this->environmentVariables['REDIR_TEST_DIR'] = $dir;
+        
+       
+    }
+    
+    public function parse() {
+       //Here insert code to read a config file from the test directory that 
determines whether the set of tests shoudl be run
+       //in parallel or not?
+       $this->serialGroup = false;
+       return;
+       
+    }
+    
+    public function getEnvironmentVariables() {
+       return $this->environmentVariables;
+    }
+       public function getTestDirectory() {
+       return $this->testDirectory;
+    }
+    public function isRedirect() {
+       return $this->isRedirect;
     }
+    public function isSerial() {
+       return $this->serialGroup;
+    } 
+    public function getRedirectFromID() {
+       return $this->redirectFromID;
+    }  
 }
 
diff --git a/src/testgroup/rtPhpTestGroup.php b/src/testgroup/rtPhpTestGroup.php
index b052284..b49c0b6 100644
--- a/src/testgroup/rtPhpTestGroup.php
+++ b/src/testgroup/rtPhpTestGroup.php
@@ -16,20 +16,32 @@ class rtPhpTestGroup extends rtTask implements 
rtTaskInterface
 {
     protected $testDirectory;
     protected $testCases;
-    protected $result = null;
+    protected $result = array();
     protected $runConfiguration;
+    protected $groupConfiguration;
 
-    public function __construct(rtRuntestsConfiguration $runConfiguration, 
$directory)
+    public function __construct(rtRuntestsConfiguration $runConfiguration, 
$directory, $groupConfiguration)
     {
        $this->runConfiguration = $runConfiguration;
         $this->testDirectory = $directory;
+        $this->groupConfiguration = $groupConfiguration;
         $this->init();
     }
 
     public function init()
-    {      
+    {     
+       if($this->groupConfiguration->isRedirect()) {
+               //merge in environmental variables (this is for REDEIRRECT).
+               foreach($this->groupConfiguration->getEnvironmentVariables() as 
$key=>$value) {
+                       $this->runConfiguration->setEnvironmentVariable($key, 
$value);
+               }
+       }
+       
+       
         $this->testFiles = rtUtil::getTestList($this->testDirectory);
-
+        
+        $redirectFromID = $this->groupConfiguration->getRedirectFromID();
+        
         foreach ($this->testFiles as $testFileName) {
        
             //testFiles is a list of file names relative to the current 
working directory
@@ -49,7 +61,7 @@ class rtPhpTestGroup extends rtTask implements rtTaskInterface
             $testStatus = new rtTestStatus($testFile->getTestName());
             if ($testFile->arePreconditionsMet() ) {
                 // Create a new test case               
-                $this->testCases[] = new rtPhpTest($testFile->getContents(), 
$testFile->getTestName(), $testFile->getSectionHeadings(), 
$this->runConfiguration, $testStatus);
+                $this->testCases[] = new rtPhpTest($testFile->getContents(), 
$testFile->getTestName(), $testFile->getSectionHeadings(), 
$this->runConfiguration, $testStatus, $redirectFromID);
             } elseif 
(in_array("REDIRECTTEST",$testFile->getSectionHeadings())){
                //Redirect handler, save the test case for processing after the 
main groups have finished.
                //Check to make sure that it shouldn't be skipped, if skipped 
don't save it
@@ -58,7 +70,7 @@ class rtPhpTestGroup extends rtTask implements rtTaskInterface
                        $redirectedTest->runSkipif($this->runConfiguration);
                        if($redirectedTest->getStatus()->getValue('skip')) {
                                $testStatus->setTrue('skip');
-                               $testStatus->setMessage('skip', 
$testFile->getExitMessage());
+                               $testStatus->setMessage('skip', 
$testFile->getExitMessage(). ' and the skip condition has failed');
                        } else {
                                $testStatus->setTrue('redirected');
                                $testStatus->setMessage('redirected', 
$testFile->getExitMessage());
diff --git a/src/testrun/rtPhpTestRun.php b/src/testrun/rtPhpTestRun.php
index cacac1b..8b4c358 100644
--- a/src/testrun/rtPhpTestRun.php
+++ b/src/testrun/rtPhpTestRun.php
@@ -18,6 +18,12 @@ class rtPhpTestRun
        protected $commandLineArguments;
        protected $runConfiguration;
        protected $redirectedTestCases = array();
+       protected $resultList = array(); //An array of arrays of Group Results
+       protected $serialTasks = array();
+       protected $parallelTasks = array();
+       protected $reportStatus = 0;
+       protected $numberOfSerialGroups = 0;
+       protected $numberOfParallelGroups = 0;
 
        public function __construct($argv)
        {
@@ -55,18 +61,24 @@ class rtPhpTestRun
                //test cases expect to be able to use it.
                $php = $this->runConfiguration->getSetting('PhpExecutable');
                
$this->runConfiguration->setEnvironmentVariable('TEST_PHP_EXECUTABLE', $php);
+               
+               //Set reporting option
+               $this->setReportStatus();
 
-        // Main decision point. Either we start this with a directory (or set 
of directories, in which case tests are 
-        // run as a group (and in parallel if required) or......
-        //
+        /*
+         * Main decision point. Either we start this with a directory (or set 
of directories, in which case tests are 
+         * run as a group (and in parallel if required) or......
+         */ 
                if ($this->runConfiguration->getSetting('TestDirectories') != 
null) {
-
-                       
$this->run_group($this->runConfiguration->getSetting('TestDirectories'));
-
+                       
+                       $this->doGroupRuns();
+                       
                } else {
-           //.. the input is a test file, or list of files and are just run as 
single tests
-           // and not in parallel
-
+                       
+           /* 
+            *... the input is a test file, or list of files and are just run 
as single tests
+            * and not in parallel
+            */
                        if ($this->runConfiguration->getSetting('TestFiles') == 
null) {
                                echo rtText::get('invalidTestFileName');
                                exit();
@@ -74,110 +86,109 @@ class rtPhpTestRun
                                
$this->run_tests($this->runConfiguration->getSetting('TestFiles'));
                        }
                }
-
+               
+               /*
+                * At this stage we have run all groups or tests in the initial 
input. Now we check if any of those have 
+                * redirected test cases and if so, run those one group at a 
time.
+                * It might be possible to run these in parallel too?
+                */
+               $this->buildRedirectsList($this->resultList);
            if(count($this->redirectedTestCases) > 0) {
-               foreach($this->redirectedTestCases as $testCase){
-                       echo $testCase->getName() . "\n";
-                       
-                       
-               }
-               
-            //For each test case - construct a new group
-            //Call run_group() again with an array of groups
-            //
-            // The redirect section has PHP code in it but no tags.
-            // It is code the needs to be run as part of run-tests, not as a 
'runnable' section -
-            // eek it's eval(). Is there any better way to do this? It's 
setting a 'group 
-            // configuration' which we don't have at the moment - so maybe we 
need one?
-            // re-implementing a differnt way would be nice. Just reading the 
config and not eval()ing it
-            //which seems unnecessary.
-            //
-            // for now, rtRedirectedSecion is part of 'config', not part of 
'executable';
+               $this->doRedirectedRuns();              
+           }
+           
+           if(($this->numberOfSerialGroups != 0) || 
($this->numberOfParallelGroups != 0))      {
+               $this->createRunOutput();
            }
-
        }
+       
+       public function doGroupRuns() {
+               
+               $subDirectories = 
$this->buildSubDirectoryList($this->runConfiguration->getSetting('TestDirectories'));
+               $groupConfigurations = 
$this->buildGroupConfigurations($subDirectories);
 
-       public function run_group($testDirectories) {
-               // make a list of subdirectories which contain tests, includes 
the top level directory
-                
-               $subDirectories = array();
-               foreach ($testDirectories as $testDirectory) {
-                       $subDirectories = array_merge($subDirectories, 
rtUtil::parseDir($testDirectory));
-               }
-                
-               // check for the cmd-line-option 'z' which defines 
parellel-execution
-               $processCount = 0;
-               if ($this->runConfiguration->hasCommandLineOption('z')) {
-                        
-                       $processCount = 
$this->runConfiguration->getCommandLineOption('z');
-                        
-                       if (!is_numeric($processCount) || $processCount < 0) {
-                               $processCount = 2;
-                       }
-               }
+                       //If there is only one subdirectory, run seqential
 
+                       if(count($subDirectories) === 1) {
+                               $this->run_serial_groups($subDirectories, 
$groupConfigurations);
+                               $this->numberOfSerialGroups = 1;
+                               
+                       } else {
+                               
+                               //check to see if this is set to be a parallel 
run, if not, run the subdirectory groups in sequence.
+                               if($this->requestedProcessorCount() <= 1) {
+                                       
$this->run_serial_groups($subDirectories, $groupConfigurations);
+                                       $this->numberOfSerialGroups = 
count($subDirectories);
+                               } else {
+                                       //At least part of this run can be in 
parallel, check group configurations to make sure that none are set to be 
serial.                                 
+                                       //This builds parallel and serial task 
lists.
+                                       foreach($groupConfigurations as 
$key=>$gc) {
+                                               if($gc->isSerial()) {
+                                                       $serialGroups[] = $key; 
                        
+                                               } else {
+                                                       $parallelGroups[] = 
$key;
+                                               }
+                                       }
+                                       
+                                       if(isset($serialGroups)) 
{$this->numberOfSerialGroups = count($serialGroups);}
+                                       
+                                       $this->numberOfParallelGroups = 
count($parallelGroups);
+                                       
+                                       
$this->run_parallel_groups($parallelGroups, $groupConfigurations, 
$this->requestedProcessorCount());
+                                       if($this->numberOfSerialGroups > 0)     
{                       
+                                               
$this->run_serial_groups($serialGroups, $groupConfigurations);  
+                                       }                               
+                               }                                               
+                       }                       
+               
+       }
+       
+       public function doRedirectedRuns() {
+                       foreach($this->redirectedTestCases as $testCase){
+                       
+                       $groupConfig = new rtGroupConfiguration(null);
+                       $groupConfig->parseRedirect($testCase);
+                       
+                       $group = $groupConfig->getTestDirectory();
+                       
+                       $this->run_serial_groups(array($group), 
array($group=>$groupConfig));
+                       
+                       $this->numberOfSerialGroups++;
+                                       
+               }
+       }
 
-               // check for the cmd-line-option 'v' which defines the 
report-status
-               $reportStatus = 0;
-               if ($this->runConfiguration->hasCommandLineOption('v')) {
-                       $reportStatus = 1;
-               } else if ($this->runConfiguration->hasCommandLineOption('vv')) 
{
-                       $reportStatus = 2;
-               } else if 
($this->runConfiguration->hasCommandLineOption('vvv')) {
-                       $reportStatus = 3;
-               }
+       public function run_parallel_groups($testDirectories, 
$groupConfigurations, $processCount) {            
                 
                // create the task-list
                $taskList = array();
-               
-               
-               foreach ($subDirectories as $subDirectory) {
-                       $taskList[] = new 
rtTaskTestGroup($this->runConfiguration, $subDirectory);
+               foreach($testDirectories as $testGroup) {
+                       $taskList[] = new 
rtTaskTestGroup($this->runConfiguration, $testGroup, 
$groupConfigurations[$testGroup]);       
                }
-               
 
                // run the task-scheduler
                $scheduler = rtTaskScheduler::getInstance();
                $scheduler->setTaskList($taskList);
                $scheduler->setProcessCount($processCount);
-               $scheduler->setReportStatus($reportStatus);
+               $scheduler->setReportStatus($this->reportStatus);
                $scheduler->run();
-                       
-               $resultList = $scheduler->getResultList();
-               
-               //locate any redirected tests in teh group results files.
-           foreach ($resultList as $testGroupResults) {
-               
-               foreach ($testGroupResults as $testResult) {
-                
-                       if($testResult->getStatus() == 'redirected') {
-                               $this->redirectedTestCases[] = 
$testResult->getRedirectedTestCase();
-                       }                               
-               }
-       }
-       
-                       
-               // create output
-               $type = null;
-               if ($this->runConfiguration->hasCommandLineOption('o')) {
-                       $type = 
$this->runConfiguration->getCommandLineOption('o');
-               }
-                       
-               $outputWriter = rtTestOutputWriter::getInstance($type);
-               $outputWriter->setResultList($resultList);
-               $outputWriter->printOverview(sizeof($taskList), 
$scheduler->getProcessCount());
 
-               $filename = null;
-               if ($this->runConfiguration->hasCommandLineOption('s')) {
-                       $filename = 
$this->runConfiguration->getCommandLineOption('s');
-               }
-                       
-               if ($type || $filename) {
-                       $outputWriter->write($filename);
-               }
-                
-                
+               foreach($scheduler->getResultList() as $groupResult) {
+                       $this->resultList[] = $groupResult;     
+               }                        
+       }
+       
+       public function run_serial_groups($testDirectories, 
$groupConfigurations) {
+               
+               foreach($testDirectories as $subDirectory) {    
+                       $testGroup = new 
rtPhpTestGroup($this->runConfiguration, $subDirectory, 
$groupConfigurations[$subDirectory]);
+                       $testGroup->run();
+                       
rtTestOutputWriter::flushResult($testGroup->getResults(), $this->reportStatus); 
                
+               $this->resultList[] = $testGroup->getResults();
+                                               
+               }               
        }
+       
        public function run_tests($testNames) {
 
                //This section deals with running single test cases, or lists 
of test cases.
@@ -188,7 +199,9 @@ class rtPhpTestRun
                                echo rtText::get('invalidTestFileName', 
array($testName));
                                exit();
                        }
-
+                       
+                       $allResults = array();
+                       
                        //Read the test file
                        $testFile = new rtPhpTestFile();
                        $testFile->doRead($testName);
@@ -211,7 +224,6 @@ class rtPhpTestRun
                                //Redirect handler
                                //Build a list of redirected test cases
                                 
-                               //TODO: need to run the skipif section here..
                                $this->redirectedTestCases[] = new 
rtPhpTest($testFile->getContents(), $testFile->getTestName(), 
$testFile->getSectionHeadings(), $this->runConfiguration, $testStatus);
                                 
                                $testStatus->setTrue('redirected');
@@ -222,10 +234,84 @@ class rtPhpTestRun
                                $testStatus->setMessage('bork', 
$testFile->getExitMessage());
                                $results = new rtTestResults(null, $testStatus);
                        }
-
                        rtTestOutputWriter::flushResult(array($results), 3);
+                       
+               }                                
+       }
+       
+       public function buildSubDirectoryList($testDirectories){
+       $subDirectories = array();
+               foreach ($testDirectories as $testDirectory) {
+                       $subDirectories = array_merge($subDirectories, 
rtUtil::parseDir($testDirectory));
+               }
+               return $subDirectories;
+       }
+       
+       public function requestedProcessorCount() {
+               // check for the cmd-line-option 'z' which defines 
parellel-execution
+               $processCount = 0;
+               if ($this->runConfiguration->hasCommandLineOption('z')) {
+                        
+                       $processCount = 
$this->runConfiguration->getCommandLineOption('z');
+                        
+                       if (!is_numeric($processCount) || $processCount < 0) {
+                               $processCount = 2;
+                       }
+               }
+               return $processCount;   
+       }
+       
+       public function buildGroupConfigurations($subDirectories) {
+               $groupConfigurations = array();
+               foreach($subDirectories as $subDir) {                   
+                       $groupConfig = new rtGroupConfiguration($subDir);
+                       $groupConfig->parse();
+                       $groupConfigurations[$subDir] = $groupConfig;
+               }
+               return $groupConfigurations;
+       }
+
+       public function buildRedirectsList($results) {          
+        foreach ($results as $groupResult) { 
+                foreach($groupResult as $testResult) {          
+                       if($testResult->getStatus() == 'redirected') {
+                               $this->redirectedTestCases[] = 
$testResult->getRedirectedTestCase();
+                       }
+                }                              
+       }
+       }
+       
+       public function createRunOutput() {
+               $type = null;
+               if ($this->runConfiguration->hasCommandLineOption('o')) {
+                       $type = 
$this->runConfiguration->getCommandLineOption('o');
+               }
+          
+               $outputWriter = rtTestOutputWriter::getInstance($type);
+               $outputWriter->setResultList($this->resultList);
+               
+               $outputWriter->printOverview($this->numberOfParallelGroups, 
$this->numberOfSerialGroups, $this->requestedProcessorCount());
+
+               $filename = null;
+               if ($this->runConfiguration->hasCommandLineOption('s')) {
+                       $filename = 
$this->runConfiguration->getCommandLineOption('s');
+               }
+               
+               if ($type || $filename) {
+                       $outputWriter->write($filename);
+               }
+       }
+       
+       public function setReportStatus() {
+       // check for the cmd-line-option 'v' which defines the report-status
+               if ($this->runConfiguration->hasCommandLineOption('v')) {
+                       $this->reportStatus = 1;
+               } else if ($this->runConfiguration->hasCommandLineOption('vv')) 
{
+                       $this->reportStatus = 2;
+               } else if 
($this->runConfiguration->hasCommandLineOption('vvv')) {
+                       $this->reportStatus = 3;
                }
-                                
        }
+       
 }
 ?>
diff --git a/tests/rtGroupConfigurationTest.php 
b/tests/rtGroupConfigurationTest.php
new file mode 100644
index 0000000..a08e5fb
--- /dev/null
+++ b/tests/rtGroupConfigurationTest.php
@@ -0,0 +1,14 @@
+<?php
+require_once dirname(__FILE__) . '/../src/rtAutoload.php';
+require_once dirname(__FILE__) . '/rtTestBootstrap.php';
+
+class rtGroupConfigurationTest extends PHPUnit_Framework_TestCase
+{
+       public function testCreateInstance()
+    {
+           //$directory = realpath(dirname(__FILE__) . '/../phpt-tests');
+       $config = rtRuntestsConfiguration::getInstance(array('run-tests.php', 
'-p', RT_PHP_PATH, 'testgroup'));
+       
+        $config->configure();          
+    }
+}
\ No newline at end of file
diff --git a/tests/rtPhpTestGroupTest.php b/tests/rtPhpTestGroupTest.php
index 5557b74..0a02131 100644
--- a/tests/rtPhpTestGroupTest.php
+++ b/tests/rtPhpTestGroupTest.php
@@ -13,9 +13,11 @@ class rtPHpTestGroupTest extends PHPUnit_Framework_TestCase
        $directory = realpath(dirname(__FILE__) . '/../phpt-tests');
        $config = rtRuntestsConfiguration::getInstance(array('run-tests.php', 
'-p', RT_PHP_PATH, $directory));
        
-        $config->configure();          
+        $config->configure(); 
+
+        $gConf = new rtGroupConfiguration('wibble');
        
-       $phpTestGroup = new rtPhpTestGroup($config, $directory);
+       $phpTestGroup = new rtPhpTestGroup($config, $directory, $gConf);
     
        
        $validTestCaseCount = count($phpTestGroup->getTestCases());
@@ -36,9 +38,10 @@ class rtPHpTestGroupTest extends PHPUnit_Framework_TestCase
        $directory = realpath(dirname(__FILE__) . '/../phpt-tests');
        $config = rtRuntestsConfiguration::getInstance(array('run-tests.php', 
'-p', RT_PHP_PATH, $directory));
        
-        $config->configure();          
+        $config->configure(); 
+        $gConf = new rtGroupConfiguration('wibble');           
        
-       $phpTestGroup = new rtPhpTestGroup($config, $directory);
+       $phpTestGroup = new rtPhpTestGroup($config, $directory, $gConf);
-- 
PHP Quality Assurance Mailing List <http://www.php.net/>
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to