def test_generate_device_factory_permissions(self):
        """Test GenerateDeviceFactoryPermissions."""
        dev1 = DiskDevice("dev1",
                          fmt=get_format("disklabel"),
                          size=Size("10 GiB"),
                          exists=True)
        dev2 = PartitionDevice("dev2",
                               size=Size("5 GiB"),
                               parents=[dev1],
                               fmt=get_format("ext4",
                                              mountpoint="/",
                                              label="root"))

        self._add_device(dev1)
        self._add_device(dev2)

        request = self.interface.GenerateDeviceFactoryRequest("dev1")
        permissions = self.interface.GenerateDeviceFactoryPermissions(request)
        assert get_native(permissions) == {
            'mount-point': False,
            'reformat': False,
            'format-type': True,
            'label': False,
            'device-type': False,
            'device-name': False,
            'device-size': False,
            'device-encrypted': True,
            'device-raid-level': False,
            'disks': False,
            'container-spec': False,
            'container-name': False,
            'container-size-policy': False,
            'container-encrypted': False,
            'container-raid-level': False,
        }

        request = self.interface.GenerateDeviceFactoryRequest("dev2")
        permissions = self.interface.GenerateDeviceFactoryPermissions(request)
        assert get_native(permissions) == {
            'mount-point': True,
            'reformat': False,
            'format-type': True,
            'label': True,
            'device-type': True,
            'device-name': False,
            'device-size': True,
            'device-encrypted': True,
            'device-raid-level': True,
            'disks': True,
            'container-spec': False,
            'container-name': False,
            'container-size-policy': False,
            'container-encrypted': False,
            'container-raid-level': False,
        }

        dev2.protected = True
        permissions = self.interface.GenerateDeviceFactoryPermissions(request)
        for value in get_native(permissions).values():
            assert value is False
示例#2
0
    def test_get_native_complicated_structure(self):
        data = self.ComplicatedData.from_structure({
            'dictionary': get_variant(
                Dict[Int, Str], {1: "1", 2: "2"}
            ),
            'bool-list': get_variant(
                List[Bool], [True, False, False]
            ),
            'very-long-property-name': get_variant(
                Str, "My String Value"
            )
        })

        structure = self.ComplicatedData.to_structure(
            data
        )

        dictionary = {
            'dictionary': {1: "1", 2: "2"},
            'bool-list': [True, False, False],
            'very-long-property-name': "My String Value"
        }

        self.assertEqual(get_native(structure), dictionary)
        self.assertEqual(get_native(dictionary), dictionary)
    def collect_supported_systems_test(self, update_size_info):
        """Test CollectSupportedSystems."""
        dev1 = DiskDevice("dev1", fmt=get_format("disklabel"))
        dev2 = StorageDevice(
            "dev2",
            parents=[dev1],
            fmt=get_format("ext4", mountpoint="/", exists=True),
        )
        dev3 = StorageDevice("dev3",
                             parents=[dev1],
                             fmt=get_format("swap", exists=True))

        self._add_device(dev1)
        self._add_device(dev2)
        self._add_device(dev3)

        self.storage.roots = [
            Root(name="My Linux", mounts={"/": dev2}, swaps=[dev3])
        ]

        os_data_list = self.interface.CollectSupportedSystems()
        self.assertEqual(get_native(os_data_list), [{
            'os-name': 'My Linux',
            'mount-points': {
                '/': 'dev2'
            },
            'swap-devices': ['dev3']
        }])
