Changeset - 92011aae7258
[Not reviewed]
22 2 25
Branko Majic (branko) - 6 years ago 2017-11-26 22:08:33
branko@majic.rs
MAR-128: Upgraded tests for php_website role:

- Switch to new Molecule configuration.
- Updated set-up playbook to use become: yes.
- Moved some preparatory steps outside of the main playbook (eases
idempotence tests).
- Updated tests to reference the yml inventory file.
- Updated tests to use new fixture (host instead of individual ones).
- Switched to extracting hostname instead of hard-coding it in a
couple of tests.
- Fixed some linting issues.
- Updated hostname to include Debian version.
28 files changed with 288 insertions and 172 deletions:
0 comments (0 inline, 0 general)
roles/php_website/handlers/main.yml
Show inline comments
 
---
 
\ No newline at end of file
 
---
roles/php_website/meta/main.yml
Show inline comments
 
@@ -4,4 +4,4 @@ allow_duplicates: yes
 

	
 
dependencies:
 
  - common
 
  - web_server
 
\ No newline at end of file
 
  - web_server
roles/php_website/molecule.yml
Show inline comments
 
deleted file
roles/php_website/molecule/default/create.yml
Show inline comments
 
new file 100644
 
---
 
- name: Create
 
  hosts: localhost
 
  connection: local
 
  gather_facts: False
 
  no_log: "{{ not lookup('env', 'MOLECULE_DEBUG') | bool }}"
 
  vars:
 
    molecule_file: "{{ lookup('env', 'MOLECULE_FILE') }}"
 
    molecule_instance_config: "{{ lookup('env', 'MOLECULE_INSTANCE_CONFIG') }}"
 
    molecule_yml: "{{ lookup('file', molecule_file) | molecule_from_yaml }}"
 
  tasks:
 
    - name: Create molecule instance(s)
 
      molecule_vagrant:
 
        instance_name: "{{ item.name }}"
 
        instance_interfaces: "{{ item.interfaces | default(omit) }}"
 
        instance_raw_config_args: "{{ item.instance_raw_config_args | default(omit) }}"
 

	
 
        platform_box: "{{ item.box }}"
 
        platform_box_version: "{{ item.box_version | default(omit) }}"
 
        platform_box_url: "{{ item.box_url | default(omit) }}"
 

	
 
        provider_name: "{{ molecule_yml.driver.provider.name }}"
 
        provider_memory: "{{ item.memory | default(omit) }}"
 
        provider_cpus: "{{ item.cpus | default(omit) }}"
 
        provider_raw_config_args: "{{ item.raw_config_args | default(omit) }}"
 

	
 
        state: up
 
      register: server
 
      with_items: "{{ molecule_yml.platforms }}"
 

	
 
    # Mandatory configuration for Molecule to function.
 

	
 
    - name: Populate instance config dict
 
      set_fact:
 
        instance_conf_dict: {
 
          'instance': "{{ item.Host }}",
 
          'address': "{{ item.HostName }}",
 
          'user': "{{ item.User }}",
 
          'port': "{{ item.Port }}",
 
          'identity_file': "{{ item.IdentityFile }}", }
 
      with_items: "{{ server.results }}"
 
      register: instance_config_dict
 
      when: server.changed | bool
 

	
 
    - name: Convert instance config dict to a list
 
      set_fact:
 
        instance_conf: "{{ instance_config_dict.results | map(attribute='ansible_facts.instance_conf_dict') | list }}"
 
      when: server.changed | bool
 

	
 
    - name: Dump instance config
 
      copy:
 
        # NOTE(retr0h): Workaround for Ansible 2.2.
 
        #               https://github.com/ansible/ansible/issues/20885
 
        content: "{{ instance_conf | to_json | from_json | molecule_to_yaml | molecule_header }}"
 
        dest: "{{ molecule_instance_config }}"
 
      when: server.changed | bool
roles/php_website/molecule/default/destroy.yml
Show inline comments
 
new file 100644
 
---
 

	
 
- name: Destroy
 
  hosts: localhost
 
  connection: local
 
  gather_facts: False
 
  no_log: "{{ not lookup('env', 'MOLECULE_DEBUG') | bool }}"
 
  vars:
 
    molecule_file: "{{ lookup('env', 'MOLECULE_FILE') }}"
 
    molecule_instance_config: "{{ lookup('env',' MOLECULE_INSTANCE_CONFIG') }}"
 
    molecule_yml: "{{ lookup('file', molecule_file) | molecule_from_yaml }}"
 
  tasks:
 
    - name: Destroy molecule instance(s)
 
      molecule_vagrant:
 
        instance_name: "{{ item.name }}"
 
        platform_box: "{{ item.box }}"
 
        provider_name: "{{ molecule_yml.driver.provider.name }}"
 
        force_stop: "{{ item.force_stop | default(True) }}"
 

	
 
        state: destroy
 
      register: server
 
      with_items: "{{ molecule_yml.platforms }}"
 

	
 
    # Mandatory configuration for Molecule to function.
 

	
 
    - name: Populate instance config
 
      set_fact:
 
        instance_conf: {}
 

	
 
    - name: Dump instance config
 
      copy:
 
        # NOTE(retr0h): Workaround for Ansible 2.2.
 
        #               https://github.com/ansible/ansible/issues/20885
 
        content: "{{ instance_conf | to_json | from_json | molecule_to_yaml | molecule_header }}"
 
        dest: "{{ molecule_instance_config }}"
 
      when: server.changed | bool
