2019-10-30 22:29:17 +00:00
|
|
|
"""Unit tests: template_default"""
|
2020-07-11 19:13:24 +00:00
|
|
|
import os
|
|
|
|
|
|
|
|
FILE_MODE = 0o754
|
2019-10-01 13:12:18 +00:00
|
|
|
|
|
|
|
# these values are also testing the handling of bizarre characters
|
2019-10-30 22:29:17 +00:00
|
|
|
LOCAL_CLASS = "default_Test+@-!^Class"
|
2021-01-10 21:38:42 +00:00
|
|
|
LOCAL_CLASS2 = "default_Test+@-|^2nd_Class withSpace"
|
2021-12-23 21:42:43 +00:00
|
|
|
LOCAL_ARCH = "default_Test+@-!^Arch"
|
2019-10-30 22:29:17 +00:00
|
|
|
LOCAL_SYSTEM = "default_Test+@-!^System"
|
|
|
|
LOCAL_HOST = "default_Test+@-!^Host"
|
|
|
|
LOCAL_USER = "default_Test+@-!^User"
|
|
|
|
LOCAL_DISTRO = "default_Test+@-!^Distro"
|
2022-01-17 19:46:31 +00:00
|
|
|
LOCAL_DISTRO_FAMILY = "default_Test+@-!^Family"
|
2019-10-01 13:12:18 +00:00
|
|
|
TEMPLATE = f'''
|
|
|
|
start of template
|
2022-01-17 19:46:31 +00:00
|
|
|
default class = >{{{{yadm.class}}}}<
|
|
|
|
default arch = >{{{{yadm.arch}}}}<
|
|
|
|
default os = >{{{{yadm.os}}}}<
|
|
|
|
default host = >{{{{yadm.hostname}}}}<
|
|
|
|
default user = >{{{{yadm.user}}}}<
|
|
|
|
default distro = >{{{{yadm.distro}}}}<
|
|
|
|
default distro_family = >{{{{yadm.distro_family}}}}<
|
2019-10-05 16:01:13 +00:00
|
|
|
{{% if yadm.class == "else1" %}}
|
|
|
|
wrong else 1
|
|
|
|
{{% else %}}
|
|
|
|
Included section from else
|
|
|
|
{{% endif %}}
|
2019-10-01 13:17:28 +00:00
|
|
|
{{% if yadm.class == "wrongclass1" %}}
|
2019-10-01 13:12:18 +00:00
|
|
|
wrong class 1
|
2019-10-01 13:17:28 +00:00
|
|
|
{{% endif %}}
|
|
|
|
{{% if yadm.class == "{LOCAL_CLASS}" %}}
|
|
|
|
Included section for class = {{{{yadm.class}}}} ({{{{yadm.class}}}} repeated)
|
2019-10-05 16:01:13 +00:00
|
|
|
Multiple lines
|
|
|
|
{{% else %}}
|
|
|
|
Should not be included...
|
2019-10-01 13:17:28 +00:00
|
|
|
{{% endif %}}
|
2021-01-10 21:38:42 +00:00
|
|
|
{{% if yadm.class == "{LOCAL_CLASS2}" %}}
|
|
|
|
Included section for second class
|
|
|
|
{{% endif %}}
|
2019-10-01 13:17:28 +00:00
|
|
|
{{% if yadm.class == "wrongclass2" %}}
|
2019-10-01 13:12:18 +00:00
|
|
|
wrong class 2
|
2019-10-01 13:17:28 +00:00
|
|
|
{{% endif %}}
|
2021-12-23 21:42:43 +00:00
|
|
|
{{% if yadm.arch == "wrongarch1" %}}
|
|
|
|
wrong arch 1
|
|
|
|
{{% endif %}}
|
|
|
|
{{% if yadm.arch == "{LOCAL_ARCH}" %}}
|
|
|
|
Included section for arch = {{{{yadm.arch}}}} ({{{{yadm.arch}}}} repeated)
|
|
|
|
{{% endif %}}
|
|
|
|
{{% if yadm.arch == "wrongarch2" %}}
|
|
|
|
wrong arch 2
|
|
|
|
{{% endif %}}
|
2019-10-01 13:17:28 +00:00
|
|
|
{{% if yadm.os == "wrongos1" %}}
|
2019-10-01 13:12:18 +00:00
|
|
|
wrong os 1
|
2019-10-01 13:17:28 +00:00
|
|
|
{{% endif %}}
|
|
|
|
{{% if yadm.os == "{LOCAL_SYSTEM}" %}}
|
|
|
|
Included section for os = {{{{yadm.os}}}} ({{{{yadm.os}}}} repeated)
|
|
|
|
{{% endif %}}
|
|
|
|
{{% if yadm.os == "wrongos2" %}}
|
2019-10-01 13:12:18 +00:00
|
|
|
wrong os 2
|
2019-10-01 13:17:28 +00:00
|
|
|
{{% endif %}}
|
|
|
|
{{% if yadm.hostname == "wronghost1" %}}
|
2019-10-01 13:12:18 +00:00
|
|
|
wrong host 1
|
2019-10-01 13:17:28 +00:00
|
|
|
{{% endif %}}
|
|
|
|
{{% if yadm.hostname == "{LOCAL_HOST}" %}}
|
|
|
|
Included section for host = {{{{yadm.hostname}}}} ({{{{yadm.hostname}}}} again)
|
|
|
|
{{% endif %}}
|
|
|
|
{{% if yadm.hostname == "wronghost2" %}}
|
2019-10-01 13:12:18 +00:00
|
|
|
wrong host 2
|
2019-10-01 13:17:28 +00:00
|
|
|
{{% endif %}}
|
|
|
|
{{% if yadm.user == "wronguser1" %}}
|
2019-10-01 13:12:18 +00:00
|
|
|
wrong user 1
|
2019-10-01 13:17:28 +00:00
|
|
|
{{% endif %}}
|
|
|
|
{{% if yadm.user == "{LOCAL_USER}" %}}
|
|
|
|
Included section for user = {{{{yadm.user}}}} ({{{{yadm.user}}}} repeated)
|
|
|
|
{{% endif %}}
|
|
|
|
{{% if yadm.user == "wronguser2" %}}
|
2019-10-01 13:12:18 +00:00
|
|
|
wrong user 2
|
2019-10-01 13:17:28 +00:00
|
|
|
{{% endif %}}
|
|
|
|
{{% if yadm.distro == "wrongdistro1" %}}
|
2019-10-01 13:12:18 +00:00
|
|
|
wrong distro 1
|
2019-10-01 13:17:28 +00:00
|
|
|
{{% endif %}}
|
|
|
|
{{% if yadm.distro == "{LOCAL_DISTRO}" %}}
|
|
|
|
Included section for distro = {{{{yadm.distro}}}} ({{{{yadm.distro}}}} again)
|
|
|
|
{{% endif %}}
|
|
|
|
{{% if yadm.distro == "wrongdistro2" %}}
|
2019-10-01 13:12:18 +00:00
|
|
|
wrong distro 2
|
2019-10-01 13:17:28 +00:00
|
|
|
{{% endif %}}
|
2022-01-17 19:46:31 +00:00
|
|
|
{{% if yadm.distro_family == "wrongfamily1" %}}
|
|
|
|
wrong family 1
|
|
|
|
{{% endif %}}
|
|
|
|
{{% if yadm.distro_family == "{LOCAL_DISTRO_FAMILY}" %}}
|
|
|
|
Included section for distro_family = \
|
|
|
|
{{{{yadm.distro_family}}}} ({{{{yadm.distro_family}}}} again)
|
|
|
|
{{% endif %}}
|
|
|
|
{{% if yadm.distro_family == "wrongfamily2" %}}
|
|
|
|
wrong family 2
|
|
|
|
{{% endif %}}
|
2019-10-01 13:12:18 +00:00
|
|
|
end of template
|
|
|
|
'''
|
|
|
|
EXPECTED = f'''
|
|
|
|
start of template
|
2022-01-17 19:46:31 +00:00
|
|
|
default class = >{LOCAL_CLASS}<
|
|
|
|
default arch = >{LOCAL_ARCH}<
|
|
|
|
default os = >{LOCAL_SYSTEM}<
|
|
|
|
default host = >{LOCAL_HOST}<
|
|
|
|
default user = >{LOCAL_USER}<
|
|
|
|
default distro = >{LOCAL_DISTRO}<
|
|
|
|
default distro_family = >{LOCAL_DISTRO_FAMILY}<
|
2019-10-05 16:01:13 +00:00
|
|
|
Included section from else
|
2019-10-01 13:12:18 +00:00
|
|
|
Included section for class = {LOCAL_CLASS} ({LOCAL_CLASS} repeated)
|
2019-10-05 16:01:13 +00:00
|
|
|
Multiple lines
|
2021-01-10 21:38:42 +00:00
|
|
|
Included section for second class
|
2021-12-23 21:42:43 +00:00
|
|
|
Included section for arch = {LOCAL_ARCH} ({LOCAL_ARCH} repeated)
|
2019-10-01 13:12:18 +00:00
|
|
|
Included section for os = {LOCAL_SYSTEM} ({LOCAL_SYSTEM} repeated)
|
2019-10-01 13:17:28 +00:00
|
|
|
Included section for host = {LOCAL_HOST} ({LOCAL_HOST} again)
|
2019-10-01 13:12:18 +00:00
|
|
|
Included section for user = {LOCAL_USER} ({LOCAL_USER} repeated)
|
2019-10-01 13:17:28 +00:00
|
|
|
Included section for distro = {LOCAL_DISTRO} ({LOCAL_DISTRO} again)
|
2022-01-17 19:46:31 +00:00
|
|
|
Included section for distro_family = \
|
|
|
|
{LOCAL_DISTRO_FAMILY} ({LOCAL_DISTRO_FAMILY} again)
|
2019-10-01 13:12:18 +00:00
|
|
|
end of template
|
|
|
|
'''
|
|
|
|
|
2020-10-09 13:36:58 +00:00
|
|
|
INCLUDE_BASIC = 'basic\n'
|
2020-12-21 21:38:31 +00:00
|
|
|
INCLUDE_VARIABLES = '''\
|
|
|
|
included <{{ yadm.class }}> file
|
2020-10-09 13:36:58 +00:00
|
|
|
|
|
|
|
empty line above
|
|
|
|
'''
|
|
|
|
INCLUDE_NESTED = 'no newline at the end'
|
|
|
|
|
|
|
|
TEMPLATE_INCLUDE = '''\
|
|
|
|
The first line
|
|
|
|
{% include empty %}
|
|
|
|
An empty file removes the line above
|
|
|
|
{%include basic%}
|
|
|
|
{% include "./variables.{{ yadm.os }}" %}
|
|
|
|
{% include dir/nested %}
|
|
|
|
Include basic again:
|
|
|
|
{% include basic %}
|
|
|
|
'''
|
|
|
|
EXPECTED_INCLUDE = f'''\
|
|
|
|
The first line
|
|
|
|
An empty file removes the line above
|
|
|
|
basic
|
|
|
|
included <{LOCAL_CLASS}> file
|
|
|
|
|
|
|
|
empty line above
|
|
|
|
no newline at the end
|
|
|
|
Include basic again:
|
|
|
|
basic
|
|
|
|
'''
|
|
|
|
|
2019-10-01 13:12:18 +00:00
|
|
|
|
2019-10-30 22:29:17 +00:00
|
|
|
def test_template_default(runner, yadm, tmpdir):
|
|
|
|
"""Test template_default"""
|
2019-10-01 13:12:18 +00:00
|
|
|
|
|
|
|
input_file = tmpdir.join('input')
|
|
|
|
input_file.write(TEMPLATE, ensure=True)
|
2020-07-11 19:13:24 +00:00
|
|
|
input_file.chmod(FILE_MODE)
|
2019-10-01 13:12:18 +00:00
|
|
|
output_file = tmpdir.join('output')
|
|
|
|
|
2021-02-28 16:55:37 +00:00
|
|
|
# ensure overwrite works when file exists as read-only (there is some
|
|
|
|
# special processing when this is encountered because some environments do
|
|
|
|
# not properly overwrite read-only files)
|
|
|
|
output_file.write('existing')
|
|
|
|
output_file.chmod(0o400)
|
|
|
|
|
2019-10-01 13:12:18 +00:00
|
|
|
script = f"""
|
|
|
|
YADM_TEST=1 source {yadm}
|
2019-12-05 04:18:55 +00:00
|
|
|
set_awk
|
2019-10-01 13:12:18 +00:00
|
|
|
local_class="{LOCAL_CLASS}"
|
2021-01-10 21:38:42 +00:00
|
|
|
local_classes=("{LOCAL_CLASS2}" "{LOCAL_CLASS}")
|
2021-12-23 21:42:43 +00:00
|
|
|
local_arch="{LOCAL_ARCH}"
|
2019-10-01 13:12:18 +00:00
|
|
|
local_system="{LOCAL_SYSTEM}"
|
|
|
|
local_host="{LOCAL_HOST}"
|
|
|
|
local_user="{LOCAL_USER}"
|
|
|
|
local_distro="{LOCAL_DISTRO}"
|
2022-01-17 19:46:31 +00:00
|
|
|
local_distro_family="{LOCAL_DISTRO_FAMILY}"
|
2019-10-30 22:29:17 +00:00
|
|
|
template_default "{input_file}" "{output_file}"
|
2019-10-01 13:12:18 +00:00
|
|
|
"""
|
|
|
|
run = runner(command=['bash'], inp=script)
|
|
|
|
assert run.success
|
|
|
|
assert run.err == ''
|
|
|
|
assert output_file.read() == EXPECTED
|
2020-07-11 19:13:24 +00:00
|
|
|
assert os.stat(output_file).st_mode == os.stat(input_file).st_mode
|
2019-10-10 13:09:31 +00:00
|
|
|
|
|
|
|
|
|
|
|
def test_source(runner, yadm, tmpdir):
|
|
|
|
"""Test yadm.source"""
|
|
|
|
|
|
|
|
input_file = tmpdir.join('input')
|
|
|
|
input_file.write('{{yadm.source}}', ensure=True)
|
2020-07-11 19:13:24 +00:00
|
|
|
input_file.chmod(FILE_MODE)
|
2019-10-10 13:09:31 +00:00
|
|
|
output_file = tmpdir.join('output')
|
|
|
|
|
|
|
|
script = f"""
|
|
|
|
YADM_TEST=1 source {yadm}
|
2019-12-05 04:18:55 +00:00
|
|
|
set_awk
|
2019-10-30 22:29:17 +00:00
|
|
|
template_default "{input_file}" "{output_file}"
|
2019-10-10 13:09:31 +00:00
|
|
|
"""
|
|
|
|
run = runner(command=['bash'], inp=script)
|
|
|
|
assert run.success
|
|
|
|
assert run.err == ''
|
|
|
|
assert output_file.read().strip() == str(input_file)
|
2020-07-11 19:13:24 +00:00
|
|
|
assert os.stat(output_file).st_mode == os.stat(input_file).st_mode
|
2020-10-09 13:36:58 +00:00
|
|
|
|
|
|
|
|
|
|
|
def test_include(runner, yadm, tmpdir):
|
|
|
|
"""Test include"""
|
|
|
|
|
|
|
|
empty_file = tmpdir.join('empty')
|
|
|
|
empty_file.write('', ensure=True)
|
|
|
|
|
|
|
|
basic_file = tmpdir.join('basic')
|
|
|
|
basic_file.write(INCLUDE_BASIC)
|
|
|
|
|
|
|
|
variables_file = tmpdir.join(f'variables.{LOCAL_SYSTEM}')
|
|
|
|
variables_file.write(INCLUDE_VARIABLES)
|
|
|
|
|
|
|
|
nested_file = tmpdir.join('dir').join('nested')
|
|
|
|
nested_file.write(INCLUDE_NESTED, ensure=True)
|
|
|
|
|
|
|
|
input_file = tmpdir.join('input')
|
|
|
|
input_file.write(TEMPLATE_INCLUDE)
|
|
|
|
input_file.chmod(FILE_MODE)
|
|
|
|
output_file = tmpdir.join('output')
|
|
|
|
|
|
|
|
script = f"""
|
|
|
|
YADM_TEST=1 source {yadm}
|
|
|
|
set_awk
|
|
|
|
local_class="{LOCAL_CLASS}"
|
|
|
|
local_system="{LOCAL_SYSTEM}"
|
|
|
|
template_default "{input_file}" "{output_file}"
|
|
|
|
"""
|
|
|
|
run = runner(command=['bash'], inp=script)
|
|
|
|
assert run.success
|
|
|
|
assert run.err == ''
|
|
|
|
assert output_file.read() == EXPECTED_INCLUDE
|
|
|
|
assert os.stat(output_file).st_mode == os.stat(input_file).st_mode
|
2022-01-24 21:49:46 +00:00
|
|
|
|
|
|
|
|
|
|
|
def test_env(runner, yadm, tmpdir):
|
|
|
|
"""Test env"""
|
|
|
|
|
|
|
|
input_file = tmpdir.join('input')
|
|
|
|
input_file.write('{{env.PWD}}', ensure=True)
|
|
|
|
input_file.chmod(FILE_MODE)
|
|
|
|
output_file = tmpdir.join('output')
|
|
|
|
|
|
|
|
script = f"""
|
|
|
|
YADM_TEST=1 source {yadm}
|
|
|
|
set_awk
|
|
|
|
template_default "{input_file}" "{output_file}"
|
|
|
|
"""
|
|
|
|
run = runner(command=['bash'], inp=script)
|
|
|
|
assert run.success
|
|
|
|
assert run.err == ''
|
2022-01-25 20:19:09 +00:00
|
|
|
assert output_file.read().strip() == os.environ['PWD']
|