Exemple #1
0
def test_class_case(runner, yadm_y, paths, tst_sys, suffix):
    """Test range of class cases"""

    # set the class
    utils.set_local(paths, 'class', suffix)

    # create files
    endings = [suffix]
    if tst_sys == 'Linux':
        # Only create all of these side-by-side on Linux, which is
        # unquestionably case-sensitive. This would break tests on
        # case-insensitive systems.
        endings = ['AAA', 'ZZZ', 'aaa', 'zzz']
    for ending in endings:
        utils.create_alt_files(paths, f'##{ending}')

    # run alt to trigger linking
    run = runner(yadm_y('alt'))
    assert run.success
    assert run.err == ''
    linked = linked_list(run.out)

    # assert the proper linking has occurred
    for file_path in TEST_PATHS:
        source_file = file_path + f'##{suffix}'
        assert paths.work.join(file_path).islink()
        target = py.path.local(paths.work.join(file_path).readlink())
        if target.isfile():
            assert paths.work.join(file_path).read() == source_file
            assert str(paths.work.join(source_file)) in linked
        else:
            assert paths.work.join(file_path).join(
                utils.CONTAINED).read() == source_file
            assert str(paths.work.join(source_file)) in linked
Exemple #2
0
def test_alt_conditions(runner, paths, tst_sys, tst_distro, tst_host, tst_user,
                        suffix):
    """Test conditions supported by yadm alt"""
    yadm_dir = setup_standard_yadm_dir(paths)

    # set the class
    tst_class = 'testclass'
    utils.set_local(paths, 'class', tst_class)

    suffix = string.Template(suffix).substitute(
        tst_sys=tst_sys,
        tst_distro=tst_distro,
        tst_class=tst_class,
        tst_host=tst_host,
        tst_user=tst_user,
    )

    utils.create_alt_files(paths, suffix)
    run = runner([paths.pgm, '-Y', yadm_dir, 'alt'])
    assert run.success
    assert run.err == ''
    linked = utils.parse_alt_output(run.out)

    for link_path in TEST_PATHS:
        source_file = link_path + suffix
        assert paths.work.join(link_path).islink()
        target = py.path.local(os.path.realpath(paths.work.join(link_path)))
        if target.isfile():
            assert paths.work.join(link_path).read() == source_file
            assert str(paths.work.join(source_file)) in linked
        else:
            assert paths.work.join(link_path).join(
                utils.CONTAINED).read() == source_file
            assert str(paths.work.join(source_file)) in linked
Exemple #3
0
def test_alt(runner, yadm_y, paths, tst_sys, tst_host, tst_user, tracked,
             encrypt, exclude, precedence_index):
    """Test alternate linking

    This test is done by iterating for the number of templates in PRECEDENCE.
    With each iteration, another file is left off the list. So with each
    iteration, the template with the "highest precedence" is left out. The file
    using the highest precedence should be the one linked.
    """

    # set the class
    tst_class = 'testclass'
    utils.set_local(paths, 'class', tst_class)

    # process the templates in PRECEDENCE
    precedence = list()
    for template in PRECEDENCE:
        precedence.append(
            string.Template(template).substitute(
                tst_class=tst_class,
                tst_host=tst_host,
                tst_sys=tst_sys,
                tst_user=tst_user,
            ))

    # create files using a subset of files
    for suffix in precedence[0:precedence_index + 1]:
        utils.create_alt_files(paths,
                               suffix,
                               tracked=tracked,
                               encrypt=encrypt,
                               exclude=exclude)

    # run alt to trigger linking
    env = os.environ.copy()
    env['YADM_COMPATIBILITY'] = '1'
    run = runner(yadm_y('alt'), env=env)
    assert run.success
    assert run.err == ''
    linked = utils.parse_alt_output(run.out)

    # assert the proper linking has occurred
    for file_path in TEST_PATHS:
        source_file = file_path + precedence[precedence_index]
        if tracked or (encrypt and not exclude):
            assert paths.work.join(file_path).islink()
            target = py.path.local(os.path.realpath(
                paths.work.join(file_path)))
            if target.isfile():
                assert paths.work.join(file_path).read() == source_file
                assert str(paths.work.join(source_file)) in linked
            else:
                assert paths.work.join(file_path).join(
                    utils.CONTAINED).read() == source_file
                assert str(paths.work.join(source_file)) in linked
        else:
            assert not paths.work.join(file_path).exists()
            assert str(paths.work.join(source_file)) not in linked