roles/php_website/molecule/default/molecule.yml
Show inline comments
 
new file 100644
 
---
 

	
 
dependency: {}
 

	
 
driver:
 
  name: vagrant
 
  provider:
 
    name: virtualbox
 

	
 
lint:
 
  name: yamllint
 

	
 
platforms:
 

	
 
  - name: php-website-jessie64
 
    groups:
 
      - parameters-mandatory
 
    box: debian/contrib-jessie64
 
    memory: 512
 
    cpus: 1
 

	
 
provisioner:
 
  name: ansible
 
  config_options:
 
    ssh_connection:
 
      pipelining: "True"
 
  lint:
 
    name: ansible-lint
 

	
 
scenario:
 
  name: default
 

	
 
verifier:
 
  name: testinfra
 
  lint:
 
    name: flake8
roles/php_website/molecule/default/playbook.yml
Show inline comments
 
file renamed from roles/php_website/playbook.yml to roles/php_website/molecule/default/playbook.yml
 
---
 

	
 
- hosts: all
 
  tasks:
 

	
 
    - name: Update all caches to avoid errors due to missing remote archives
 
      apt:
 
        update_cache: yes
 
      changed_when: False
 

	
 
    - name: Set-up /etc/hosts entries
 
      lineinfile:
 
        dest: /etc/hosts
 
        line: "{{ ansible_eth0.ipv4.address }} parameters-mandatory parameters-optional.local php-website"
 

	
 
    - name: Install curl for testing redirects and webpage content
 
      apt:
 
        name: curl
 
        state: installed
 

	
 
    - name: Install swaks for testing mail forwarding
 
      apt:
 
        name: swaks
 
        state: installed
 

	
 
    - name: Install Postfix for testing mail forwarding (Exim4 not covered)
 
      apt:
 
        name: postfix
 
        state: installed
 

	
 
    - name: Set-up group for an additional user
 
      group:
 
        name: user
 
        state: present
 

	
 
    - name: Set-up additional user for testing mail delivery
 
      user:
 
        name: user
 
        group: user
 
        shell: /bin/bash
 

	
 
- hosts: all
 
  become: yes
 
  vars:
 
    # common
 
    ca_certificates:
 
@@ -91,6 +53,7 @@
 
      website_mail_recipients: user
 

	
 
- hosts: all
 
  become: yes
 
  tasks:
 
    # parameters-mandatory application
 
    - name: Set-up directory where PHP files are hosted at
roles/php_website/molecule/default/prepare.yml
Show inline comments
 
new file 100644
 
---
 

	
 
- name: Prepare
 
  hosts: all
 
  gather_facts: False
 
  tasks:
 
    - name: Install python for Ansible
 
      raw: test -e /usr/bin/python || (apt -y update && apt install -y python-minimal)
 
      become: True
 
      changed_when: False
 

	
 
- hosts: all
 
  become: yes
 
  tasks:
 

	
 
    - name: Update all caches to avoid errors due to missing remote archives
 
      apt:
 
        update_cache: yes
 
      changed_when: False
 

	
 
    - name: Set-up /etc/hosts entries
 
      lineinfile:
 
        dest: /etc/hosts
 
        line: "{{ ansible_eth0.ipv4.address }} parameters-mandatory parameters-optional.local php-website"
 

	
 
    - name: Install curl for testing redirects and webpage content
 
      apt:
 
        name: curl
 
        state: installed
 

	
 
    - name: Install swaks for testing mail forwarding
 
      apt:
 
        name: swaks
 
        state: installed
 

	
 
    - name: Install Postfix for testing mail forwarding (Exim4 not covered)
 
      apt:
 
        name: postfix
 
        state: installed
 

	
 
    - name: Set-up group for an additional user
 
      group:
 
        name: user
 
        state: present
 

	
 
    - name: Set-up additional user for testing mail delivery
 
      user:
 
        name: user
 
        group: user
 
        shell: /bin/bash
roles/php_website/molecule/default/tests/data/php/mandatory/index.php
Show inline comments
 
file renamed from roles/php_website/tests/data/php/mandatory/index.php to roles/php_website/molecule/default/tests/data/php/mandatory/index.php
roles/php_website/molecule/default/tests/data/php/mandatory/index.php3
Show inline comments
 
file renamed from roles/php_website/tests/data/php/mandatory/index.php3 to roles/php_website/molecule/default/tests/data/php/mandatory/index.php3
roles/php_website/molecule/default/tests/data/php/optional/404.myphp
Show inline comments
 
