From a03caea549c033796de8720e5ed45dd8384a12f2 Mon Sep 17 00:00:00 2001 From: diginc Date: Mon, 10 Oct 2016 23:14:39 -0500 Subject: [PATCH] setupVar tests passing for debian & centos --- .gitignore | 4 ++ automated install/basic-install.sh | 4 +- autotest | 1 + test/__init__.py | 0 test/centos.Dockerfile | 14 ++++++ test/conftest.py | 46 ++++++++++++++++++ test/debian.Dockerfile | 15 ++++++ test/test_000_build_containers.py | 18 +++++++ test/test_automated_install.py | 77 ++++++++++++++++++++++++++++++ 9 files changed, 178 insertions(+), 1 deletion(-) create mode 100755 autotest create mode 100644 test/__init__.py create mode 100644 test/centos.Dockerfile create mode 100644 test/conftest.py create mode 100644 test/debian.Dockerfile create mode 100644 test/test_000_build_containers.py create mode 100644 test/test_automated_install.py diff --git a/.gitignore b/.gitignore index e43b0f98..0e0d4b99 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,5 @@ .DS_Store +*.pyc +*.swp +__pycache__ +.cache diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index 945fa1e1..13e546ba 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -971,4 +971,6 @@ echo "::: The install log is located at: /etc/pihole/install.log" echo "::: View the web interface at http://pi.hole/admin or http://${IPv4_address%/*}/admin" } -main "$@" +if [[ -z "$PHTEST" ]] ; then + main "$@" +fi diff --git a/autotest b/autotest new file mode 100755 index 00000000..3747cc0b --- /dev/null +++ b/autotest @@ -0,0 +1 @@ +py.test -v -f test/ diff --git a/test/__init__.py b/test/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/test/centos.Dockerfile b/test/centos.Dockerfile new file mode 100644 index 00000000..9af7eb4d --- /dev/null +++ b/test/centos.Dockerfile @@ -0,0 +1,14 @@ +FROM centos:7 + +ENV GITDIR /etc/.pihole +ENV SCRIPTDIR /opt/pihole + +RUN mkdir -p $GITDIR $SCRIPTDIR /etc/pihole +ADD . $GITDIR +RUN cp $GITDIR/advanced/Scripts/*.sh $GITDIR/gravity.sh $GITDIR/pihole $GITDIR/automated\ install/*.sh $SCRIPTDIR/ +ENV PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:$SCRIPTDIR + +RUN true && \ + chmod +x $SCRIPTDIR/* + +#sed '/# Start the installer/Q' /opt/pihole/basic-install.sh > /opt/pihole/stub_basic-install.sh && \ diff --git a/test/conftest.py b/test/conftest.py new file mode 100644 index 00000000..407d00dc --- /dev/null +++ b/test/conftest.py @@ -0,0 +1,46 @@ +import pytest +import testinfra + +check_output = testinfra.get_backend( + "local://" +).get_module("Command").check_output + +@pytest.fixture +def Pihole(Docker): + ''' used to contain some script stubbing, now pretty much an alias ''' + return Docker + +@pytest.fixture +def Docker(request, args, image, cmd): + ''' combine our fixtures into a docker run command and setup finalizer to cleanup ''' + assert 'docker' in check_output('id'), "Are you in the docker group?" + docker_run = "docker run {} {} {}".format(args, image, cmd) + docker_id = check_output(docker_run) + + def teardown(): + check_output("docker rm -f %s", docker_id) + request.addfinalizer(teardown) + + docker_container = testinfra.get_backend("docker://" + docker_id) + docker_container.id = docker_id + return docker_container + +@pytest.fixture +def args(request): + ''' -t became required when tput began being used ''' + return '-t -d' + +@pytest.fixture(params=['debian', 'centos']) +def tag(request): + ''' consumed by image to make the test matrix ''' + return request.param + +@pytest.fixture() +def image(request, tag): + ''' built by test_000_build_containers.py ''' + return 'pytest_pihole:{}'.format(tag) + +@pytest.fixture() +def cmd(request): + ''' default to doing nothing by tailing null, but don't exit ''' + return 'tail -f /dev/null' diff --git a/test/debian.Dockerfile b/test/debian.Dockerfile new file mode 100644 index 00000000..b80d6155 --- /dev/null +++ b/test/debian.Dockerfile @@ -0,0 +1,15 @@ +FROM debian:jessie + +ENV GITDIR /etc/.pihole +ENV SCRIPTDIR /opt/pihole + +RUN mkdir -p $GITDIR $SCRIPTDIR /etc/pihole +ADD . $GITDIR +RUN cp $GITDIR/advanced/Scripts/*.sh $GITDIR/gravity.sh $GITDIR/pihole $GITDIR/automated\ install/*.sh $SCRIPTDIR/ +ENV PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:$SCRIPTDIR + + +RUN true && \ + chmod +x $SCRIPTDIR/* + +#sed '/# Start the installer/Q' /opt/pihole/basic-install.sh > /opt/pihole/stub_basic-install.sh && \ diff --git a/test/test_000_build_containers.py b/test/test_000_build_containers.py new file mode 100644 index 00000000..c617f3ae --- /dev/null +++ b/test/test_000_build_containers.py @@ -0,0 +1,18 @@ +''' This file starts with 000 to make it run first ''' +import pytest +import testinfra + +run_local = testinfra.get_backend( + "local://" +).get_module("Command").run + +@pytest.mark.parametrize("image,tag", [ + ( 'test/debian.Dockerfile', 'pytest_pihole:debian' ), + ( 'test/centos.Dockerfile', 'pytest_pihole:centos' ), +]) +def test_build_pihole_image(image, tag): + build_cmd = run_local('docker build -f {} -t {} .'.format(image, tag)) + if build_cmd.rc != 0: + print build_cmd.stdout + print build_cmd.stderr + assert build_cmd.rc == 0 diff --git a/test/test_automated_install.py b/test/test_automated_install.py new file mode 100644 index 00000000..1605fdb6 --- /dev/null +++ b/test/test_automated_install.py @@ -0,0 +1,77 @@ +import pytest +from textwrap import dedent + +SETUPVARS = { + 'piholeInterface' : 'eth99', + 'IPv4_address' : '1.1.1.1', + 'IPv6_address' : '2:2:2:2:2:2', + 'piholeDNS1' : '4.2.2.1', + 'piholeDNS2' : '4.2.2.2' +} + +def test_setupVars_are_sourced_to_global_scope(Pihole): + ''' currently update_dialogs sources setupVars with a dot, + then various other functions use the variables ''' + setup_var_file = 'cat < /etc/pihole/setupVars.conf\n' + for k,v in SETUPVARS.iteritems(): + setup_var_file += "{}={}\n".format(k, v) + setup_var_file += "EOF\n" + Pihole.run(setup_var_file) + + script = dedent('''\ + #!/bin/bash -e + printSetupVars() { + # Currently debug test function only + echo "Outputting sourced variables" + echo "piholeInterface=\${piholeInterface}" + echo "IPv4_address=\${IPv4_address}" + echo "IPv6_address=\${IPv6_address}" + echo "piholeDNS1=\${piholeDNS1}" + echo "piholeDNS2=\${piholeDNS2}" + } + update_dialogs() { + . /etc/pihole/setupVars.conf + } + update_dialogs + printSetupVars + ''') + + output = run_script(Pihole, script).stdout + + for k,v in SETUPVARS.iteritems(): + assert "{}={}".format(k, v) in output + +def test_setupVars_saved_to_file(Pihole): + ''' confirm saved settings are written to a file for future updates to re-use ''' + set_setup_vars = '\n' # dedent works better with this and padding matching script below + for k,v in SETUPVARS.iteritems(): + set_setup_vars += " {}={}\n".format(k, v) + Pihole.run(set_setup_vars).stdout + + script = dedent('''\ + #!/bin/bash -e + echo start + TERM=xterm + PHTEST=TRUE + source /opt/pihole/basic-install.sh + {} + finalExports + cat /etc/pihole/setupVars.conf + '''.format(set_setup_vars)) + + output = run_script(Pihole, script).stdout + + for k,v in SETUPVARS.iteritems(): + assert "{}={}".format(k, v) in output + +def run_script(Pihole, script, file="/test.sh"): + _write_test_script(Pihole, script, file=file) + result = Pihole.run(file) + assert result.rc == 0 + return result + +def _write_test_script(Pihole, script, file): + ''' Running the test script blocks directly can behave differently with regard to global vars ''' + ''' this is a cheap work around to that until all functions no longer rely on global variables ''' + Pihole.run('cat < {file}\n{script}\nEOF'.format(file=file, script=script)) + Pihole.run('chmod +x {}'.format(file))