Exemple #4
0
def test_jinja(runner, yadm_y, paths, tst_sys, tst_host, tst_user, tst_distro,
               tracked, encrypt, exclude, envtpl_present):
    """Test jinja processing"""

    if not envtpl_present:
        pytest.skip('Unable to test without envtpl.')

    jinja_suffix = '##yadm.j2'

    # set the class
    tst_class = 'testclass'
    utils.set_local(paths, 'class', tst_class)

    template = ('j2-{{ YADM_CLASS }}-'
                '{{ YADM_OS }}-{{ YADM_HOSTNAME }}-'
                '{{ YADM_USER }}-{{ YADM_DISTRO }}'
                '-{%- '
                f"include '{utils.INCLUDE_FILE}'"
                ' -%}')
    expected = (f'j2-{tst_class}-'
                f'{tst_sys}-{tst_host}-'
                f'{tst_user}-{tst_distro}'
                f'-{utils.INCLUDE_CONTENT}')

    utils.create_alt_files(paths,
                           jinja_suffix,
                           content=template,
                           tracked=tracked,
                           encrypt=encrypt,
                           exclude=exclude,
                           includefile=True)

    # run alt to trigger linking
    env = os.environ.copy()
    env['YADM_COMPATIBILITY'] = '1'
    run = runner(yadm_y('alt'), env=env)
    assert run.success
    assert run.err == ''
    created = utils.parse_alt_output(run.out, linked=False)

    # assert the proper creation has occurred
    for file_path in (utils.ALT_FILE1, utils.ALT_FILE2):
        source_file = file_path + jinja_suffix
        if tracked or (encrypt and not exclude):
            assert paths.work.join(file_path).isfile()
            lines = paths.work.join(file_path).readlines(cr=False)
            assert lines[0] == source_file
            assert lines[1] == expected
            assert str(paths.work.join(source_file)) in created
        else:
            assert not paths.work.join(file_path).exists()
            assert str(paths.work.join(source_file)) not in created
Exemple #5
0
def test_invalid_links_removed(runner, yadm_y, paths):
    """Links to invalid alternative files are removed

    This test ensures that when an already linked alternative becomes invalid
    due to a change in class, the alternate link is removed.
    """

    # set the class
    tst_class = 'testclass'
    utils.set_local(paths, 'class', tst_class)

    # create files which match the test class
    utils.create_alt_files(paths, f'##{tst_class}')

    # run alt to trigger linking
    env = os.environ.copy()
    env['YADM_COMPATIBILITY'] = '1'
    run = runner(yadm_y('alt'), env=env)
    assert run.success
    assert run.err == ''
    linked = utils.parse_alt_output(run.out)

    # assert the proper linking has occurred
    for file_path in TEST_PATHS:
        source_file = file_path + '##' + tst_class
        assert paths.work.join(file_path).islink()
        target = py.path.local(os.path.realpath(paths.work.join(file_path)))
        if target.isfile():
            assert paths.work.join(file_path).read() == source_file
            assert str(paths.work.join(source_file)) in linked
        else:
            assert paths.work.join(file_path).join(
                utils.CONTAINED).read() == source_file
            assert str(paths.work.join(source_file)) in linked

    # change the class so there are no valid alternates
    utils.set_local(paths, 'class', 'changedclass')

    # run alt to trigger linking
    env = os.environ.copy()
    env['YADM_COMPATIBILITY'] = '1'
    run = runner(yadm_y('alt'), env=env)
    assert run.success
    assert run.err == ''
    linked = utils.parse_alt_output(run.out)

    # assert the linking is removed
    for file_path in TEST_PATHS:
        source_file = file_path + '##' + tst_class
        assert not paths.work.join(file_path).exists()
        assert str(paths.work.join(source_file)) not in linked
