implement test harness

This commit is contained in:
Megan 2018-03-17 15:25:25 -05:00
parent 85a51a45a3
commit 73b7acea44
10 changed files with 247 additions and 0 deletions

10
.gitignore vendored
View File

@ -1,2 +1,12 @@
*.egg
*.egg-info/
*.py[cod]
.*.sw? .*.sw?
.env
.pytest_cache/
.venv/
/.idea/ /.idea/
__pycache__/
Dockerfile.*_*
ignore/
tmp/

24
.travis.yml Normal file
View File

@ -0,0 +1,24 @@
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
Makefile Normal file
View File

@ -0,0 +1,80 @@
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)

View File

@ -112,3 +112,48 @@ the upstream phusion passenger repository with `install_from_phusionpassenger: t
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

View File

@ -0,0 +1,23 @@
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
tests/srv/salt/top.sls Normal file
View File

@ -0,0 +1,3 @@
base:
'*':
- nginx

27
tools/filltmpl.py Normal file
View File

@ -0,0 +1,27 @@
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
tools/run-tests.sh Executable file
View File

@ -0,0 +1,21 @@
#!/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

View File

@ -0,0 +1,14 @@
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