Browse Source

implement test harness

tags/v0.55.0
Megan 6 years ago
parent
commit
73b7acea44
10 changed files with 247 additions and 0 deletions
  1. +10
    -0
      .gitignore
  2. +24
    -0
      .travis.yml
  3. +80
    -0
      Makefile
  4. +45
    -0
      README.rst
  5. +0
    -0
      tests/pytests/apply-all-tests/__init__.py
  6. +23
    -0
      tests/pytests/apply-all-tests/test_000_apply_state.py
  7. +3
    -0
      tests/srv/salt/top.sls
  8. +27
    -0
      tools/filltmpl.py
  9. +21
    -0
      tools/run-tests.sh
  10. +14
    -0
      tools/templates/Dockerfile.j2

+ 10
- 0
.gitignore View File

*.egg
*.egg-info/
*.py[cod]
.*.sw? .*.sw?
.env
.pytest_cache/
.venv/
/.idea/ /.idea/
__pycache__/
Dockerfile.*_*
ignore/
tmp/

+ 24
- 0
.travis.yml View File

env:
matrix:
- OS_ID: centos_master_2017.7.2
- OS_ID: debian_master_2017.7.2
- OS_ID: opensuse_master_2017.7.2
- OS_ID: ubuntu_master_2016.11.3
- OS_ID: ubuntu_master_2017.7.2

sudo: required

language: python

services:
- docker

before_install:
- pip install Jinja2
- python ${TRAVIS_BUILD_DIR}/tools/filltmpl.py nginx ${OS_ID}

install:
- docker build --force-rm -t "nginx:salt-testing-${OS_ID}" -f "Dockerfile.${OS_ID}" .

script:
- ./tools/run-tests.sh nginx ${OS_ID}

+ 80
- 0
Makefile View File

FORMULA_NAME = "nginx"
PWD = $(shell pwd)

# ---------------------------------------------------------------
define render_dockerfile
python $(PWD)/tools/filltmpl.py $(FORMULA_NAME) $(1)
endef

define docker_build
docker build --force-rm -t $(FORMULA_NAME):salt-testing-$(1) -f Dockerfile.$(1) .
endef

define docker_run_local
docker run --rm -v $(PWD):/opt/$(FORMULA_NAME)-formula --env=STAGE=TEST -h salt-testing-$(1) --name salt-testing-$(1) -it $(FORMULA_NAME):salt-testing-$(1) /bin/bash
endef

define run_tests
./tools/run-tests.sh $(FORMULA_NAME) $(1)
endef

# --- convenience functions -------------------------------------
define build_thing
$(call render_dockerfile,$(1)) && $(call docker_build,$(1))
endef

define run_local_tests
$(call build_thing,$(1)) && $(call run_tests,$(1))
endef

define run_local
$(call build_thing,$(1)) && $(call docker_run_local,$(1))
endef

# ---------------------------------------------------------------
setup:
pip install Jinja2

clean:
find . -name '*.pyc' -exec rm '{}' ';'
rm -rf Dockerfile.*
# delete pytest caches...
# rm -rf tests/pytests/*/.pytest_cache
# rm -rf tests/pytests/*/__pycache__
rm -rf tests/pytests/apply-all-tests/.pytest_cache
rm -rf tests/pytests/apply-all-tests/__pycache__

# --- centos_master_2017.7.2 ------------------------------------
test-centos_master_2017.7.2: clean
$(call run_local_tests,centos_master_2017.7.2)

local-centos_master_2017.7.2: clean
$(call run_local,centos_master_2017.7.2)

# --- debian_master_2017.7.2 ------------------------------------
test-debian_master_2017.7.2: clean
$(call run_local_tests,debian_master_2017.7.2)

local-debian_master_2017.7.2: clean
$(call run_local,debian_master_2017.7.2)

# --- opensuse_master_2017.7.2 ------------------------------------
test-opensuse_master_2017.7.2: clean
$(call run_local_tests,opensuse_master_2017.7.2)

local-opensuse_master_2017.7.2: clean
$(call run_local,opensuse_master_2017.7.2)

# --- ubuntu_master_2016.11.3 ------------------------------------
test-ubuntu_master_2016.11.3: clean
$(call run_local_tests,ubuntu_master_2016.11.3)

local-ubuntu_master_2016.11.3: clean
$(call run_local,ubuntu_master_2016.11.3)