file renamed from roles/php_website/tests/data/php/optional/404.myphp to roles/php_website/molecule/default/tests/data/php/optional/404.myphp
roles/php_website/molecule/default/tests/data/php/optional/info.myphp
Show inline comments
 
file renamed from roles/php_website/tests/data/php/optional/info.myphp to roles/php_website/molecule/default/tests/data/php/optional/info.myphp
roles/php_website/molecule/default/tests/data/php/optional/myindex.myphp
Show inline comments
 
file renamed from roles/php_website/tests/data/php/optional/myindex.myphp to roles/php_website/molecule/default/tests/data/php/optional/myindex.myphp
roles/php_website/molecule/default/tests/data/php/optional/myindex.php
Show inline comments
 
file renamed from roles/php_website/tests/data/php/optional/myindex.php to roles/php_website/molecule/default/tests/data/php/optional/myindex.php
roles/php_website/molecule/default/tests/data/php/optional/path.myphp
Show inline comments
 
file renamed from roles/php_website/tests/data/php/optional/path.myphp to roles/php_website/molecule/default/tests/data/php/optional/path.myphp
roles/php_website/molecule/default/tests/data/php/optional/rewrite.myphp
Show inline comments
 
file renamed from roles/php_website/tests/data/php/optional/rewrite.myphp to roles/php_website/molecule/default/tests/data/php/optional/rewrite.myphp
roles/php_website/molecule/default/tests/data/php/optional/secretfile.txt
Show inline comments
 
file renamed from roles/php_website/tests/data/php/optional/secretfile.txt to roles/php_website/molecule/default/tests/data/php/optional/secretfile.txt
roles/php_website/molecule/default/tests/data/x509/ca.cert.pem
Show inline comments
 
file renamed from roles/php_website/tests/data/x509/ca.cert.pem to roles/php_website/molecule/default/tests/data/x509/ca.cert.pem
roles/php_website/molecule/default/tests/data/x509/ca.key.pem
Show inline comments
 
file renamed from roles/php_website/tests/data/x509/ca.key.pem to roles/php_website/molecule/default/tests/data/x509/ca.key.pem
roles/php_website/molecule/default/tests/data/x509/parameters-mandatory_https.key
Show inline comments
 
file renamed from roles/php_website/tests/data/x509/parameters-mandatory_https.key to roles/php_website/molecule/default/tests/data/x509/parameters-mandatory_https.key
roles/php_website/molecule/default/tests/data/x509/parameters-mandatory_https.pem
Show inline comments
 
file renamed from roles/php_website/tests/data/x509/parameters-mandatory_https.pem to roles/php_website/molecule/default/tests/data/x509/parameters-mandatory_https.pem
roles/php_website/molecule/default/tests/data/x509/parameters-optional.local_https.cert.pem
Show inline comments
 
file renamed from roles/php_website/tests/data/x509/parameters-optional.local_https.cert.pem to roles/php_website/molecule/default/tests/data/x509/parameters-optional.local_https.cert.pem
roles/php_website/molecule/default/tests/data/x509/parameters-optional.local_https.key.pem
Show inline comments
 
file renamed from roles/php_website/tests/data/x509/parameters-optional.local_https.key.pem to roles/php_website/molecule/default/tests/data/x509/parameters-optional.local_https.key.pem
roles/php_website/molecule/default/tests/data/x509/php-website_https.cert.pem
Show inline comments
 
file renamed from roles/php_website/tests/data/x509/php-website_https.cert.pem to roles/php_website/molecule/default/tests/data/x509/php-website_https.cert.pem
roles/php_website/molecule/default/tests/data/x509/php-website_https.key.pem
Show inline comments
 
file renamed from roles/php_website/tests/data/x509/php-website_https.key.pem to roles/php_website/molecule/default/tests/data/x509/php-website_https.key.pem
roles/php_website/molecule/default/tests/test_default.py
Show inline comments
 
file renamed from roles/php_website/tests/test_default.py to roles/php_website/molecule/default/tests/test_default.py
 
@@ -2,4 +2,4 @@ import testinfra.utils.ansible_runner
 

	
 

	
 
testinfra_hosts = testinfra.utils.ansible_runner.AnsibleRunner(
 
    '.molecule/ansible_inventory').get_hosts('all')
 
    '.molecule/ansible_inventory.yml').get_hosts('all')
roles/php_website/molecule/default/tests/test_parameters_mandatory.py
Show inline comments
 
file renamed from roles/php_website/tests/test_parameters_mandatory.py to roles/php_website/molecule/default/tests/test_parameters_mandatory.py
 
@@ -6,26 +6,26 @@ import testinfra.utils.ansible_runner
 

	
 

	
 
testinfra_hosts = testinfra.utils.ansible_runner.AnsibleRunner(
 
    '.molecule/ansible_inventory').get_hosts('all')
 
    '.molecule/ansible_inventory.yml').get_hosts('all')
 

	
 

	
 
def test_website_group(Group):
 