Exemple #6
0
def test_local_override(runner, yadm_y, paths,
                        tst_sys, tst_host, tst_user):
    """Test local overrides"""

    # define local overrides
    utils.set_local(paths, 'class', 'or-class')
    utils.set_local(paths, 'hostname', 'or-hostname')
    utils.set_local(paths, 'os', 'or-os')
    utils.set_local(paths, 'user', 'or-user')

    # create files, the first would normally be the most specific version
    # however, the second is the overridden version which should be preferred.
    utils.create_alt_files(
        paths, f'##or-class.{tst_sys}.{tst_host}.{tst_user}')
    utils.create_alt_files(
        paths, '##or-class.or-os.or-hostname.or-user')

    # run alt to trigger linking
    run = runner(yadm_y('alt'))
    assert run.success
    assert run.err == ''
    linked = linked_list(run.out)

    # assert the proper linking has occurred
    for file_path in TEST_PATHS:
        source_file = file_path + '##or-class.or-os.or-hostname.or-user'
        assert paths.work.join(file_path).islink()
        target = py.path.local(paths.work.join(file_path).readlink())
        if target.isfile():
            assert paths.work.join(file_path).read() == source_file
            assert str(paths.work.join(source_file)) in linked
        else:
            assert paths.work.join(file_path).join(
                utils.CONTAINED).read() == source_file
            assert str(paths.work.join(source_file)) in linked
Exemple #7
0
def test_local_override(runner, yadm_y, paths, tst_distro, envtpl_present):
    """Test local overrides"""
    if not envtpl_present:
        pytest.skip('Unable to test without envtpl.')

    # define local overrides
    utils.set_local(paths, 'class', 'or-class')
    utils.set_local(paths, 'hostname', 'or-hostname')
    utils.set_local(paths, 'os', 'or-os')
    utils.set_local(paths, 'user', 'or-user')

    template = ('j2-{{ YADM_CLASS }}-'
                '{{ YADM_OS }}-{{ YADM_HOSTNAME }}-'
                '{{ YADM_USER }}-{{ YADM_DISTRO }}')
    expected = f'j2-or-class-or-os-or-hostname-or-user-{tst_distro}'

    utils.create_alt_files(paths, '##yadm.j2', content=template)

    # run alt to trigger linking
    run = runner(yadm_y('alt'))
    assert run.success
    assert run.err == ''
    created = created_list(run.out)

    # assert the proper creation has occurred
    for file_path in (utils.ALT_FILE1, utils.ALT_FILE2):
        source_file = file_path + '##yadm.j2'
        assert paths.work.join(file_path).isfile()
        lines = paths.work.join(file_path).readlines(cr=False)
        assert lines[0] == source_file
        assert lines[1] == expected
        assert str(paths.work.join(source_file)) in created
def test_set_local_alt_values(runner, yadm, paths, tst_sys, tst_host, tst_user,
                              override):
    """Use issue_legacy_path_warning"""
    script = f"""
        YADM_TEST=1 source {yadm} &&
        set_operating_system &&
        YADM_DIR={paths.yadm} YADM_DATA={paths.data} configure_paths &&
        set_local_alt_values
        echo "class='$local_class'"
        echo "os='$local_system'"
        echo "host='$local_host'"
        echo "user='******'"
    """

    if override:
        utils.set_local(paths, override, 'override')

    run = runner(command=['bash'], inp=script)
    assert run.success
    assert run.err == ''

    if override == 'class':
        assert "class='override'" in run.out
    else:
        assert "class=''" in run.out

    if override == 'os':
        assert "os='override'" in run.out
    else:
        assert f"os='{tst_sys}'" in run.out

    if override == 'hostname':
        assert "host='override'" in run.out
    else:
        assert f"host='{tst_host}'" in run.out

    if override == 'user':
        assert "user='******'" in run.out
    else:
        assert f"user='******'" in run.out