# --- ubuntu_master_2017.7.2 ------------------------------------
test-ubuntu_master_2017.7.2: clean
$(call run_local_tests,ubuntu_master_2017.7.2)

local-ubuntu_master_2017.7.2: clean
$(call run_local,ubuntu_master_2017.7.2)

+ 45
- 0
README.rst View File

Nginx will also be installed from that repository, as it needs to be modified to Nginx will also be installed from that repository, as it needs to be modified to
allow the passenger module to work. allow the passenger module to work.




Running Tests
=============

This test runner was implemented using the formula-test-harness_ project.

Tests will be run on the following base images:

* ``simplyadrian/allsalt:centos_master_2017.7.2``
* ``simplyadrian/allsalt:debian_master_2017.7.2``
* ``simplyadrian/allsalt:opensuse_master_2017.7.2``
* ``simplyadrian/allsalt:ubuntu_master_2016.11.3``
* ``simplyadrian/allsalt:ubuntu_master_2017.7.2``

Local Setup
-----------

.. code-block:: shell

pip install -U virtualenv
virtualenv .venv
source .venv/bin/activate
make setup

Run tests
---------

* ``make test-centos_master_2017.7.2``
* ``make test-debian_master_2017.7.2``
* ``make test-opensuse_master_2017.7.2``
* ``make test-ubuntu_master_2016.11.3``
* ``make test-ubuntu_master_2017.7.2``

Run Containers
--------------

* ``make local-centos_master_2017.7.2``
* ``make local-debian_master_2017.7.2``
* ``make local-opensuse_master_2017.7.2``
* ``make local-ubuntu_master_2016.11.3``
* ``make local-ubuntu_master_2017.7.2``


.. _formula-test-harness: https://github.com/intuitivetechnologygroup/formula-test-harness

+ 0
- 0
tests/pytests/apply-all-tests/__init__.py View File


+ 23
- 0
tests/pytests/apply-all-tests/test_000_apply_state.py View File

from subprocess import check_output
from unittest import TestCase


class ApplyStateTest(TestCase):

def test_000_apply(self):
state_apply_response = check_output(["salt-call", "--local", "state.apply"])
print('')
print('-' * 50)
print('state_apply_response:')
print(state_apply_response)
print('-' * 50)
print('')

state_apply_response = state_apply_response.split('\n')
summary = state_apply_response[-8:]
failed = 0
for line in summary:
if line.startswith('Failed:'):
failed = int(line.split(':').pop().strip())

self.assertEqual(failed, 0)

+ 3
- 0
tests/srv/salt/top.sls View File

base:
'*':
- nginx

+ 27
- 0
tools/filltmpl.py View File

import os
import sys

from jinja2 import Template

# base/tests
dir_path = os.path.dirname(os.path.realpath(__file__))

# base
base_path = os.path.dirname(dir_path)


if __name__ == '__main__':
formula_name = sys.argv[1]
image_tag = sys.argv[2]

template = Template(
open(os.path.join(dir_path, 'templates', 'Dockerfile.j2')).read()
)

dockerfile = template.render({
'formula_name': formula_name,
'image_tag': image_tag
})

with open(os.path.join(base_path, 'Dockerfile.{}'.format(image_tag)), 'w') as fh:
fh.write(dockerfile)

+ 21
- 0
tools/run-tests.sh View File

#!/bin/bash
set -ev

test -z $2 && echo "Usage: ${0} FORMULA_NAME OS_ID" && exit 1
export FORMULA_NAME=$1
export OS_ID=$2


function docker-run-pytest() {
docker run --rm \
-v "$@":/opt/tests \
--env=STAGE=TEST \
-h "salt-testing-${OS_ID}" \
--name "salt-testing-${OS_ID}" \
-it ${FORMULA_NAME}:"salt-testing-${OS_ID}" \
pytest -sv /opt/tests
}

for i in $(find $PWD/tests/pytests/* -maxdepth 0 -type d); do
docker-run-pytest $i;
done

+ 14
- 0
tools/templates/Dockerfile.j2 View File

FROM simplyadrian/allsalt:{{ image_tag }}

{% if 'debian' in image_tag or 'ubuntu' in image_tag -%}
RUN apt-get update && \
apt-get install -y python-pip
{% endif %}

RUN pip install pytest && \
sed -i "s/#master: salt/master: localhost/g" /etc/salt/minion

ADD tests/srv /srv
ADD {{ formula_name }} /srv/salt/{{ formula_name }}

WORKDIR /srv/salt

Loading…
Cancel
Save