ansible/test/units/module_utils/basic/test_get_file_attributes.py
Rick Elrod 5cd489af06
Let get_file_attributes() work without lsattr -v (#71845)
* Let get_file_attributes() work without `lsattr -v`

Change:
- module_utils's get_file_attributes() expects `lsattr -v` to work, but
  in some cases, it may not.
- The function now takes an optional include_version bool parameter,
  which removes this expectation.
- Places where we call get_file_attributes() without using the 'version'
  it returns, we now call it with include_version=False.

Test Plan:
- New unit tests

Signed-off-by: Rick Elrod <rick@elrod.me>
2020-09-22 16:15:47 -05:00

75 lines
2.6 KiB
Python

# -*- coding: utf-8 -*-
# Copyright:
# (c) 2017, Pierre-Louis Bonicoli <pierre-louis@libregerbil.fr>
# License: GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
# Make coding more python3-ish
from __future__ import (absolute_import, division, print_function)
__metaclass__ = type
from itertools import product
from ansible.module_utils.basic import AnsibleModule
import pytest
DATA = (
(
'3353595900 --------------e---- /usr/lib32',
{'attr_flags': 'e', 'version': '3353595900', 'attributes': ['extents']}
),
# with e2fsprogs < 1.43, output isn't aligned
(
'78053594 -----------I--e---- /usr/lib',
{'attr_flags': 'Ie', 'version': '78053594', 'attributes': ['indexed', 'extents']}
),
(
'15711607 -------A------e---- /tmp/test',
{'attr_flags': 'Ae', 'version': '15711607', 'attributes': ['noatime', 'extents']}
),
# with e2fsprogs >= 1.43, output is aligned
(
'78053594 -----------I--e---- /usr/lib',
{'attr_flags': 'Ie', 'version': '78053594', 'attributes': ['indexed', 'extents']}
),
(
'15711607 -------A------e---- /tmp/test',
{'attr_flags': 'Ae', 'version': '15711607', 'attributes': ['noatime', 'extents']}
),
)
NO_VERSION_DATA = (
(
'--------------e---- /usr/lib32',
{'attr_flags': 'e', 'attributes': ['extents']}
),
(
'-----------I--e---- /usr/lib',
{'attr_flags': 'Ie', 'attributes': ['indexed', 'extents']}
),
(
'-------A------e---- /tmp/test',
{'attr_flags': 'Ae', 'attributes': ['noatime', 'extents']}
),
)
@pytest.mark.parametrize('stdin, data', product(({},), DATA), indirect=['stdin'])
def test_get_file_attributes(am, stdin, mocker, data):
# Test #18731
mocker.patch.object(AnsibleModule, 'get_bin_path', return_value=(0, '/usr/bin/lsattr', ''))
mocker.patch.object(AnsibleModule, 'run_command', return_value=(0, data[0], ''))
result = am.get_file_attributes('/path/to/file')
for key, value in data[1].items():
assert key in result and result[key] == value
@pytest.mark.parametrize('stdin, data', product(({},), NO_VERSION_DATA), indirect=['stdin'])
def test_get_file_attributes_no_version(am, stdin, mocker, data):
# Test #18731
mocker.patch.object(AnsibleModule, 'get_bin_path', return_value=(0, '/usr/bin/lsattr', ''))
mocker.patch.object(AnsibleModule, 'run_command', return_value=(0, data[0], ''))
result = am.get_file_attributes('/path/to/file', include_version=False)
for key, value in data[1].items():
assert key in result and result[key] == value