def test_website_group(host):
 
    """
 
    Tests if website group has been created correctly.
 
    """
 

	
 
    group = Group('web-parameters-mandatory')
 
    group = host.group('web-parameters-mandatory')
 

	
 
    assert group.exists
 
    assert group.gid == 1003
 

	
 

	
 
def test_website_admin_user(User):
 
def test_website_admin_user(host):
 
    """
 
    Tests if website administrator user has been created correctly.
 
    """
 

	
 
    user = User('admin-parameters-mandatory')
 
    user = host.user('admin-parameters-mandatory')
 

	
 
    assert user.exists
 
    assert user.uid == 1003
 
@@ -35,12 +35,12 @@ def test_website_admin_user(User):
 
    assert user.home == '/var/www/parameters-mandatory'
 

	
 

	
 
def test_website_admin_home(File, Sudo):
 
def test_website_admin_home(host):
 
    """
 
    Tests if permissions on website admin home directory are correct.
 
    """
 

	
 
    home = File('/var/www/parameters-mandatory')
 
    home = host.file('/var/www/parameters-mandatory')
 

	
 
    assert home.is_directory
 
    assert home.user == 'admin-parameters-mandatory'
 
@@ -48,27 +48,27 @@ def test_website_admin_home(File, Sudo):
 
    assert home.mode == 0o750
 

	
 

	
 
def test_home_profile_directory(File, Sudo):
 
def test_home_profile_directory(host):
 
    """
 
    Tests if profile directory has been set-up correctly for the website
 
    administrator/application user.
 
    """
 

	
 
    with Sudo():
 
    with host.sudo():
 

	
 
        directory = File('/var/www/parameters-mandatory/.profile.d')
 
        directory = host.file('/var/www/parameters-mandatory/.profile.d')
 
        assert directory.is_directory
 
        assert directory.user == 'admin-parameters-mandatory'
 
        assert directory.group == 'web-parameters-mandatory'
 
        assert directory.mode == 0o750
 

	
 

	
 
def test_website_application_user(Command, Sudo, User):
 
def test_website_application_user(host):
 
    """
 
    Tests if website application user has been created correctly.
 
    """
 

	
 
    user = User('web-parameters-mandatory')
 
    user = host.user('web-parameters-mandatory')
 

	
 
    assert user.exists
 
    assert user.uid == 999
 
@@ -77,28 +77,28 @@ def test_website_application_user(Command, Sudo, User):
 
    assert user.shell == '/bin/sh'
 
    assert user.home == '/var/www/parameters-mandatory'
 

	
 
    with Sudo():
 
        umask = Command("su -l web-parameters-mandatory -c 'bash -c umask'")
 
    with host.sudo():
 
        umask = host.run("su -l web-parameters-mandatory -c 'bash -c umask'")
 
        assert umask.stdout == '0007'
 

	
 

	
 
def test_nginx_user(User):
 
def test_nginx_user(host):
 
    """
 
    Tests if web server user has been added to website group.
 
    """
 

	
 
    user = User('www-data')
 
    user = host.user('www-data')
 
    assert 'web-parameters-mandatory' in user.groups
 

	
 

	
 
def test_forward_file(File, Sudo):
 
def test_forward_file(host):
 
    """
 
    Tests if the forward file has correct permissions and content.
 
    """
 

	
 
    with Sudo():
 
    with host.sudo():
 

	
 
        config = File('/var/www/parameters-mandatory/.forward')
 
        config = host.file('/var/www/parameters-mandatory/.forward')
 
        assert config.is_file
 
        assert config.user == 'root'
 
        assert config.group == 'web-parameters-mandatory'
 
@@ -106,59 +106,61 @@ def test_forward_file(File, Sudo):
 
        assert config.content == "root"
 

	
 

	
 
def test_mail_forwarding(Command, File, Sudo):
 
def test_mail_forwarding(host):
 
    """
 
    Tests if mail forwarding works as expected.
 
    """
 

	
 
    send = Command('swaks --suppress-data --to web-parameters-mandatory@localhost')
 
    hostname = host.run('hostname').stdout
 

	
 
    send = host.run('swaks --suppress-data --to web-parameters-mandatory@localhost')
 
    assert send.rc == 0
 
    message_id = re.search('Ok: queued as (.*)', send.stdout).group(1)
 

	
 
    # Sleep for a couple of seconds so the mail can get delivered.
 
    time.sleep(5)
 

	
 
    with Sudo():
 
        mail_log = File('/var/log/mail.log')
 
    with host.sudo():
 
        mail_log = host.file('/var/log/mail.log')
 

	
 
        # First extract message ID of forwarded mail.
 
        pattern = "%s: to=<web-parameters-mandatory@localhost>.*status=sent \(forwarded as ([^)]*)\)" % message_id
 
        message_id = re.search(pattern, mail_log.content).group(1)
 

	
 
        # Now try to determine where the forward ended-up at.
 
        pattern = "%s: to=<vagrant@php-website>, orig_to=<web-parameters-mandatory@localhost>.*status=sent" % message_id
 
        pattern = "%s: to=<vagrant@%s>, orig_to=<web-parameters-mandatory@localhost>.*status=sent" % (message_id, hostname)
 
        assert re.search(pattern, mail_log.content) is not None
 

	
 

	
 
