<?php 
namespace Nemiro\Nginx\Test 
{ 
   
  /* 
   * Copyright © Aleksey Nemiro, 2015. All rights reserved. 
   *  
   * Licensed 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. 
   */ 
 
  require_once '../Conf.php'; 
 
  use Nemiro\Nginx\Conf as NginxConf; 
 
  class ConfTest 
  { 
     
    function __construct() 
    { 
      $this->LoadTest(); 
      $this->SaveTest(); 
      $this->CreateTest(); 
    } 
 
    private function LoadTest() 
    { 
      echo '<h1>LoadTest</h1>'; 
 
      $conf = new NginxConf('test.conf'); 
      $i = 1; 
 
      echo sprintf('Test #%d: Get directive by name ? ', $i); 
      if ($conf['server'] != NULL) 
      { 
        $this->Success(); 
      } 
      else 
      { 
        $this->Fail(); 
      } 
      echo '<br />'; 
 
      $i++; 
      echo sprintf('Test #%d: Get directive from Directives ? ', $i); 
      if ($conf['server']->Directives['root']->ParametersAsString() == '/home/example.org/html') 
      { 
        $this->Success(); 
      } 
      else 
      { 
        $this->Fail(); 
        var_dump($conf['server']->Directives['root']->Parameters[0]); 
      } 
      echo '<br />'; 
 
      $i++; 
      echo sprintf('Test #%d: ParametersAsString ? ', $i); 
      if ($conf['server']['server_name']->ParametersAsString() == 'example.org') 
      { 
        $this->Success(); 
      } 
      else 
      { 
        $this->Fail(); 
        var_dump($conf['server']['server_name']->ParametersAsString()); 
      } 
      echo '<br />'; 
 
      $i++; 
      echo sprintf('Test #%d: Get parameter by index ? ', $i); 
      if ($conf['server']->Directives['root']->Parameters[0] == '/home/example.org/html') 
      { 
        $this->Success(); 
      } 
      else 
      { 
        $this->Fail(); 
        var_dump($conf['server']->Directives['root']->Parameters[0]); 
      } 
      echo '<br />'; 
 
      $i++; 
      echo sprintf('Test #%d: Parameters with spaces by index ? ', $i); 
      if ($conf['server']['auth_basic']->Parameters[0] == 'Test server') 
      { 
        $this->Success(); 
      } 
      else 
      { 
        $this->Fail(); 
        var_dump($conf['server']['auth_basic']->Parameters); 
      } 
      echo '<br />'; 
 
      $i++; 
      echo sprintf('Test #%d: Parameters with spaces via ParametersAsString ? ', $i); 
      if ($conf['server']['auth_basic']->ParametersAsString() == '"Test server"') 
      { 
        $this->Success(); 
      } 
      else 
      { 
        $this->Fail(); 
        var_dump($conf['server']['auth_basic']->Parameters); 
      } 
      echo '<br />'; 
 
      $i++; 
      echo sprintf('Test #%d: Groups ? ', $i); 
      if ($conf['server']['location']->IsGroup()) 
      { 
        $this->Success(); 
      } 
      else 
      { 
        $this->Fail(); 
        var_dump($conf['server']['location']->IsGroup()); 
      } 
      echo '<br />'; 
 
      $i++; 
      echo sprintf('Test #%d: Get group item #1 ? ', $i); 
      if ($conf['server']['location'][0]['proxy_pass']->ParametersAsString() == 'http://127.0.0.1:8080') 
      { 
        $this->Success(); 
      } 
      else 
      { 
        $this->Fail(); 
        var_dump($conf['server']['location'][0]); 
      } 
      echo '<br />'; 
 
      $i++; 
      echo sprintf('Test #%d: Get group item #2 (explicit) ? ', $i); 
      if ($conf['server']->Directives['location']->Directives[1]->Directives['expires']->Parameters[0] == 'max') 
      { 
        $this->Success(); 
      } 
      else 
      { 
        $this->Fail(); 
        var_dump($conf['server']['location'][1]); 
      } 
      echo '<br />'; 
     
      $i++; 
      echo sprintf('Test #%d: FirstChild and ParametersAsString ? ', $i); 
      if ($conf['server']['location']->FirstChild()->ParametersAsString() == '/') 
      { 
        $this->Success(); 
      } 
      else 
      { 
        $this->Fail(); 
        var_dump($conf['server']['location']->FirstChild()); 
      } 
      echo '<br />'; 
       
      $i++; 
      echo sprintf('Test #%d: LastChild and Parameters by index ? ', $i); 
      if ($conf['server']->Directives['location']->LastChild()->Parameters[1] == '^(?<page>[\w\d]+)([\.]{1}).ashx$') 
      { 
        $this->Success(); 
      } 
      else 
      { 
        $this->Fail(); 
        var_dump($conf['server']['location']->LastChild()); 
      } 
      echo '<br />'; 
 
      $i++; 
      echo sprintf('Test #%d: Access to a non-existent directive ? ', $i); 
      if ($conf['server123'] == NULL) 
      { 
        $this->Success(); 
      } 
      else 
      { 
        $this->Fail(); 
      } 
      echo '<br />'; 
 
      $i++; 
      echo sprintf('Test #%d: Access to a non-existent directive from Directives ? ', $i); 
      if ($conf->Items['server123'] == NULL) 
      { 
        $this->Success(); 
      } 
      else 
      { 
        $this->Fail(); 
      } 
      echo '<br />'; 
    } 
 