示例#4
0
    def get_rhsm_config_defaults(self):
        """Return RHSM config default values.

        We need to have these available in case the user decides
        to return to default values from a custom value at
        runtime.

        This method is lazy evaluated, the first call it fetches
        the full config dict from RHSM and subsequent calls are
        then served from cache.

        Due to this it is important not to set RHSM configuration
        values before first calling this method to populate the cache
        or else the method might return non-default (Anaconda overwritten)
        data.

        NOTE: While RHSM GetAll() DBus call returns a nested dictionary,
              we turn it into a flat key/value dict, in the same format SetAll()
              uses.

        :return : dictionary of default RHSM configuration values
        :rtype: dict
        """
        if self._rhsm_config_defaults is None:
            # config defaults cache not yet populated, do it now
            proxy = self.rhsm_observer.get_proxy(RHSM_CONFIG)
            # turn the variant into a dict with get_native()
            nested_dict = get_native(proxy.GetAll(""))
            # flatten the nested dict
            flat_dict = self._flatten_rhsm_nested_dict(nested_dict)
            self._rhsm_config_defaults = flat_dict
        return self._rhsm_config_defaults
    def generate_device_factory_request_test(self):
        """Test GenerateDeviceFactoryRequest."""
        dev1 = DiskDevice("dev1")
        dev2 = PartitionDevice("dev2",
                               size=Size("5 GiB"),
                               parents=[dev1],
                               fmt=get_format("ext4",
                                              mountpoint="/",
                                              label="root"))

        self._add_device(dev1)
        self._add_device(dev2)

        request = self.interface.GenerateDeviceFactoryRequest("dev2")
        self.assertEqual(
            get_native(request), {
                'device-spec': 'dev2',
                'disks': ['dev1'],
                'mount-point': '/',
                'reformat': True,
                'format-type': 'ext4',
                'label': 'root',
                'luks-version': '',
                'device-type': DEVICE_TYPE_PARTITION,
                'device-name': 'dev2',
                'device-size': Size("5 GiB").get_bytes(),
                'device-encrypted': False,
                'device-raid-level': '',
                'container-name': '',
                'container-size-policy': SIZE_POLICY_AUTO,
                'container-encrypted': False,
                'container-raid-level': '',
            })
示例#6
0
    def realm_property_test(self):
        """Test the realm property."""
        realm_in = {
            "name": "domain.example.com",
            "discover-options": ["--client-software=sssd"],
            "join-options": ["--one-time-password=password"],
            "discovered": True
        }

        realm_out = {
            "name":
            get_variant(Str, "domain.example.com"),
            "discover-options":
            get_variant(List[Str], ["--client-software=sssd"]),
            "join-options":
            get_variant(List[Str], ["--one-time-password=password"]),
            "discovered":
            get_variant(Bool, True),
            "required-packages":
            get_variant(List[Str], [])
        }

        self.security_interface.SetRealm(realm_in)
        self.assertEqual(realm_out, self.security_interface.Realm)
        self.callback.assert_called_once_with(SECURITY.interface_name,
                                              {'Realm': get_native(realm_out)},
                                              [])
    def test_generate_device_factory_permissions_btrfs(self):
        """Test GenerateDeviceFactoryPermissions with btrfs."""
        dev1 = StorageDevice("dev1",
                             fmt=get_format("btrfs"),
                             size=Size("10 GiB"))
        dev2 = BTRFSVolumeDevice("dev2", size=Size("5 GiB"), parents=[dev1])

        self._add_device(dev1)
        self._add_device(dev2)

        # Make the btrfs format not mountable.
        with patch.object(BTRFS,
                          "_mount_class",
                          return_value=Mock(available=False)):
            request = self.interface.GenerateDeviceFactoryRequest(dev2.name)
            permissions = self.interface.GenerateDeviceFactoryPermissions(
                request)

        assert get_native(permissions) == {
            'mount-point': False,
            'reformat': False,
            'format-type': False,
            'label': False,
            'device-type': True,
            'device-name': False,
            'device-size': False,
            'device-encrypted': False,
            'device-raid-level': True,
            'disks': False,
            'container-spec': False,
            'container-name': True,
            'container-size-policy': True,
            'container-encrypted': True,
            'container-raid-level': True,
        }
