173 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
		
		
			
		
	
	
			173 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
|   | <?php | ||
|  | 
 | ||
|  | /** | ||
|  |  * Tests for the TrustRoot module | ||
|  |  */ | ||
|  | 
 | ||
|  | require_once "Auth/OpenID/TrustRoot.php"; | ||
|  | require_once "Tests/Auth/OpenID/TestUtil.php"; | ||
|  | 
 | ||
|  | class Tests_Auth_OpenID_TRParseCase extends PHPUnit_Framework_TestCase { | ||
|  |     function Tests_Auth_OpenID_TRParseCase($desc, $case, $expected) | ||
|  |     { | ||
|  |         $this->setName($desc); | ||
|  |         $this->case = $case; | ||
|  |         $this->expected = $expected; | ||
|  |     } | ||
|  | 
 | ||
|  |     function runTest() | ||
|  |     { | ||
|  |         $is_sane = Auth_OpenID_TrustRoot::isSane($this->case); | ||
|  |         $parsed = (bool)Auth_OpenID_TrustRoot::_parse($this->case); | ||
|  |         switch ($this->expected) { | ||
|  |         case 'sane': | ||
|  |             $this->assertTrue($parsed, "Did not parse"); | ||
|  |             $this->assertTrue($is_sane, "Is not sane"); | ||
|  |             break; | ||
|  |         case 'insane': | ||
|  |             $this->assertTrue($parsed, "Did not parse"); | ||
|  |             $this->assertFalse($is_sane, "Is sane"); | ||
|  |             break; | ||
|  |         default: | ||
|  |             $this->assertFalse($parsed, "Did parse"); | ||
|  |             $this->assertFalse($is_sane, "Is sane"); | ||
|  |         } | ||
|  |     } | ||
|  | } | ||
|  | 
 | ||
|  | class Tests_Auth_OpenID_TRMatchCase extends PHPUnit_Framework_TestCase { | ||
|  |     function Tests_Auth_OpenID_TRMatchCase($desc, $tr, $rt, $matches) | ||
|  |     { | ||
|  |         $this->setName($desc); | ||
|  |         $this->tr = $tr; | ||
|  |         $this->rt = $rt; | ||
|  |         $this->matches = $matches; | ||
|  |     } | ||
|  | 
 | ||
|  |     function runTest() | ||
|  |     { | ||
|  |         $matches = Auth_OpenID_TrustRoot::match($this->tr, $this->rt); | ||
|  |         $this->assertEquals((bool)$this->matches, (bool)$matches); | ||
|  |     } | ||
|  | } | ||
|  | 
 | ||
|  | function Tests_Auth_OpenID_parseHeadings($data, $c) | ||
|  | { | ||
|  |     $heading_pat = '/(^|\n)' . $c . '{40}\n([^\n]+)\n' . $c . '{40}\n()/'; | ||
|  |     $offset = 0; | ||
|  |     $headings = array(); | ||
|  |     while (true) { | ||
|  |         preg_match($heading_pat, substr($data, $offset), $matches, | ||
|  |                    PREG_OFFSET_CAPTURE); | ||
|  |         if (!$matches) { | ||
|  |             break; | ||
|  |         } | ||
|  |         $start = $matches[0][1]; | ||
|  |         $heading = $matches[2][0]; | ||
|  |         $end = $matches[3][1]; | ||
|  |         $headings[] = array('heading' => $heading, | ||
|  |                             'start' => $offset + $start, | ||
|  |                             'end' => $offset + $end, | ||
|  |                             ); | ||
|  |         $offset += $end; | ||
|  |     } | ||
|  |     return $headings; | ||
|  | } | ||
|  | 
 | ||
|  | function Tests_Auth_OpenID_getSections($data) | ||
|  | { | ||
|  |     $headings = Tests_Auth_OpenID_parseHeadings($data, '-'); | ||
|  |     $sections = array(); | ||
|  |     $n = count($headings); | ||
|  |     for ($i = 0; $i < $n; ) { | ||
|  |         $secdata = $headings[$i]; | ||
|  |         list($numtests, $desc) = explode(': ', $secdata['heading']); | ||
|  |         $start = $secdata['end']; | ||
|  |         $i += 1; | ||
|  |         if ($i < $n) { | ||
|  |             $blob = substr($data, $start, $headings[$i]['start'] - $start); | ||
|  |         } else { | ||
|  |             $blob = substr($data, $start); | ||
|  |         } | ||
|  |         $lines = explode("\n", trim($blob)); | ||
|  |         if (count($lines) != $numtests) { | ||
|  |             trigger_error('Parse failure: ' . var_export($secdata, true), | ||
|  |                           E_USER_ERROR); | ||
|  |         } | ||
|  |         $sections[] = array('desc' => $desc, 'lines' => $lines,); | ||
|  |     } | ||
|  |     return $sections; | ||
|  | } | ||
|  | 
 | ||