def test_php5_fpm_configuration_file(File, Sudo):
 
def test_php5_fpm_configuration_file(host):
 
    """
 
    Tests if PHP FPM configuration file has been correctly deployed.
 
    """
 

	
 
    with Sudo():
 
    with host.sudo():
 

	
 
        config = File('/etc/php5/fpm/pool.d/parameters-mandatory.conf')
 
        config = host.file('/etc/php5/fpm/pool.d/parameters-mandatory.conf')
 
        assert config.is_file
 
        assert config.user == 'root'
 
        assert config.group == 'root'
 
        assert config.mode == 0o640
 

	
 

	
 
def test_nginx_tls_files(File, Sudo):
 
def test_nginx_tls_files(host):
 
    """
 
    Tests if TLS private key and certificate have been deployed correctly.
 
    """
 

	
 
    with Sudo():
 
    with host.sudo():
 

	
 
        tls_file = File('/etc/ssl/private/parameters-mandatory_https.key')
 
        tls_file = host.file('/etc/ssl/private/parameters-mandatory_https.key')
 
        assert tls_file.is_file
 
        assert tls_file.user == 'root'
 
        assert tls_file.group == 'root'
 
        assert tls_file.mode == 0o640
 
        assert tls_file.content == open("tests/data/x509/parameters-mandatory_https.key", "r").read().rstrip()
 

	
 
        tls_file = File('/etc/ssl/certs/parameters-mandatory_https.pem')
 
        tls_file = host.file('/etc/ssl/certs/parameters-mandatory_https.pem')
 
        assert tls_file.is_file
 
        assert tls_file.user == 'root'
 
        assert tls_file.group == 'root'
 
@@ -166,13 +168,13 @@ def test_nginx_tls_files(File, Sudo):
 
        assert tls_file.content == open("tests/data/x509/parameters-mandatory_https.pem", "r").read().rstrip()
 

	
 

	
 
def test_certificate_validity_check_configuration(File):
 
def test_certificate_validity_check_configuration(host):
 
    """
 
    Tests if certificate validity check configuration file has been deployed
 
    correctly.
 
    """
 

	
 
    config = File('/etc/check_certificate/parameters-mandatory_https.conf')
 
    config = host.file('/etc/check_certificate/parameters-mandatory_https.conf')
 
    assert config.is_file
 
    assert config.user == 'root'
 
    assert config.group == 'root'
 
@@ -180,12 +182,12 @@ def test_certificate_validity_check_configuration(File):
 
    assert config.content == "/etc/ssl/certs/parameters-mandatory_https.pem"
 

	
 

	
 
def test_vhost_file(File):
 
def test_vhost_file(host):
 
    """
 
    Tests permissions of vhost configuration file.
 
    """
 

	
 
    config = File('/etc/nginx/sites-available/parameters-mandatory')
 
    config = host.file('/etc/nginx/sites-available/parameters-mandatory')
 

	
 
    assert config.is_file
 
    assert config.user == 'root'
 
@@ -193,40 +195,40 @@ def test_vhost_file(File):
 
    assert config.mode == 0o640
 

	
 

	
 
def test_website_enabled(File):
 
def test_website_enabled(host):
 
    """
 
    Tests if website has been enabled.
 
    """
 

	
 
    config = File('/etc/nginx/sites-enabled/parameters-mandatory')
 
    config = host.file('/etc/nginx/sites-enabled/parameters-mandatory')
 

	
 
    assert config.is_symlink
 
    assert config.linked_to == '/etc/nginx/sites-available/parameters-mandatory'
 

	
 

	
 
def test_https_enforcement(Command):
 
def test_https_enforcement(host):
 
    """
 
    Tests if HTTPS is being enforced.
 
    """
 

	
 
    https_enforcement = Command('curl -I http://parameters-mandatory/')
 
    https_enforcement = host.run('curl -I http://parameters-mandatory/')
 

	
 
    assert https_enforcement.rc == 0
 
    assert 'HTTP/1.1 301 Moved Permanently' in https_enforcement.stdout
 
    assert 'Location: https://parameters-mandatory/' in https_enforcement.stdout
 

	
 
    https_enforcement = Command('curl -I https://parameters-mandatory/')
 
    https_enforcement = host.run('curl -I https://parameters-mandatory/')
 

	
 
    assert https_enforcement.rc == 0
 
    assert 'Strict-Transport-Security: max-age=31536000; includeSubDomains' in https_enforcement.stdout
 

	
 

	
 
def test_index_page(Command):
 
def test_index_page(host):
 
    """
 
    Tests if index page is served correctly.
 
    """
 

	
 
    page = Command('curl https://parameters-mandatory/')
 
    page = host.run('curl https://parameters-mandatory/')
 

	
 
    assert page.rc == 0
 
    assert page.stdout == "This is the index page for parameters-mandatory."