示例#8
0
def run_network_initialization_task(task_path):
    """Run network initialization task and log the result."""
    task_proxy = NETWORK.get_proxy(task_path)
    log.debug("Running task %s", task_proxy.Name)
    sync_run_task(task_proxy)
    result = get_native(task_proxy.GetResult())
    msg = "%s result: %s" % (task_proxy.Name, result)
    log.debug(msg)
    def generate_device_factory_permissions_test(self):
        """Test GenerateDeviceFactoryPermissions."""
        dev1 = DiskDevice("dev1",
                          fmt=get_format("disklabel"),
                          size=Size("10 GiB"),
                          exists=True)
        dev2 = PartitionDevice("dev2",
                               size=Size("5 GiB"),
                               parents=[dev1],
                               fmt=get_format("ext4",
                                              mountpoint="/",
                                              label="root"))

        self._add_device(dev1)
        self._add_device(dev2)

        request = self.interface.GenerateDeviceFactoryRequest("dev1")
        permissions = self.interface.GenerateDeviceFactoryPermissions(request)
        self.assertEqual(
            get_native(permissions), {
                'mount-point': False,
                'reformat': True,
                'format-type': True,
                'label': True,
                'device-type': False,
                'device-name': False,
                'device-size': False,
                'device-encrypted': True,
                'device-raid-level': False,
            })

        request = self.interface.GenerateDeviceFactoryRequest("dev2")
        permissions = self.interface.GenerateDeviceFactoryPermissions(request)
        self.assertEqual(
            get_native(permissions), {
                'mount-point': True,
                'reformat': False,
                'format-type': True,
                'label': True,
                'device-type': True,
                'device-name': False,
                'device-size': True,
                'device-encrypted': True,
                'device-raid-level': True,
            })
    def _check_report(self, report, error_message=None):
        """Check the given validation report."""
        errors = [error_message] if error_message else []
        warnings = []

        self.assertEqual(get_native(report), {
            "error-messages": errors,
            "warning-messages": warnings
        })
示例#11
0
    def _test_native(self, variants, values):
        """Test native values of variants."""
        for variant, value in zip(variants, values):
            self.assertEqual(get_native(variant), value)

        self.assertEqual(get_native(tuple(variants)), tuple(values))
        self.assertEqual(get_native(list(variants)), list(values))
        self.assertEqual(get_native(dict(enumerate(variants))),
                         dict(enumerate(values)))

        variant = get_variant(Tuple[Variant, Variant, Variant, Variant],
                              tuple(variants))
        self.assertEqual(unwrap_variant(variant), tuple(variants))

        variant = get_variant(List[Variant], list(variants))
        self.assertEqual(unwrap_variant(variant), list(variants))

        variant = get_variant(Dict[Int, Variant], dict(enumerate(variants)))
        self.assertEqual(unwrap_variant(variant), dict(enumerate(variants)))
示例#12
0
    def _test_variant(self, type_hint, expected_string, value):
        """Create a variant."""
        # Create a variant from a type hint.
        v1 = get_variant(type_hint, value)
        self.assertTrue(isinstance(v1, Variant))
        self.assertEqual(v1.format_string, expected_string)
        self.assertEqual(v1.unpack(), value)
        self.assertEqual(unwrap_variant(v1), value)

        v2 = Variant(expected_string, value)
        self.assertTrue(v2.equal(v1))

        self.assertEqual(get_native(v1), value)
        self.assertEqual(get_native(v1), get_native(v2))
        self.assertEqual(get_native(value), value)

        # Create a variant from a type string.
        v3 = get_variant(expected_string, value)
        self.assertTrue(isinstance(v3, Variant))
        self.assertTrue(v2.equal(v3))
示例#13
0
    def generate_system_data_test(self):
        """Test GenerateSystemData."""
        self._add_device(StorageDevice("dev1", fmt=get_format("ext4", mountpoint="/boot")))
        self._add_device(StorageDevice("dev2", fmt=get_format("ext4", mountpoint="/")))
        self._add_device(StorageDevice("dev3", fmt=get_format("swap")))

        os_data = self.interface.GenerateSystemData("dev1")
        self.assertEqual(get_native(os_data), {
            'mount-points': {'/boot': 'dev1', '/': 'dev2'},
            'os-name': 'New anaconda bluesky Installation',
            'swap-devices': ['dev3']
        })
示例#14
0
 def test_system_purpose_json_parsing(self):
     """Test the system purpose JSON parsing method of ParseAttachedSubscriptionsTask."""
     parse_method = ParseAttachedSubscriptionsTask._parse_system_purpose_json
     # the parsing method should be able to survive also getting an empty string
     expected_struct = {"role": "", "sla": "", "usage": "", "addons": []}
     struct = get_native(SystemPurposeData.to_structure(parse_method("")))
     self.assertEqual(struct, expected_struct)
     # try parsing expected complete system purpose data
     system_purpose_dict = {
         "role": "important",
         "service_level_agreement": "it will work just fine",
         "usage": "careful",
         "addons": ["red", "green", "blue"]
     }
     system_purpose_json = json.dumps(system_purpose_dict)
     expected_struct = {
         "role": "important",
         "sla": "it will work just fine",
         "usage": "careful",
         "addons": ["red", "green", "blue"]
     }
     struct = get_native(
         SystemPurposeData.to_structure(parse_method(system_purpose_json)))
     self.assertEqual(struct, expected_struct)
     # try also partial parsing, just in case
     system_purpose_dict = {
         "role": "important",
         "usage": "careful",
     }
     system_purpose_json = json.dumps(system_purpose_dict)
     expected_struct = {
         "role": "important",
         "sla": "",
         "usage": "careful",
         "addons": []
     }
     struct = get_native(
         SystemPurposeData.to_structure(parse_method(system_purpose_json)))
     self.assertEqual(struct, expected_struct)