Exemple #9
0
def test_local_override(runner, yadm_y, paths, tst_distro, envtpl_present):
    """Test local overrides"""
    if not envtpl_present:
        pytest.skip('Unable to test without envtpl.')

    # define local overrides
    utils.set_local(paths, 'class', 'or-class')
    utils.set_local(paths, 'hostname', 'or-hostname')
    utils.set_local(paths, 'os', 'or-os')
    utils.set_local(paths, 'user', 'or-user')

    template = ('j2-{{ YADM_CLASS }}-'
                '{{ YADM_OS }}-{{ YADM_HOSTNAME }}-'
                '{{ YADM_USER }}-{{ YADM_DISTRO }}'
                '-{%- '
                f"include '{utils.INCLUDE_FILE}'"
                ' -%}')
    expected = (f'j2-or-class-or-os-or-hostname-or-user-{tst_distro}'
                f'-{utils.INCLUDE_CONTENT}')

    utils.create_alt_files(paths,
                           '##yadm.j2',
                           content=template,
                           includefile=True)

    # os.system(f'find {paths.work}' + ' -name *j2 -ls -exec cat \'{}\' ";"')
    # os.system(f'find {paths.work}')
    # run alt to trigger linking
    env = os.environ.copy()
    env['YADM_COMPATIBILITY'] = '1'
    run = runner(yadm_y('alt'), env=env)
    assert run.success
    assert run.err == ''
    created = utils.parse_alt_output(run.out, linked=False)

    # assert the proper creation has occurred
    for file_path in (utils.ALT_FILE1, utils.ALT_FILE2):
        source_file = file_path + '##yadm.j2'
        assert paths.work.join(file_path).isfile()
        lines = paths.work.join(file_path).readlines(cr=False)
        assert lines[0] == source_file
        assert lines[1] == expected
        assert str(paths.work.join(source_file)) in created
Exemple #10
0
def test_wild(request, runner, yadm_y, paths,
              tst_sys, tst_host, tst_user,
              tracked, encrypt,
              wild_class, wild_host, wild_sys, wild_user,
              template):
    """Test wild linking

    These tests are done by creating permutations of the possible files using
    WILD_TEMPLATES. Each case is then tested (while skipping the already tested
    permutations for efficiency).
    """

    if request.node.name in BROKEN_TEST_IDS:
        pytest.xfail(
            'This test is known to be broken. '
            'This bug needs to be fixed.')

    tst_class = 'testclass'

    # determine the "wild" version of the suffix
    str_class = '%' if wild_class else tst_class
    str_host = '%' if wild_host else tst_host
    str_sys = '%' if wild_sys else tst_sys
    str_user = '******' if wild_user else tst_user
    wild_suffix = string.Template(template).substitute(
        tst_class=str_class,
        tst_host=str_host,
        tst_sys=str_sys,
        tst_user=str_user,
    )

    # determine the "standard" version of the suffix
    std_suffix = string.Template(template).substitute(
        tst_class=tst_class,
        tst_host=tst_host,
        tst_sys=tst_sys,
        tst_user=tst_user,
    )

    # skip over duplicate tests (this seems to be the simplest way to cover the
    # permutations of tests, while skipping duplicates.)
    test_key = f'{tracked}{encrypt}{wild_suffix}{std_suffix}'
    if test_key in WILD_TESTED:
        return
    WILD_TESTED.add(test_key)

    # set the class
    utils.set_local(paths, 'class', tst_class)

    # create files using the wild suffix
    utils.create_alt_files(paths, wild_suffix, tracked=tracked,
                           encrypt=encrypt, exclude=False)

    # run alt to trigger linking
    run = runner(yadm_y('alt'))
    assert run.success
    assert run.err == ''
    linked = linked_list(run.out)

    # assert the proper linking has occurred
    for file_path in TEST_PATHS:
        source_file = file_path + wild_suffix
        assert paths.work.join(file_path).islink()
        target = py.path.local(paths.work.join(file_path).readlink())
        if target.isfile():
            assert paths.work.join(file_path).read() == source_file
            assert str(paths.work.join(source_file)) in linked
        else:
            assert paths.work.join(file_path).join(
                utils.CONTAINED).read() == source_file
            assert str(paths.work.join(source_file)) in linked

    # create files using the standard suffix
    utils.create_alt_files(paths, std_suffix, tracked=tracked,
                           encrypt=encrypt, exclude=False)

    # run alt to trigger linking
    run = runner(yadm_y('alt'))
    assert run.success
    assert run.err == ''
    linked = linked_list(run.out)

    # assert the proper linking has occurred
    for file_path in TEST_PATHS:
        source_file = file_path + std_suffix
        assert paths.work.join(file_path).islink()
        target = py.path.local(paths.work.join(file_path).readlink())
        if target.isfile():
            assert paths.work.join(file_path).read() == source_file
            assert str(paths.work.join(source_file)) in linked
        else:
            assert paths.work.join(file_path).join(
                utils.CONTAINED).read() == source_file
            assert str(paths.work.join(source_file)) in linked