roles/php_website/molecule/default/tests/test_parameters_optional.py
Show inline comments
 
file renamed from roles/php_website/tests/test_parameters_optional.py to roles/php_website/molecule/default/tests/test_parameters_optional.py
 
@@ -6,26 +6,26 @@ import testinfra.utils.ansible_runner
 

	
 

	
 
testinfra_hosts = testinfra.utils.ansible_runner.AnsibleRunner(
 
    '.molecule/ansible_inventory').get_hosts('all')
 
    '.molecule/ansible_inventory.yml').get_hosts('all')
 

	
 

	
 
def test_website_group(Group):
 
def test_website_group(host):
 
    """
 
    Tests if website group has been created correctly.
 
    """
 

	
 
    group = Group('web-parameters-optional_local')
 
    group = host.group('web-parameters-optional_local')
 

	
 
    assert group.exists
 
    assert group.gid == 5001
 

	
 

	
 
def test_website_admin_user(User):
 
def test_website_admin_user(host):
 
    """
 
    Tests if website administrator user has been created correctly.
 
    """
 

	
 
    user = User('admin-parameters-optional_local')
 
    user = host.user('admin-parameters-optional_local')
 

	
 
    assert user.exists
 
    assert user.uid == 5000
 
@@ -35,12 +35,12 @@ def test_website_admin_user(User):
 
    assert user.home == '/var/www/parameters-optional.local'
 

	
 

	
 
def test_website_admin_home(File, Sudo):
 
def test_website_admin_home(host):
 
    """
 
    Tests if permissions on website admin home directory are correct.
 
    """
 

	
 
    home = File('/var/www/parameters-optional.local')
 
    home = host.file('/var/www/parameters-optional.local')
 

	
 
    assert home.is_directory
 
    assert home.user == 'admin-parameters-optional_local'
 
@@ -48,27 +48,27 @@ def test_website_admin_home(File, Sudo):
 
    assert home.mode == 0o750
 

	
 

	
 
def test_home_profile_directory(File, Sudo):
 
def test_home_profile_directory(host):
 
    """
 
    Tests if profile directory has been set-up correctly for the website
 
    administrator/application user.
 
    """
 

	
 
    with Sudo():
 
    with host.sudo():
 

	
 
        directory = File('/var/www/parameters-optional.local/.profile.d')
 
        directory = host.file('/var/www/parameters-optional.local/.profile.d')
 
        assert directory.is_directory
 
        assert directory.user == 'admin-parameters-optional_local'
 
        assert directory.group == 'web-parameters-optional_local'
 
        assert directory.mode == 0o750
 

	
 

	
 
def test_website_application_user(Command, Sudo, User):
 
def test_website_application_user(host):
 
    """
 
    Tests if website application user has been created correctly.
 
    """
 

	
 
    user = User('web-parameters-optional_local')
 
    user = host.user('web-parameters-optional_local')
 

	
 
    assert user.exists
 
    assert user.uid == 5001
 
@@ -77,28 +77,28 @@ def test_website_application_user(Command, Sudo, User):
 
    assert user.shell == '/bin/sh'
 
    assert user.home == '/var/www/parameters-optional.local'
 

	
 
    with Sudo():
 
        umask = Command("su -l web-parameters-optional_local -c 'bash -c umask'")
 
    with host.sudo():
 
        umask = host.run("su -l web-parameters-optional_local -c 'bash -c umask'")
 
        assert umask.stdout == '0007'
 

	
 

	
 
def test_nginx_user(User):
 
def test_nginx_user(host):
 
    """
 
    Tests if web server user has been added to website group.
 
    """
 

	
 
    user = User('www-data')
 
    user = host.user('www-data')
 
    assert 'web-parameters-optional_local' in user.groups
 

	
 

	
 
def test_forward_file(File, Sudo):
 
def test_forward_file(host):
 
    """
 
    Tests if the forward file has correct permissions and content.
 
    """
 

	
 
    with Sudo():
 
    with host.sudo():
 

	
 
        config = File('/var/www/parameters-optional.local/.forward')
 
        config = host.file('/var/www/parameters-optional.local/.forward')
 
        assert config.is_file
 
        assert config.user == 'root'
 
        assert config.group == 'web-parameters-optional_local'
 
@@ -106,66 +106,68 @@ def test_forward_file(File, Sudo):
 
        assert config.content == "user"
 

	
 

	
 
def test_mail_forwarding(Command, File, Sudo):
 