示例#15
0
 def subscription_json_parsing_test(self):
     """Test the subscription JSON parsing method of ParseAttachedSubscriptionsTask."""
     parse_method = ParseAttachedSubscriptionsTask._parse_subscription_json
     # the method should be able to survive the RHSM DBus API returning an empty string,
     # as empty list of subscriptions is a lesser issue than crashed installation
     self.assertEqual(parse_method(""), [])
     # try parsing a json file containing two subscriptions
     # - to make this look sane, we write it as a dict that we then convert to JSON
     subscription_dict = {
         "consumed": [{
             "subscription_name": "Foo Bar Beta",
             "service_level": "very good",
             "sku": "ABC1234",
             "contract": "12345678",
             "starts": "05/12/20",
             "ends": "05/12/21",
             "quantity_used": "1"
         }, {
             "subscription_name": "Foo Bar Beta NG",
             "service_level": "even better",
             "sku": "ABC4321",
             "contract": "87654321",
             "starts": "now",
             "ends": "never",
             "quantity_used": "1000"
         }]
     }
     subscription_json = json.dumps(subscription_dict)
     expected_structs = [{
         "name": "Foo Bar Beta",
         "service-level": "very good",
         "sku": "ABC1234",
         "contract": "12345678",
         "start-date": "May 12, 2020",
         "end-date": "May 12, 2021",
         "consumed-entitlement-count": 1
     }, {
         "name": "Foo Bar Beta NG",
         "service-level": "even better",
         "sku": "ABC4321",
         "contract": "87654321",
         "start-date": "now",
         "end-date": "never",
         "consumed-entitlement-count": 1000
     }]
     structs = get_native(
         AttachedSubscription.to_structure_list(
             parse_method(subscription_json)))
     # check the content of the AttachedSubscription corresponds to the input JSON,
     # including date formatting
     self.assertEqual(structs, expected_structs)
示例#16
0
def check_kickstart_interface(test,
                              interface,
                              ks_in,
                              ks_out=None,
                              ks_valid=True,
                              ks_tmp=None):
    """Test the parsing and generating of a kickstart module.

    :param test: instance of TestCase
    :param interface: instance of KickstartModuleInterface
    :param ks_in: string with the input kickstart
    :param ks_out: string with the output kickstart
    :param ks_valid: True if the input kickstart is valid, otherwise False
    :param ks_tmp: string with the temporary output kickstart
    """
    callback = PropertiesChangedCallback()
    interface.PropertiesChanged.connect(callback)

    # Read a kickstart,
    if ks_in is not None:
        ks_in = dedent(ks_in).strip()
        result = KickstartReport.from_structure(
            get_native(interface.ReadKickstart(ks_in)))
        test.assertEqual(ks_valid, result.is_valid())

    if not ks_valid:
        return

    if ks_out is None:
        return

    # Generate a kickstart
    ks_out = dedent(ks_out).strip()
    test.assertEqual(ks_out, interface.GenerateKickstart().strip())

    # Test the properties changed callback.
    if ks_in is not None:
        callback.assert_any_call(KICKSTART_MODULE.interface_name,
                                 {'Kickstarted': True}, [])
    else:
        test.assertEqual(interface.Kickstarted, False)
        callback.assert_not_called()

    # Test the temporary kickstart.
    if ks_tmp is None:
        return

    ks_tmp = dedent(ks_tmp).strip()
    test.assertEqual(ks_tmp, interface.GenerateTemporaryKickstart().strip())
