-
Notifications
You must be signed in to change notification settings - Fork 1.6k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
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`.
- Loading branch information
Showing
3 changed files
with
90 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,2 @@ | ||
minor_changes: | ||
- dconf - parse GVariants for equality comparison when the Python module ``gi.repository`` is available (https://github.com/ansible-collections/community.general/pull/6049). |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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 |