def test_mail_forwarding(host):
 
    """
 
    Tests if mail forwarding works as expected.
 
    """
 

	
 
    send = Command('swaks --suppress-data --to web-parameters-optional_local@localhost')
 
    hostname = host.run('hostname').stdout
 

	
 
    send = host.run('swaks --suppress-data --to web-parameters-optional_local@localhost')
 
    assert send.rc == 0
 
    message_id = re.search('Ok: queued as (.*)', send.stdout).group(1)
 

	
 
    # Sleep for a couple of seconds so the mail can get delivered.
 
    time.sleep(5)
 

	
 
    with Sudo():
 
        mail_log = File('/var/log/mail.log')
 
    with host.sudo():
 
        mail_log = host.file('/var/log/mail.log')
 

	
 
        # First extract message ID of forwarded mail.
 
        pattern = "%s: to=<web-parameters-optional_local@localhost>.*status=sent \(forwarded as ([^)]*)\)" % message_id
 
        message_id = re.search(pattern, mail_log.content).group(1)
 

	
 
        # Now try to determine where the forward ended-up at.
 
        pattern = "%s: to=<user@php-website>, orig_to=<web-parameters-optional_local@localhost>.*status=sent" % message_id
 
        pattern = "%s: to=<user@%s>, orig_to=<web-parameters-optional_local@localhost>.*status=sent" % (message_id, hostname)
 
        assert re.search(pattern, mail_log.content) is not None
 

	
 

	
 
def test_installed_packages(Package):
 
def test_installed_packages(host):
 
    """
 
    Tests if additional packages are installed.
 
    """
 

	
 
    assert Package('php5-ldap').is_installed
 
    assert Package('php5-json').is_installed
 
    assert Package('libmariadb-client-lgpl-dev-compat').is_installed
 
    assert host.package('php5-ldap').is_installed
 
    assert host.package('php5-json').is_installed
 
    assert host.package('libmariadb-client-lgpl-dev-compat').is_installed
 

	
 

	
 
def test_mariadb_compat_symlink(File):
 
def test_mariadb_compat_symlink(host):
 
    """
 
    Tests if compatibility symlink is set-up for mysql_config binary if
 
    libmariadb-client-lgpl-dev-compat is installed.
 
    """
 

	
 
    link = File('/usr/bin/mysql_config')
 
    link = host.file('/usr/bin/mysql_config')
 
    assert link.is_symlink
 
    assert link.linked_to == "/usr/bin/mariadb_config"
 

	
 

	
 
def test_nginx_tls_files(File, Sudo):
 
def test_nginx_tls_files(host):
 
    """
 
    Tests if TLS private key and certificate have been deployed correctly.
 
    """
 

	
 
    with Sudo():
 
    with host.sudo():
 

	
 
        tls_file = File('/etc/ssl/private/parameters-optional.local_https.key')
 
        tls_file = host.file('/etc/ssl/private/parameters-optional.local_https.key')
 
        assert tls_file.is_file
 
        assert tls_file.user == 'root'
 
        assert tls_file.group == 'root'
 
        assert tls_file.mode == 0o640
 
        assert tls_file.content == open("tests/data/x509/parameters-optional.local_https.key.pem", "r").read().rstrip()
 

	
 
        tls_file = File('/etc/ssl/certs/parameters-optional.local_https.pem')
 
        tls_file = host.file('/etc/ssl/certs/parameters-optional.local_https.pem')
 
        assert tls_file.is_file
 
        assert tls_file.user == 'root'
 
        assert tls_file.group == 'root'
 
@@ -173,13 +175,13 @@ def test_nginx_tls_files(File, Sudo):
 
        assert tls_file.content == open("tests/data/x509/parameters-optional.local_https.cert.pem", "r").read().rstrip()
 

	
 

	
 
def test_certificate_validity_check_configuration(File):
 
def test_certificate_validity_check_configuration(host):
 
    """
 
    Tests if certificate validity check configuration file has been deployed
 
    correctly.
 
    """
 

	
 
    config = File('/etc/check_certificate/parameters-optional.local_https.conf')
 
    config = host.file('/etc/check_certificate/parameters-optional.local_https.conf')
 
    assert config.is_file
 
    assert config.user == 'root'
 
    assert config.group == 'root'
 
@@ -187,12 +189,12 @@ def test_certificate_validity_check_configuration(File):
 
    assert config.content == "/etc/ssl/certs/parameters-optional.local_https.pem"
 

	
 

	
 
def test_vhost_file(File):
 
def test_vhost_file(host):
 
    """
 
    Tests permissions of vhost configuration file.
 
    """
 

	
 
    config = File('/etc/nginx/sites-available/parameters-optional.local')
 
    config = host.file('/etc/nginx/sites-available/parameters-optional.local')
 

	
 
    assert config.is_file
 
    assert config.user == 'root'
 
@@ -200,118 +202,118 @@ def test_vhost_file(File):
 
    assert config.mode == 0o640
 

	
 

	
 
def test_website_enabled(File):
 
def test_website_enabled(host):
 
    """
 
    Tests if website has been enabled.
 
    """
 

	
 
    config = File('/etc/nginx/sites-enabled/parameters-optional.local')
 
    config = host.file('/etc/nginx/sites-enabled/parameters-optional.local')
 

	
 
    assert config.is_symlink
 
    assert config.linked_to == '/etc/nginx/sites-available/parameters-optional.local'
 

	
 

	
 
def test_https_enforcement(Command):
 