|  | function Tests_Auth_OpenID_trParseTests($head, $tests) | ||
|  | { | ||
|  |     $tests = array('fail' => $tests[0], | ||
|  |                    'insane' => $tests[1], | ||
|  |                    'sane' => $tests[2]); | ||
|  |     $testobjs = array(); | ||
|  |     foreach ($tests as $expected => $testdata) { | ||
|  |         $lines = $testdata['lines']; | ||
|  |         foreach ($lines as $line) { | ||
|  |             $desc = sprintf("%s - %s: %s", $head, | ||
|  |                             $testdata['desc'], var_export($line, true)); | ||
|  |             $testobjs[] = new Tests_Auth_OpenID_TRParseCase( | ||
|  |                 $desc, $line, $expected); | ||
|  |         } | ||
|  |     } | ||
|  |     return $testobjs; | ||
|  | } | ||
|  | 
 | ||
|  | function Tests_Auth_OpenID_trMatchTests($head, $tests) | ||
|  | { | ||
|  |     $tests = array(true => $tests[0], false => $tests[1]); | ||
|  |     $testobjs = array(); | ||
|  |     foreach ($tests as $expected => $testdata) { | ||
|  |         $lines = $testdata['lines']; | ||
|  |         foreach ($lines as $line) { | ||
|  |             $pat = '/^([^ ]+) +([^ ]+)$/'; | ||
|  |             preg_match($pat, $line, $matches); | ||
|  |             list($_, $tr, $rt) = $matches; | ||
|  |             $desc = sprintf("%s - %s: %s %s", $head, $testdata['desc'], | ||
|  |                             var_export($tr, true), var_export($rt, true)); | ||
|  |             $testobjs[] = new Tests_Auth_OpenID_TRMatchCase( | ||
|  |                 $desc, $tr, $rt, $expected); | ||
|  |         } | ||
|  |     } | ||
|  |     return $testobjs; | ||
|  | } | ||
|  | 
 | ||
|  | function Tests_Auth_OpenID_trustRootTests() | ||
|  | { | ||
|  |     $data = Tests_Auth_OpenID_readdata('trustroot.txt'); | ||
|  |     list($parsehead, $matchhead) = Tests_Auth_OpenID_parseHeadings($data, '='); | ||
|  |     $pe = $parsehead['end']; | ||
|  |     $parsedata = substr($data, $pe, $matchhead['start'] - $pe); | ||
|  |     $parsetests = Tests_Auth_OpenID_getSections($parsedata); | ||
|  |     $parsecases = Tests_Auth_OpenID_trParseTests($parsehead['heading'], | ||
|  |                                                  $parsetests); | ||
|  | 
 | ||
|  |     $matchdata = substr($data, $matchhead['end']); | ||
|  |     $matchtests = Tests_Auth_OpenID_getSections($matchdata); | ||
|  |     $matchcases = Tests_Auth_OpenID_trMatchTests($matchhead['heading'], | ||
|  |                                                  $matchtests); | ||
|  | 
 | ||
|  |     return array_merge($parsecases, $matchcases); | ||
|  | } | ||
|  | 
 | ||
|  | class Tests_Auth_OpenID_TrustRoot extends PHPUnit_Framework_TestSuite { | ||
|  |     function Tests_Auth_OpenID_TrustRoot($name) | ||
|  |     { | ||
|  |         $this->setName($name); | ||
|  | 
 | ||
|  |         foreach (Tests_Auth_OpenID_trustRootTests() as $test) { | ||
|  |             $this->_addTestByValue($test); | ||
|  |         } | ||
|  |     } | ||
|  | 
 | ||
|  |     function _addTestByValue($test) { | ||
|  |         $this->addTest($test); | ||
|  |     } | ||
|  | } | ||
|  | 
 | ||
|  | 
 |