mirror of
https://github.com/ansible-collections/community.general.git
synced 2025-04-27 04:41:26 -07:00
[PR #6049/627371e2 backport][stable-6] dconf: Check for changes properly despite style of quotes used by user (#6145)
dconf: Check for changes properly despite style of quotes used by user (#6049)
dconf: parse GVariant values to check for equality whenever possible
Direct string comparisons are an inaccurate way to compare two
GVariant representations. For example, 'foo' and "foo" (including the
quote marks, which are part of the representation) are equal GVariants
but if you just do a string compare (remember, including the quotes)
they'll be interpreted.
We therefore want to use the `gi.repository` Python library to parse
GVariant representations before comparing them whenever possible.
However, we don't want to assume that this library will always be
available or require it for Ansible to function, so we use a straight
string comparison as a fallback when the library isn't available. This
may result in some false positives, i.e., Ansible thinking a value is
changing when it actually isn't, but will not result in incorrect
values being written into `dconf`.
Co-authored-by: Jonathan Kamens <jik@jik5.kamens.us>
(cherry picked from commit 627371e2d8
)
Co-authored-by: Jonathan Kamens <jik@kamens.us>
This commit is contained in:
parent
6057c3c7c4
commit
186b4200f6
3 changed files with 90 additions and 1 deletions
44
tests/unit/plugins/modules/test_dconf.py
Normal file
44
tests/unit/plugins/modules/test_dconf.py
Normal file
|
@ -0,0 +1,44 @@
|
|||
# Copyright (c) 2023 Ansible Project
|
||||
# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or
|
||||
# https://www.gnu.org/licenses/gpl-3.0.txt)
|
||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
from __future__ import (absolute_import, division, print_function)
|
||||
__metaclass__ = type
|
||||
|
||||
import pytest
|
||||
|
||||
from ansible_collections.community.general.plugins.modules import dconf
|
||||
|
||||
try:
|
||||
from gi.repository.GLib import Variant
|
||||
except ImportError:
|
||||
Variant = None
|
||||
|
||||
DconfPreference = dconf.DconfPreference
|
||||
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
"v1,v2,expected,fallback_expected",
|
||||
(("'foo'", "'foo'", True, True),
|
||||
('"foo"', "'foo'", True, False),
|
||||
("'foo'", '"foo"', True, False),
|
||||
("'foo'", '"bar"', False, False),
|
||||
("[1, 2, 3]", "[1, 2, 3]", True, True),
|
||||
("[1, 2, 3]", "[3, 2, 1]", False, False),
|
||||
('1234', '1234', True, True),
|
||||
('1234', '1235', False, False),
|
||||
('1.0', '1.0', True, True),
|
||||
('1.000', '1.0', True, False),
|
||||
('2.0', '4.0', False, False),
|
||||
# GVariants with different types aren't equal!
|
||||
('1', '1.0', False, False),
|
||||
# Explicit types
|
||||
('@as []', '[]', True, False),
|
||||
))
|
||||
def test_gvariant_equality(mocker, v1, v2, expected, fallback_expected):
|
||||
assert DconfPreference.variants_are_equal(v1, v2) is \
|
||||
(expected if Variant else fallback_expected)
|
||||
mocker.patch.object(dconf, 'Variant', None)
|
||||
mocker.patch.object(dconf, "GError", AttributeError)
|
||||
assert DconfPreference.variants_are_equal(v1, v2) is fallback_expected
|
Loading…
Add table
Add a link
Reference in a new issue