<?php
/**
 * File containing the ezcWebdavFileBackendOptionsTestCase class.
 * 
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 * 
 *   http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 *
 * @package Webdav
 * @version //autogen//
 * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0
 * @subpackage Test
 */

require_once dirname( __FILE__ ) . '/property_test.php';

/**
 * Test case for the ezcWebdavFileBackendOptions class.
 * 
 * @package Webdav
 * @version //autogen//
 * @subpackage Test
 */
class ezcWebdavLockHeaderHandlerTest extends ezcTestCase
{
    public static function suite()
    {
		return new PHPUnit_Framework_TestSuite( __CLASS__ );
    }

    protected function setUp()
    {
        ezcWebdavServer::getInstance()->init(
            new ezcWebdavBasicPathFactory( 'http://example.com' ),
            new ezcWebdavXmlTool(),
            new ezcWebdavPropertyHandler(),
            new ezcWebdavHeaderHandler(),
            new ezcWebdavTransport()
        );
    }

    protected function tearDown()
    {
        ezcWebdavServer::getInstance()->reset();
    }
    
    /**
     * testParseNoTaggedList 
     * 
     * @param mixed $content 
     * @param mixed $result 
     * @return void
     *
     * @dataProvider provideIfHeaderData
     */
    public function testParseIfHeader( $content, $result )
    {
        $_SERVER['HTTP_IF'] = $content;
        
        $handler = new ezcWebdavLockHeaderHandler();
        
        $this->assertEquals(
            $result,
            $handler->parseIfHeader()
        );
    }

    /**
     * testParseTimeoutHeader 
     * 
     * @param mixed $content 
     * @param mixed $result 
     * @return void
     *
     * @dataProvider provideTimeoutHeaderData
     */
    public function testParseTimeoutHeader( $content, $result )
    {
        $_SERVER['HTTP_TIMEOUT'] = $content;
        
        $handler = new ezcWebdavLockHeaderHandler();
        
        $this->assertEquals(
            $result,
            $handler->parseTimeoutHeader()
        );
    }

    public function provideTimeoutHeaderData()
    {
        return array(
            // Set 1 - Ususally expected
            array(
                'Second-23',
                array( 23 )
            ),
            // Set 2 - Also expected
            array(
                'Infinite, Second-23',
                array( 23 )
            ),
            // Set 3 - May occur
            array(
                'Infinite, Second-123456789, Second-23',
                array( 123456789, 23 )
            ),
        );
    }