    private function SaveTest() 
    { 
      echo '<h1>SaveTest</h1>'; 
 
      $conf = new NginxConf('test.conf'); 
 
      $conf['server']['server_name']->Parameters = array('kbyte.ru', 'www.kbyte.ru', 'forum.kbyte.ru'); 
      $conf['server']['root']->Parameters = array('/home/kbyte.ru/www'); 
 
      $new_location = NginxConf::CreateDirective('location'); 
 
      $new_location->AddParameter(array('~*', '\.aspx$')); 
      $new_location->AddDirective('index', array('Default.aspx', 'default.aspx')); 
      $new_location->AddDirective('proxy_pass', array('http://127.0.0.1:8080')); 
 
      $proxy_set_header = NginxConf::CreateGroup('proxy_set_header'); 
      $proxy_set_header->AddDirective(array('X-Real-IP', '$remote_addr')); 
      $proxy_set_header->AddDirective(array('X-Forwarded-For', '$remote_addr')); 
      $proxy_set_header->AddDirective(array('Host', '$host')); 
      $proxy_set_header->AddTo($new_location); 
 
      $new_location->AddTo($conf['server']); 
 
      $conf->Save('test-save.conf'); 
 
      // read 
      $conf = new NginxConf('test-save.conf'); 
 
      $i = 1; 
      echo sprintf('Test #%d: Simple directives ? ', $i); 
      if  
      ( 
        $conf['server']['server_name'][0] == 'kbyte.ru' &&  
        $conf['server']['server_name'][1] == 'www.kbyte.ru' &&  
        $conf['server']['server_name']->ParametersAsString() == 'kbyte.ru www.kbyte.ru forum.kbyte.ru' && 
        $conf['server']->Directives['root']->ParametersAsString() == '/home/kbyte.ru/www' 
      ) 
      { 
        $this->Success(); 
      } 
      else 
      { 
        $this->Fail(); 
        var_dump($conf['server']['server_name']); 
        var_dump($conf['server']->Directives['root']); 
      } 
      echo '<br />'; 
 
      $i++; 
      echo sprintf('Test #%d: Block directives ? ', $i); 
      if ($conf['server']->Directives['location']->LastChild()->ChildCount() == 3) 
      { 
        $this->Success(); 
      } 
      else 
      { 
        $this->Fail(); 
        var_dump($conf['server']['location']->LastChild()); 
      } 
      echo '<br />'; 
 
      // output 
      echo '<pre>'.file_get_contents('test-save.conf').'</pre>'; 
 
      // remove 
      unlink('test-save.conf'); 
    } 
 
    private function CreateTest() 
    { 
      echo '<h1>CreateTest</h1>'; 
 
      $conf = new NginxConf(); 
      $conf->Add(NginxConf::CreateDirective('server')); 
      $conf['server']->AddDirective('server_name', array('example.org', 'www.example.org')); 
      $conf['server']->AddDirective('root', array('/home/example.org/www')); 
      $location = NginxConf::CreateDirective('location', '/'); 
      $location->AddDirective('index', array('index.php', 'index.html', 'index.htm')); 
      $location->AddTo($conf['server']); 
 
      // save 
      $conf->Save('test-create.conf'); 
 
      // read 
      $conf = new NginxConf('test-create.conf'); 
 
      $i = 1; 
      echo sprintf('Test #%d: server_name ? ', $i); 
      if ($conf['server']->Directives['server_name']->Parameters[0] == 'example.org') 
      { 
        $this->Success(); 
      } 
      else 
      { 
        $this->Fail(); 
        var_dump($conf['server']['server_name']); 
      } 
      echo '<br />'; 
 
      $i++; 
      echo sprintf('Test #%d: root ? ', $i); 
      if ($conf['server']->Directives['root']->Parameters[0] == '/home/example.org/www') 
      { 
        $this->Success(); 
      } 
      else 
      { 
        $this->Fail(); 
        var_dump($conf['server']['root']); 
      } 
      echo '<br />'; 
 
      $i++; 
      echo sprintf('Test #%d: location ? ', $i); 
      if ($conf['server']['location']['index'][0] == 'index.php') 
      { 
        $this->Success(); 
      } 
      else 
      { 
        $this->Fail(); 
        var_dump($conf['server']['location']); 
      } 
      echo '<br />'; 
 
      // output 
      echo '<pre>'.file_get_contents('test-create.conf').'</pre>'; 
 
      // remove 
      unlink('test-create.conf'); 
    } 
 
    private function Success() 
    { 
      echo '<span style="color:#008000;">[ Success ]</span>'; 
    } 
 
    private function Fail() 
    { 
      echo '<span style="color:red">[ Fail ]</span>'; 
    } 
 
  } 
 
 
  new ConfTest(); 
}
 
 |