示例#17
0
    def ReadKickstart(self, kickstart):
        """Mock parsing for now.

        Returns parse error if PARSE_ERROR string is found in kickstart.
        """
        self.kickstart = kickstart
        report = KickstartReport()

        for lnum, line in enumerate(kickstart.splitlines(), 1):
            if "PARSE_ERROR" in line:
                data = KickstartMessage()
                data.message = "Mocked parse error: \"PARSE_ERROR\" found"
                data.line_number = lnum
                report.error_messages.append(data)

        return get_native(KickstartReport.to_structure(report))
示例#18
0
def check_dbus_property(test,
                        interface_id,
                        interface,
                        property_name,
                        in_value,
                        out_value=None,
                        getter=None,
                        setter=None,
                        changed=None):
    """Check DBus property.

    :param test: instance of TestCase
    :param interface_id: instance of DBusInterfaceIdentifier
    :param interface: instance of a DBus interface
    :param property_name: a DBus property name
    :param in_value: an input value of the property
    :param out_value: an output value of the property or None
    :param getter: a property getter or None
    :param setter: a property setter or None
    :param changed: a dictionary of changed properties or None
    """
    callback = PropertiesChangedCallback()
    interface.PropertiesChanged.connect(callback)

    if out_value is None:
        out_value = in_value

    # Set the property.
    if not setter:
        setter = getattr(interface, "Set{}".format(property_name))

    setter(in_value)

    if not changed:
        changed = {property_name: out_value}

    callback.assert_called_once_with(interface_id.interface_name,
                                     get_native(changed), [])

    # Get the property.
    if not getter:
        getter = lambda: getattr(interface, property_name)

    test.assertEqual(getter(), out_value)
示例#19
0
    def setup_install_source_task_failed_to_mount_test(self, proxy_getter,
                                                       os_stat, stat, mount):
        """Test Live OS Source setup installation source task mount error."""
        device_tree = Mock()
        proxy_getter.return_value = device_tree
        device_tree.ResolveDevice = Mock()
        device_tree.ResolveDevice.return_value = "resolvedDeviceName"

        device = DeviceData()
        device.path = "/resolved/path/to/base/image"

        device_tree.GetDeviceData = Mock()
        device_tree.GetDeviceData.return_value = get_native(
            DeviceData.to_structure(device))

        mount.return_value = -20

        with self.assertRaises(SourceSetupError,
                               msg="Failed to mount the install tree"):
            SetUpLiveOSSourceTask("/path/to/base/image",
                                  "/path/to/mount/source/image").run()
示例#20
0
    def setup_install_source_task_run_test(self, proxy_getter, os_stat, stat,
                                           mount):
        """Test Live OS Source setup installation source task run."""
        device_tree = Mock()
        proxy_getter.return_value = device_tree
        device_tree.ResolveDevice = Mock()
        device_tree.ResolveDevice.return_value = "resolvedDeviceName"

        device = DeviceData()
        device.path = "/resolved/path/to/base/image"

        device_tree.GetDeviceData = Mock()
        device_tree.GetDeviceData.return_value = get_native(
            DeviceData.to_structure(device))

        mount.return_value = 0

        SetUpLiveOSSourceTask("/path/to/base/image",
                              "/path/to/mount/source/image").run()

        device_tree.ResolveDevice.assert_called_once_with(
            "/path/to/base/image")
        os_stat.assert_called_once_with("/resolved/path/to/base/image")
示例#21
0
    def setup_install_source_task_invalid_block_dev_test(
            self, proxy_getter, os_stat, stat_mock):
        """Test Live OS Source setup installation source task with invalid block device error."""
        device_tree = Mock()
        proxy_getter.return_value = device_tree
        device_tree.ResolveDevice = Mock()
        device_tree.ResolveDevice.return_value = "resolvedDeviceName"

        device = DeviceData()
        device.path = "/resolved/path/to/base/image"

        device_tree.GetDeviceData = Mock()
        device_tree.GetDeviceData.return_value = get_native(
            DeviceData.to_structure(device))

        stat_mock.S_ISBLK = Mock()
        stat_mock.S_ISBLK.return_value = False

        with self.assertRaises(
                SourceSetupError,
                msg="/path/to/base/image is not a valid block device"):
            SetUpLiveOSSourceTask("/path/to/base/image",
                                  "/path/to/mount/source/image").run()
    def generate_device_factory_permissions_btrfs_test(self):
        """Test GenerateDeviceFactoryPermissions with btrfs."""
        dev1 = StorageDevice("dev1",
                             fmt=get_format("btrfs"),
                             size=Size("10 GiB"))
        dev2 = BTRFSVolumeDevice("dev2", size=Size("5 GiB"), parents=[dev1])

        self._add_device(dev1)
        self._add_device(dev2)

        request = self.interface.GenerateDeviceFactoryRequest(dev2.name)
        permissions = self.interface.GenerateDeviceFactoryPermissions(request)
        self.assertEqual(
            get_native(permissions), {
                'mount-point': True,
                'reformat': False,
                'format-type': False,
                'label': True,
                'device-type': True,
                'device-name': False,
                'device-size': False,
                'device-encrypted': False,
                'device-raid-level': True,
            })
