mirror of
https://github.com/ansible-collections/community.general.git
synced 2024-09-14 20:13:21 +02:00
627371e2d8
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>
44 lines
1.5 KiB
Python
44 lines
1.5 KiB
Python
# 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
|