    public function provideIfHeaderData()
    {
        return array(
            // Not tagged
            array( 
                '(<locktoken:a-write-lock-token> [W/"A weak ETag"]) (["strong ETag"]) (["another strong ETag"])',
                new ezcWebdavLockIfHeaderNoTagList(
                    array(
                        new ezcWebdavLockIfHeaderListItem(
                            array( new ezcWebdavLockIfHeaderCondition( 'locktoken:a-write-lock-token' ) ),
                            array( new ezcWebdavLockIfHeaderCondition( 'A weak ETag' ) )
                        ),
                        new ezcWebdavLockIfHeaderListItem(
                            array(),
                            array( new ezcWebdavLockIfHeaderCondition( 'strong ETag' ) )
                        ),
                        new ezcWebdavLockIfHeaderListItem(
                            array(),
                            array( new ezcWebdavLockIfHeaderCondition( 'another strong ETag' ) )
                        ),
                    )
                ),
            ),
            // Not tagged, mutiple lock tokens, from RFC
            array(
                '(<opaquelocktoken:fe184f2e-6eec-41d0-c765-01adc56e6bb4>)  (<opaquelocktoken:e454f3f3-acdc-452a-56c7-00a5c91e4b77>)',
                new ezcWebdavLockIfHeaderNoTagList(
                    array(
                        new ezcWebdavLockIfHeaderListItem(
                            array( new ezcWebdavLockIfHeaderCondition( 'opaquelocktoken:fe184f2e-6eec-41d0-c765-01adc56e6bb4' ) ),
                            array()
                        ),
                        new ezcWebdavLockIfHeaderListItem(
                            array( new ezcWebdavLockIfHeaderCondition( 'opaquelocktoken:e454f3f3-acdc-452a-56c7-00a5c91e4b77' ) ),
                            array()
                        ),
                    )
                ),
            ),
            // Not tagged, negated some
            array( 
                '(Not <locktoken:a-write-lock-token> [W/"A weak ETag"]) (["strong ETag"]) (Not ["another strong ETag"])',
                new ezcWebdavLockIfHeaderNoTagList(
                    array(
                        new ezcWebdavLockIfHeaderListItem(
                            array( new ezcWebdavLockIfHeaderCondition( 'locktoken:a-write-lock-token', true ) ),
                            array( new ezcWebdavLockIfHeaderCondition( 'A weak ETag' ) )
                        ),
                        new ezcWebdavLockIfHeaderListItem(
                            array(),
                            array( new ezcWebdavLockIfHeaderCondition( 'strong ETag' ) )
                        ),
                        new ezcWebdavLockIfHeaderListItem(
                            array(),
                            array( new ezcWebdavLockIfHeaderCondition( 'another strong ETag', true ) )
                        ),
                    )
                ),
            ),
            // Not tagged, lock token and etag, from Litmus
            array( 
                '(<opaquelocktoken:43e241e1-df33-d3ee-bbfc-c613148efeb0> [fdf78d927cbf3fac5929db44c91d5783])',
                new ezcWebdavLockIfHeaderNoTagList(
                    array(
                        new ezcWebdavLockIfHeaderListItem(
                            array( new ezcWebdavLockIfHeaderCondition( 'opaquelocktoken:43e241e1-df33-d3ee-bbfc-c613148efeb0' ) ),
                            array( new ezcWebdavLockIfHeaderCondition( 'fdf78d927cbf3fac5929db44c91d5783' ) )
                        ),
                    )
                ),
            ),
            // Tagged
            array( 
                '<http://example.com/resource1> (<locktoken:a-write-lock-token> [W/"A weak ETag"]) (["strong ETag"]) <http://example.com/random> (["another strong ETag"])',
                new ezcWebdavLockIfHeaderTaggedList(
                    array(
                        '/resource1' => array(
                            new ezcWebdavLockIfHeaderListItem(
                                array( new ezcWebdavLockIfHeaderCondition( 'locktoken:a-write-lock-token' ) ),
                                array( new ezcWebdavLockIfHeaderCondition( 'A weak ETag' ) )
                            ),
                            new ezcWebdavLockIfHeaderListItem(
                                array(),
                                array( new ezcWebdavLockIfHeaderCondition( 'strong ETag' ) )
                            ),
                        ),
                        '/random' => array(
                            new ezcWebdavLockIfHeaderListItem(
                                array(),
                                array( new ezcWebdavLockIfHeaderCondition( 'another strong ETag' ) )
                            ),
                        ),
                    )
                ),
            ),
            // Tagged, negated some
            array( 
                '<http://example.com/resource1> (<locktoken:a-write-lock-token> [W/"A weak ETag"]) (Not ["strong ETag"]) <http://example.com/random> (Not ["another strong ETag"])',
                new ezcWebdavLockIfHeaderTaggedList(
                    array(
                        '/resource1' => array(
                            new ezcWebdavLockIfHeaderListItem(
                                array( new ezcWebdavLockIfHeaderCondition( 'locktoken:a-write-lock-token' ) ),
                                array( new ezcWebdavLockIfHeaderCondition( 'A weak ETag' ) )
                            ),
                            new ezcWebdavLockIfHeaderListItem(
                                array(),
                                array( new ezcWebdavLockIfHeaderCondition( 'strong ETag', true ) ),
                                true
                            ),
                        ),
                        '/random' => array(
                            new ezcWebdavLockIfHeaderListItem(
                                array(),
                                array( new ezcWebdavLockIfHeaderCondition( 'another strong ETag', true ) )
                            ),
                        ),
                    )
                ),
            ),
            array(
                '<http://webdav/collection/newdir/> (<opaquelocktoken:e0491761-ef66-9c09-94be-b43d185e2ad3>) <http://webdav/collection/subdir/> (<opaquelocktoken:2e5dba96-db89-da63-e87e-f9688848a315>)',
                new ezcWebdavLockIfHeaderTaggedList(
                    array(
                        '/collection/newdir' => array(
                            new ezcWebdavLockIfHeaderListItem(
                                array( new ezcWebdavLockIfHeaderCondition( 'opaquelocktoken:e0491761-ef66-9c09-94be-b43d185e2ad3' ) )
                            ),
                        ),
                        '/collection/subdir' => array(
                            new ezcWebdavLockIfHeaderListItem(
                                array( new ezcWebdavLockIfHeaderCondition( 'opaquelocktoken:2e5dba96-db89-da63-e87e-f9688848a315' ) )
                            ),
                        ),
                    )
                ),
            ),
        );
    }
}

?>