示例#23
0
    def validate_selected_disks_test(self):
        """Test ValidateSelectedDisks."""
        storage = create_storage()
        self.disk_selection_module.on_storage_reset(storage)

        dev1 = DiskDevice("dev1",
                          exists=False,
                          size=Size("15 GiB"),
                          fmt=get_format("disklabel"))
        dev2 = DiskDevice("dev2",
                          exists=False,
                          parents=[dev1],
                          size=Size("6 GiB"),
                          fmt=get_format("disklabel"))
        dev3 = DiskDevice("dev3",
                          exists=False,
                          parents=[dev2],
                          size=Size("6 GiB"),
                          fmt=get_format("disklabel"))
        storage.devicetree._add_device(dev1)
        storage.devicetree._add_device(dev2)
        storage.devicetree._add_device(dev3)

        report = ValidationReport.from_structure(
            get_native(self.disk_selection_interface.ValidateSelectedDisks(
                [])))

        self.assertEqual(report.is_valid(), True)

        report = ValidationReport.from_structure(
            get_native(
                self.disk_selection_interface.ValidateSelectedDisks(["dev1"])))

        self.assertEqual(report.is_valid(), False)
        self.assertEqual(report.error_messages, [
            "You selected disk dev1, which contains devices that also use "
            "unselected disks dev2, dev3. You must select or de-select "
            "these disks as a set."
        ])
        self.assertEqual(report.warning_messages, [])

        report = ValidationReport.from_structure(
            get_native(
                self.disk_selection_interface.ValidateSelectedDisks(
                    ["dev1", "dev2"])))

        self.assertEqual(report.is_valid(), False)
        self.assertEqual(report.error_messages, [
            "You selected disk dev1, which contains devices that also "
            "use unselected disk dev3. You must select or de-select "
            "these disks as a set.",
            "You selected disk dev2, which contains devices that also "
            "use unselected disk dev3. You must select or de-select "
            "these disks as a set."
        ])
        self.assertEqual(report.warning_messages, [])

        report = ValidationReport.from_structure(
            get_native(
                self.disk_selection_interface.ValidateSelectedDisks(
                    ["dev1", "dev2", "dev3"])))

        self.assertEqual(report.is_valid(), True)
示例#24
0
    def test_nested_structure(self):
        class SimpleData(DBusData):

            def __init__(self):
                self._x = 0

            @property
            def x(self) -> Int:
                return self._x

            @x.setter
            def x(self, value):
                self._x = value

        class NestedData(DBusData):

            def __init__(self):
                self._attr = SimpleData()
                self._list = []

            @property
            def attr(self) -> SimpleData:
                return self._attr

            @attr.setter
            def attr(self, value):
                self._attr = value

            @property
            def list(self) -> List[SimpleData]:
                return self._list

            @list.setter
            def list(self, value):
                self._list = value

        data = NestedData()
        expected = "NestedData(attr={'x': 0}, list=[])"
        self.assertEqual(str(data), expected)
        self.assertEqual(repr(data), expected)

        data.attr.x = -1

        for x in range(2):
            item = SimpleData()
            item.x = x
            data.list.append(item)

        expected = "NestedData(attr={'x': -1}, list=[{'x': 0}, {'x': 1}])"
        self.assertEqual(str(data), expected)
        self.assertEqual(repr(data), expected)

        self.assertEqual(NestedData.to_structure(data), {
            'attr': get_variant(Structure, {
                'x': get_variant(Int, -1)
            }),
            'list': get_variant(List[Structure], [
                {'x': get_variant(Int, 0)},
                {'x': get_variant(Int, 1)}
            ])
        })

        dictionary = {
            'attr': {'x': 10},
            'list': [{'x': 200}, {'x': 300}]
        }

        structure = {
            'attr': get_variant(Dict[Str, Variant], {
                'x': get_variant(Int, 10)
            }),
            'list': get_variant(List[Dict[Str, Variant]], [
                {'x': get_variant(Int, 200)},
                {'x': get_variant(Int, 300)}
            ])
        }

        data = NestedData.from_structure(structure)
        self.assertEqual(data.attr.x, 10)
        self.assertEqual(len(data.list), 2)
        self.assertEqual(data.list[0].x, 200)
        self.assertEqual(data.list[1].x, 300)

        structure = NestedData.to_structure(data)
        self.assertEqual(get_native(structure), dictionary)