def test_https_enforcement(host):
 
    """
 
    Tests if HTTPS is (not) being enforced.
 
    """
 

	
 
    https_enforcement = Command('curl -I http://parameters-optional.local/')
 
    https_enforcement = host.run('curl -I http://parameters-optional.local/')
 

	
 
    assert https_enforcement.rc == 0
 
    assert 'HTTP/1.1 200 OK' in https_enforcement.stdout
 
    assert 'HTTP/1.1 301 Moved Permanently' not in https_enforcement.stdout
 
    assert 'Location: https://parameters-optional/' not in https_enforcement.stdout
 

	
 
    https_enforcement = Command('curl -I https://parameters-optional.local/')
 
    https_enforcement = host.run('curl -I https://parameters-optional.local/')
 

	
 
    assert https_enforcement.rc == 0
 
    assert 'Strict-Transport-Security' not in https_enforcement.stdout
 

	
 

	
 
def test_index_page(Command):
 
def test_index_page(host):
 
    """
 
    Tests if index page is served correctly (should be php file served statically).
 
    """
 

	
 
    page = Command('curl https://parameters-optional.local/')
 
    page = host.run('curl https://parameters-optional.local/')
 

	
 
    assert page.rc == 0
 
    assert page.stdout == open("tests/data/php/optional/myindex.php").read().rstrip()
 

	
 

	
 
def test_additional_fpm_config(Command):
 
def test_additional_fpm_config(host):
 
    """
 
    Tests if additional FPM configuration is processed correctly.
 
    """
 

	
 
    page = Command('curl https://parameters-optional.local/path.myphp')
 
    page = host.run('curl https://parameters-optional.local/path.myphp')
 

	
 
    assert page.rc == 0
 
    assert page.stdout == "/usr/local/bin:/usr/bin:/bin"
 

	
 

	
 
def test_additional_nginx_config(Command):
 
def test_additional_nginx_config(host):
 
    """
 
    Tests if additional Nginx configuration has been applied (custom 404 page).
 
    """
 

	
 
    page = Command('curl https://parameters-optional.local/non-existing-page')
 
    page = host.run('curl https://parameters-optional.local/non-existing-page')
 

	
 
    assert page.rc == 0
 
    assert page.stdout == "This is custom error page."
 

	
 

	
 
def test_deny_files_regex(Command):
 
def test_deny_files_regex(host):
 
    """
 
    Tests if regex used for denying access is applied correctly.
 
    """
 

	
 
    page = Command('curl -I https://parameters-optional.local/secretfile.txt')
 
    page = host.run('curl -I https://parameters-optional.local/secretfile.txt')
 

	
 
    assert page.rc == 0
 
    assert "HTTP/1.1 403 Forbidden" in page.stdout
 

	
 

	
 
def test_environment_indicator(Command):
 
def test_environment_indicator(host):
 
    """
 
    Tests if environment indicator is applied correctly.
 
    """
 

	
 
    page = Command('curl https://parameters-optional.local/info.myphp')
 
    page = host.run('curl https://parameters-optional.local/info.myphp')
 

	
 
    assert page.rc == 0
 
    assert "<div id='website-environment' style='background-color: #ff0000; width: 100%; text-align: center; position: fixed; bottom: 5px; color: #00ff00; " \
 
        "font-weight: bold; z-index: 999999;'>parameters-optional</div></body>" in page.stdout
 

	
 

	
 
def test_php_rewrire_urls(Command):
 
def test_php_rewrire_urls(host):
 
    """
 
    Tests if PHP rewrite URLs are processed correctly.
 
    """
 

	
 
    page = Command('curl https://parameters-optional.local/rewrite1/this/is/some/path')
 
    page = host.run('curl https://parameters-optional.local/rewrite1/this/is/some/path')
 

	
 
    assert page.rc == 0
 
    assert page.stdout == "/rewrite1/this/is/some/path"
 

	
 
    page = Command('curl https://parameters-optional.local/rewrite2/this/is/some/other/path')
 
    page = host.run('curl https://parameters-optional.local/rewrite2/this/is/some/other/path')
 

	
 
    assert page.rc == 0
 
    assert page.stdout == "/rewrite2/this/is/some/other/path"
 

	
 

	
 
def test_regular_rewrites(Command):
 
def test_regular_rewrites(host):
 
    """
 
    Tests if regular rewrites are working as expected.
 
    """
 

	
 
    page = Command('curl https://parameters-optional.local/rewrite_to_index1/some/path')
 
    page = host.run('curl https://parameters-optional.local/rewrite_to_index1/some/path')
 

	
 
    assert page.rc == 0
 
    assert page.stdout == open("tests/data/php/optional/myindex.php").read().rstrip()
 

	
 
    page = Command('curl https://parameters-optional.local/rewrite_to_index2/some/path')
 
    page = host.run('curl https://parameters-optional.local/rewrite_to_index2/some/path')
 

	
 
    assert page.rc == 0
 
    assert page.stdout == open("tests/data/php/optional/myindex.php").read().rstrip()
0 comments (0 inline, 0 general)