示例#25
0
    def test_nested_structure(self):
        class SimpleData(DBusData):
            def __init__(self):
                self._x = 0

            @property
            def x(self) -> Int:
                return self._x

            @x.setter
            def x(self, value):
                self._x = value

        class SecretData(DBusData):
            def __init__(self):
                self._y = ""

            @property
            def y(self) -> Str:
                return self._y

            @y.setter
            def y(self, value):
                self._y = value

            def __repr__(self):
                return generate_string_from_data(self,
                                                 skip=["y"],
                                                 add={"y_set": bool(self.y)})

        class NestedData(DBusData):
            def __init__(self):
                self._attr = SimpleData()
                self._secret = SecretData()
                self._list = []

            @property
            def attr(self) -> SimpleData:
                return self._attr

            @attr.setter
            def attr(self, value):
                self._attr = value

            @property
            def secret(self) -> SecretData:
                return self._secret

            @secret.setter
            def secret(self, value):
                self._secret = value

            @property
            def list(self) -> List[SimpleData]:
                return self._list

            @list.setter
            def list(self, value):
                self._list = value

        data = NestedData()
        expected = \
            "NestedData(" \
            "attr=SimpleData(x=0), " \
            "list=[], " \
            "secret=SecretData(y_set=False))"

        self.assertEqual(str(data), expected)
        self.assertEqual(repr(data), expected)

        data.attr.x = -1
        data.secret.y = "SECRET"

        for x in range(2):
            item = SimpleData()
            item.x = x
            data.list.append(item)

        expected = \
            "NestedData(" \
            "attr=SimpleData(x=-1), " \
            "list=[SimpleData(x=0), SimpleData(x=1)], " \
            "secret=SecretData(y_set=True))"

        self.assertEqual(str(data), expected)
        self.assertEqual(repr(data), expected)

        self.assertEqual(
            NestedData.to_structure(data), {
                'attr':
                get_variant(Structure, {'x': get_variant(Int, -1)}),
                'secret':
                get_variant(Structure, {'y': get_variant(Str, "SECRET")}),
                'list':
                get_variant(List[Structure], [{
                    'x': get_variant(Int, 0)
                }, {
                    'x': get_variant(Int, 1)
                }])
            })

        dictionary = {
            'attr': {
                'x': 10
            },
            'secret': {
                'y': "SECRET"
            },
            'list': [{
                'x': 200
            }, {
                'x': 300
            }]
        }

        structure = {
            'attr':
            get_variant(Dict[Str, Variant], {'x': get_variant(Int, 10)}),
            'secret':
            get_variant(Dict[Str, Variant], {'y': get_variant(Str, "SECRET")}),
            'list':
            get_variant(List[Dict[Str, Variant]], [{
                'x': get_variant(Int, 200)
            }, {
                'x': get_variant(Int, 300)
            }])
        }

        data = NestedData.from_structure(structure)
        self.assertEqual(data.attr.x, 10)
        self.assertEqual(data.secret.y, "SECRET")
        self.assertEqual(len(data.list), 2)
        self.assertEqual(data.list[0].x, 200)
        self.assertEqual(data.list[1].x, 300)

        structure = NestedData.to_structure(data)
        self.assertEqual(get_native(structure), dictionary)
示例#26
0
 def assert_call(self, property_name, value):
     self.assert_called_once_with(OSCAP.interface_name,
                                  {property_name: get_native(value)}, [])
示例#27
0
 def __call__(self, interface, changed, invalid):
     return super().__call__(interface, get_native(changed), invalid)