simpleble 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/CHANGELOG.md +88 -0
- data/LICENSE.txt +21 -0
- data/README.md +350 -0
- data/ext/simpleble/extconf.rb +57 -0
- data/ext/simpleble/simpleble_ruby.c +682 -0
- data/lib/simpleble/adapter.rb +10 -0
- data/lib/simpleble/characteristic.rb +36 -0
- data/lib/simpleble/descriptor.rb +8 -0
- data/lib/simpleble/exceptions.rb +25 -0
- data/lib/simpleble/peripheral.rb +64 -0
- data/lib/simpleble/service.rb +16 -0
- data/lib/simpleble/version.rb +3 -0
- data/lib/simpleble.rb +40 -0
- data/vendor/simpleble/build_simplecble/CMakeFiles/4.0.3/CompilerIdCXX/CMakeCXXCompilerId.cpp +920 -0
- data/vendor/simpleble/build_simplecble/CMakeFiles/4.0.3/CompilerIdCXX/apple-sdk.cpp +1 -0
- data/vendor/simpleble/build_simplecble/CMakeFiles/4.1.0/CompilerIdCXX/CMakeCXXCompilerId.cpp +949 -0
- data/vendor/simpleble/build_simplecble/CMakeFiles/4.1.0/CompilerIdCXX/apple-sdk.cpp +1 -0
- data/vendor/simpleble/build_simplecble/export/simplecble/export.h +43 -0
- data/vendor/simpleble/build_simplecble/simpleble/export/simpleble/export.h +43 -0
- data/vendor/simpleble/dependencies/external/kvn/kvn_bytearray.h +222 -0
- data/vendor/simpleble/dependencies/external/kvn/kvn_safe_callback.hpp +66 -0
- data/vendor/simpleble/dependencies/external/kvn/logfwd.hpp +35 -0
- data/vendor/simpleble/dependencies/internal/fmt/args.h +220 -0
- data/vendor/simpleble/dependencies/internal/fmt/base.h +2962 -0
- data/vendor/simpleble/dependencies/internal/fmt/chrono.h +2338 -0
- data/vendor/simpleble/dependencies/internal/fmt/color.h +610 -0
- data/vendor/simpleble/dependencies/internal/fmt/compile.h +539 -0
- data/vendor/simpleble/dependencies/internal/fmt/core.h +5 -0
- data/vendor/simpleble/dependencies/internal/fmt/format-inl.h +1949 -0
- data/vendor/simpleble/dependencies/internal/fmt/format.h +4244 -0
- data/vendor/simpleble/dependencies/internal/fmt/os.h +427 -0
- data/vendor/simpleble/dependencies/internal/fmt/ostream.h +166 -0
- data/vendor/simpleble/dependencies/internal/fmt/printf.h +633 -0
- data/vendor/simpleble/dependencies/internal/fmt/ranges.h +850 -0
- data/vendor/simpleble/dependencies/internal/fmt/std.h +726 -0
- data/vendor/simpleble/dependencies/internal/fmt/xchar.h +373 -0
- data/vendor/simpleble/dependencies/internal/simplejni/Common.hpp +579 -0
- data/vendor/simpleble/dependencies/internal/simplejni/References.hpp +151 -0
- data/vendor/simpleble/dependencies/internal/simplejni/Registry.hpp +183 -0
- data/vendor/simpleble/dependencies/internal/simplejni/VM.hpp +88 -0
- data/vendor/simpleble/examples/simpleble/src/connect.cpp +67 -0
- data/vendor/simpleble/examples/simpleble/src/connect_safe.cpp +91 -0
- data/vendor/simpleble/examples/simpleble/src/list_adapters.cpp +22 -0
- data/vendor/simpleble/examples/simpleble/src/list_adapters_safe.cpp +33 -0
- data/vendor/simpleble/examples/simpleble/src/list_paired.cpp +27 -0
- data/vendor/simpleble/examples/simpleble/src/multiconnect.cpp +60 -0
- data/vendor/simpleble/examples/simpleble/src/notify.cpp +85 -0
- data/vendor/simpleble/examples/simpleble/src/notify_multi.cpp +101 -0
- data/vendor/simpleble/examples/simpleble/src/power_cycle.cpp +43 -0
- data/vendor/simpleble/examples/simpleble/src/read.cpp +82 -0
- data/vendor/simpleble/examples/simpleble/src/scan.cpp +62 -0
- data/vendor/simpleble/examples/simpleble/src/utils.cpp +59 -0
- data/vendor/simpleble/examples/simpleble/src/utils.hpp +27 -0
- data/vendor/simpleble/examples/simpleble/src/write.cpp +81 -0
- data/vendor/simpleble/examples/simplebluez/ble_nus/ble_nus.cpp +138 -0
- data/vendor/simpleble/examples/simplebluez/connect/connect.cpp +119 -0
- data/vendor/simpleble/examples/simplebluez/list_adapters/list_adapters.cpp +44 -0
- data/vendor/simpleble/examples/simplebluez/list_paired/list_paired.cpp +48 -0
- data/vendor/simpleble/examples/simplebluez/notify/notify.cpp +145 -0
- data/vendor/simpleble/examples/simplebluez/pair/pair.cpp +181 -0
- data/vendor/simpleble/examples/simplebluez/read/read.cpp +141 -0
- data/vendor/simpleble/examples/simplebluez/scan/scan.cpp +85 -0
- data/vendor/simpleble/examples/simplecble/c/connect.c +163 -0
- data/vendor/simpleble/examples/simplecble/c/notify.c +217 -0
- data/vendor/simpleble/examples/simplecble/c/scan.c +164 -0
- data/vendor/simpleble/examples/simpledbus/notification.cpp +24 -0
- data/vendor/simpleble/hitl/src/test_sanity.cpp +48 -0
- data/vendor/simpleble/install_simplecble/include/simpleble/Adapter.h +102 -0
- data/vendor/simpleble/install_simplecble/include/simpleble/AdapterSafe.h +58 -0
- data/vendor/simpleble/install_simplecble/include/simpleble/Advanced.h +50 -0
- data/vendor/simpleble/install_simplecble/include/simpleble/Characteristic.h +39 -0
- data/vendor/simpleble/install_simplecble/include/simpleble/Config.h +55 -0
- data/vendor/simpleble/install_simplecble/include/simpleble/Descriptor.h +30 -0
- data/vendor/simpleble/install_simplecble/include/simpleble/Exceptions.h +72 -0
- data/vendor/simpleble/install_simplecble/include/simpleble/Logging.h +73 -0
- data/vendor/simpleble/install_simplecble/include/simpleble/Peripheral.h +82 -0
- data/vendor/simpleble/install_simplecble/include/simpleble/PeripheralSafe.h +64 -0
- data/vendor/simpleble/install_simplecble/include/simpleble/Service.h +34 -0
- data/vendor/simpleble/install_simplecble/include/simpleble/SimpleBLE.h +8 -0
- data/vendor/simpleble/install_simplecble/include/simpleble/Types.h +49 -0
- data/vendor/simpleble/install_simplecble/include/simpleble/Utils.h +13 -0
- data/vendor/simpleble/install_simplecble/include/simpleble/export.h +43 -0
- data/vendor/simpleble/install_simplecble/include/simpleble/kvn/kvn_bytearray.h +222 -0
- data/vendor/simpleble/install_simplecble/include/simplecble/adapter.h +188 -0
- data/vendor/simpleble/install_simplecble/include/simplecble/logging.h +37 -0
- data/vendor/simpleble/install_simplecble/include/simplecble/peripheral.h +304 -0
- data/vendor/simpleble/install_simplecble/include/simplecble/simpleble.h +21 -0
- data/vendor/simpleble/install_simplecble/include/simplecble/types.h +73 -0
- data/vendor/simpleble/install_simplecble/include/simplecble/utils.h +27 -0
- data/vendor/simpleble/simpleble/include/simpleble/Adapter.h +102 -0
- data/vendor/simpleble/simpleble/include/simpleble/AdapterSafe.h +58 -0
- data/vendor/simpleble/simpleble/include/simpleble/Characteristic.h +39 -0
- data/vendor/simpleble/simpleble/include/simpleble/Config.h +55 -0
- data/vendor/simpleble/simpleble/include/simpleble/Descriptor.h +30 -0
- data/vendor/simpleble/simpleble/include/simpleble/Exceptions.h +72 -0
- data/vendor/simpleble/simpleble/include/simpleble/Logging.h +73 -0
- data/vendor/simpleble/simpleble/include/simpleble/Peripheral.h +82 -0
- data/vendor/simpleble/simpleble/include/simpleble/PeripheralSafe.h +64 -0
- data/vendor/simpleble/simpleble/include/simpleble/Service.h +34 -0
- data/vendor/simpleble/simpleble/include/simpleble/SimpleBLE.h +8 -0
- data/vendor/simpleble/simpleble/include/simpleble/Types.h +49 -0
- data/vendor/simpleble/simpleble/include/simpleble/Utils.h +13 -0
- data/vendor/simpleble/simpleble/include/simpleble_c/adapter.h +188 -0
- data/vendor/simpleble/simpleble/include/simpleble_c/logging.h +37 -0
- data/vendor/simpleble/simpleble/include/simpleble_c/peripheral.h +304 -0
- data/vendor/simpleble/simpleble/include/simpleble_c/simpleble.h +21 -0
- data/vendor/simpleble/simpleble/include/simpleble_c/types.h +73 -0
- data/vendor/simpleble/simpleble/include/simpleble_c/utils.h +27 -0
- data/vendor/simpleble/simpleble/src/CommonUtils.h +63 -0
- data/vendor/simpleble/simpleble/src/Exceptions.cpp +31 -0
- data/vendor/simpleble/simpleble/src/Logging.cpp +136 -0
- data/vendor/simpleble/simpleble/src/LoggingInternal.h +85 -0
- data/vendor/simpleble/simpleble/src/Utils.cpp +24 -0
- data/vendor/simpleble/simpleble/src/backends/android/AdapterAndroid.cpp +101 -0
- data/vendor/simpleble/simpleble/src/backends/android/AdapterAndroid.h +70 -0
- data/vendor/simpleble/simpleble/src/backends/android/BackendAndroid.cpp +40 -0
- data/vendor/simpleble/simpleble/src/backends/android/BackendAndroid.h +20 -0
- data/vendor/simpleble/simpleble/src/backends/android/PeripheralAndroid.cpp +365 -0
- data/vendor/simpleble/simpleble/src/backends/android/PeripheralAndroid.h +90 -0
- data/vendor/simpleble/simpleble/src/backends/android/bridge/BluetoothGattCallback.cpp +432 -0
- data/vendor/simpleble/simpleble/src/backends/android/bridge/BluetoothGattCallback.h +102 -0
- data/vendor/simpleble/simpleble/src/backends/android/bridge/ScanCallback.cpp +142 -0
- data/vendor/simpleble/simpleble/src/backends/android/bridge/ScanCallback.h +55 -0
- data/vendor/simpleble/simpleble/src/backends/android/types/android/bluetooth/BluetoothAdapter.cpp +107 -0
- data/vendor/simpleble/simpleble/src/backends/android/types/android/bluetooth/BluetoothAdapter.h +55 -0
- data/vendor/simpleble/simpleble/src/backends/android/types/android/bluetooth/BluetoothDevice.cpp +68 -0
- data/vendor/simpleble/simpleble/src/backends/android/types/android/bluetooth/BluetoothDevice.h +54 -0
- data/vendor/simpleble/simpleble/src/backends/android/types/android/bluetooth/BluetoothGatt.cpp +115 -0
- data/vendor/simpleble/simpleble/src/backends/android/types/android/bluetooth/BluetoothGatt.h +75 -0
- data/vendor/simpleble/simpleble/src/backends/android/types/android/bluetooth/BluetoothGattCharacteristic.cpp +142 -0
- data/vendor/simpleble/simpleble/src/backends/android/types/android/bluetooth/BluetoothGattCharacteristic.h +66 -0
- data/vendor/simpleble/simpleble/src/backends/android/types/android/bluetooth/BluetoothGattDescriptor.cpp +67 -0
- data/vendor/simpleble/simpleble/src/backends/android/types/android/bluetooth/BluetoothGattDescriptor.h +46 -0
- data/vendor/simpleble/simpleble/src/backends/android/types/android/bluetooth/BluetoothGattService.cpp +106 -0
- data/vendor/simpleble/simpleble/src/backends/android/types/android/bluetooth/BluetoothGattService.h +47 -0
- data/vendor/simpleble/simpleble/src/backends/android/types/android/bluetooth/le/BluetoothScanner.cpp +47 -0
- data/vendor/simpleble/simpleble/src/backends/android/types/android/bluetooth/le/BluetoothScanner.h +37 -0
- data/vendor/simpleble/simpleble/src/backends/android/types/android/bluetooth/le/ScanRecord.cpp +69 -0
- data/vendor/simpleble/simpleble/src/backends/android/types/android/bluetooth/le/ScanRecord.h +41 -0
- data/vendor/simpleble/simpleble/src/backends/android/types/android/bluetooth/le/ScanResult.cpp +63 -0
- data/vendor/simpleble/simpleble/src/backends/android/types/android/bluetooth/le/ScanResult.h +42 -0
- data/vendor/simpleble/simpleble/src/backends/android/types/android/os/ParcelUUID.cpp +32 -0
- data/vendor/simpleble/simpleble/src/backends/android/types/android/os/ParcelUUID.h +30 -0
- data/vendor/simpleble/simpleble/src/backends/android/types/android/util/SparseArray.cpp +54 -0
- data/vendor/simpleble/simpleble/src/backends/android/types/android/util/SparseArray.h +37 -0
- data/vendor/simpleble/simpleble/src/backends/android/types/java/util/Iterator.cpp +36 -0
- data/vendor/simpleble/simpleble/src/backends/android/types/java/util/Iterator.h +28 -0
- data/vendor/simpleble/simpleble/src/backends/android/types/java/util/List.cpp +29 -0
- data/vendor/simpleble/simpleble/src/backends/android/types/java/util/List.h +27 -0
- data/vendor/simpleble/simpleble/src/backends/android/types/java/util/Set.cpp +33 -0
- data/vendor/simpleble/simpleble/src/backends/android/types/java/util/Set.h +28 -0
- data/vendor/simpleble/simpleble/src/backends/android/types/java/util/UUID.cpp +26 -0
- data/vendor/simpleble/simpleble/src/backends/android/types/java/util/UUID.h +29 -0
- data/vendor/simpleble/simpleble/src/backends/common/AdapterBase.cpp +53 -0
- data/vendor/simpleble/simpleble/src/backends/common/AdapterBase.h +81 -0
- data/vendor/simpleble/simpleble/src/backends/common/AdapterBaseTypes.h +22 -0
- data/vendor/simpleble/simpleble/src/backends/common/BackendBase.h +20 -0
- data/vendor/simpleble/simpleble/src/backends/common/BackendUtils.h +33 -0
- data/vendor/simpleble/simpleble/src/backends/common/CharacteristicBase.cpp +28 -0
- data/vendor/simpleble/simpleble/src/backends/common/CharacteristicBase.h +38 -0
- data/vendor/simpleble/simpleble/src/backends/common/DescriptorBase.cpp +7 -0
- data/vendor/simpleble/simpleble/src/backends/common/DescriptorBase.h +19 -0
- data/vendor/simpleble/simpleble/src/backends/common/PeripheralBase.h +82 -0
- data/vendor/simpleble/simpleble/src/backends/common/ServiceBase.cpp +18 -0
- data/vendor/simpleble/simpleble/src/backends/common/ServiceBase.h +28 -0
- data/vendor/simpleble/simpleble/src/backends/linux/AdapterLinux.cpp +102 -0
- data/vendor/simpleble/simpleble/src/backends/linux/AdapterLinux.h +55 -0
- data/vendor/simpleble/simpleble/src/backends/linux/BackendBluez.cpp +87 -0
- data/vendor/simpleble/simpleble/src/backends/linux/PeripheralLinux.cpp +376 -0
- data/vendor/simpleble/simpleble/src/backends/linux/PeripheralLinux.h +90 -0
- data/vendor/simpleble/simpleble/src/backends/macos/AdapterBaseMacOS.h +29 -0
- data/vendor/simpleble/simpleble/src/backends/macos/AdapterMac.h +78 -0
- data/vendor/simpleble/simpleble/src/backends/macos/PeripheralBaseMacOS.h +49 -0
- data/vendor/simpleble/simpleble/src/backends/macos/PeripheralMac.h +81 -0
- data/vendor/simpleble/simpleble/src/backends/macos/Utils.h +9 -0
- data/vendor/simpleble/simpleble/src/backends/plain/AdapterPlain.cpp +65 -0
- data/vendor/simpleble/simpleble/src/backends/plain/AdapterPlain.h +49 -0
- data/vendor/simpleble/simpleble/src/backends/plain/BackendPlain.cpp +30 -0
- data/vendor/simpleble/simpleble/src/backends/plain/PeripheralPlain.cpp +159 -0
- data/vendor/simpleble/simpleble/src/backends/plain/PeripheralPlain.h +72 -0
- data/vendor/simpleble/simpleble/src/backends/windows/AdapterWindows.cpp +330 -0
- data/vendor/simpleble/simpleble/src/backends/windows/AdapterWindows.h +89 -0
- data/vendor/simpleble/simpleble/src/backends/windows/BackendWinRT.cpp +67 -0
- data/vendor/simpleble/simpleble/src/backends/windows/BackendWinRT.h +18 -0
- data/vendor/simpleble/simpleble/src/backends/windows/MtaManager.cpp +49 -0
- data/vendor/simpleble/simpleble/src/backends/windows/MtaManager.h +90 -0
- data/vendor/simpleble/simpleble/src/backends/windows/PeripheralWindows.cpp +487 -0
- data/vendor/simpleble/simpleble/src/backends/windows/PeripheralWindows.h +129 -0
- data/vendor/simpleble/simpleble/src/backends/windows/Utils.cpp +146 -0
- data/vendor/simpleble/simpleble/src/backends/windows/Utils.h +47 -0
- data/vendor/simpleble/simpleble/src/builders/BuildVec.h +32 -0
- data/vendor/simpleble/simpleble/src/builders/BuilderBase.h +87 -0
- data/vendor/simpleble/simpleble/src/external/TaskRunner.hpp +99 -0
- data/vendor/simpleble/simpleble/src/external/ThreadRunner.h +52 -0
- data/vendor/simpleble/simpleble/src/external/kvn_safe_callback.hpp +66 -0
- data/vendor/simpleble/simpleble/src/external/kvn_safe_map.hpp +94 -0
- data/vendor/simpleble/simpleble/src/external/kvn_threadrunner.hpp +70 -0
- data/vendor/simpleble/simpleble/src/external/logfwd.hpp +35 -0
- data/vendor/simpleble/simpleble/src/frontends/base/Adapter.cpp +111 -0
- data/vendor/simpleble/simpleble/src/frontends/base/Backend.cpp +83 -0
- data/vendor/simpleble/simpleble/src/frontends/base/Backend.h +76 -0
- data/vendor/simpleble/simpleble/src/frontends/base/Characteristic.cpp +56 -0
- data/vendor/simpleble/simpleble/src/frontends/base/Descriptor.cpp +21 -0
- data/vendor/simpleble/simpleble/src/frontends/base/Peripheral.cpp +113 -0
- data/vendor/simpleble/simpleble/src/frontends/base/Service.cpp +26 -0
- data/vendor/simpleble/simpleble/src/frontends/safe/AdapterSafe.cpp +158 -0
- data/vendor/simpleble/simpleble/src/frontends/safe/PeripheralSafe.cpp +219 -0
- data/vendor/simpleble/simpleble/src_c/adapter.cpp +204 -0
- data/vendor/simpleble/simpleble/src_c/logging.cpp +19 -0
- data/vendor/simpleble/simpleble/src_c/peripheral.cpp +444 -0
- data/vendor/simpleble/simpleble/src_c/simpleble.cpp +5 -0
- data/vendor/simpleble/simpleble/src_c/utils.cpp +15 -0
- data/vendor/simpleble/simpleble/test/src/main.cpp +8 -0
- data/vendor/simpleble/simpleble/test/src/test_bytearray.cpp +246 -0
- data/vendor/simpleble/simpleble/test/src/test_utils.cpp +24 -0
- data/vendor/simpleble/simplebluez/include/simplebluez/Adapter.h +46 -0
- data/vendor/simpleble/simplebluez/include/simplebluez/Agent.h +52 -0
- data/vendor/simpleble/simplebluez/include/simplebluez/Bluez.h +37 -0
- data/vendor/simpleble/simplebluez/include/simplebluez/BluezOrg.h +22 -0
- data/vendor/simpleble/simplebluez/include/simplebluez/BluezOrgBluez.h +26 -0
- data/vendor/simpleble/simplebluez/include/simplebluez/BluezRoot.h +32 -0
- data/vendor/simpleble/simplebluez/include/simplebluez/Characteristic.h +46 -0
- data/vendor/simpleble/simplebluez/include/simplebluez/Descriptor.h +33 -0
- data/vendor/simpleble/simplebluez/include/simplebluez/Device.h +64 -0
- data/vendor/simpleble/simplebluez/include/simplebluez/Exceptions.h +43 -0
- data/vendor/simpleble/simplebluez/include/simplebluez/Service.h +27 -0
- data/vendor/simpleble/simplebluez/include/simplebluez/Types.h +9 -0
- data/vendor/simpleble/simplebluez/include/simplebluez/interfaces/Adapter1.h +49 -0
- data/vendor/simpleble/simplebluez/include/simplebluez/interfaces/Agent1.h +100 -0
- data/vendor/simpleble/simplebluez/include/simplebluez/interfaces/AgentManager1.h +24 -0
- data/vendor/simpleble/simplebluez/include/simplebluez/interfaces/Battery1.h +32 -0
- data/vendor/simpleble/simplebluez/include/simplebluez/interfaces/Device1.h +62 -0
- data/vendor/simpleble/simplebluez/include/simplebluez/interfaces/GattCharacteristic1.h +48 -0
- data/vendor/simpleble/simplebluez/include/simplebluez/interfaces/GattDescriptor1.h +41 -0
- data/vendor/simpleble/simplebluez/include/simplebluez/interfaces/GattService1.h +28 -0
- data/vendor/simpleble/simplebluez/src/Adapter.cpp +78 -0
- data/vendor/simpleble/simplebluez/src/Agent.cpp +72 -0
- data/vendor/simpleble/simplebluez/src/Bluez.cpp +45 -0
- data/vendor/simpleble/simplebluez/src/BluezOrg.cpp +20 -0
- data/vendor/simpleble/simplebluez/src/BluezOrgBluez.cpp +23 -0
- data/vendor/simpleble/simplebluez/src/BluezRoot.cpp +44 -0
- data/vendor/simpleble/simplebluez/src/Characteristic.cpp +64 -0
- data/vendor/simpleble/simplebluez/src/Descriptor.cpp +27 -0
- data/vendor/simpleble/simplebluez/src/Device.cpp +104 -0
- data/vendor/simpleble/simplebluez/src/Exceptions.cpp +29 -0
- data/vendor/simpleble/simplebluez/src/Logging.cpp +52 -0
- data/vendor/simpleble/simplebluez/src/Logging.h +57 -0
- data/vendor/simpleble/simplebluez/src/Service.cpp +33 -0
- data/vendor/simpleble/simplebluez/src/interfaces/Adapter1.cpp +123 -0
- data/vendor/simpleble/simplebluez/src/interfaces/Agent1.cpp +143 -0
- data/vendor/simpleble/simplebluez/src/interfaces/AgentManager1.cpp +34 -0
- data/vendor/simpleble/simplebluez/src/interfaces/Battery1.cpp +30 -0
- data/vendor/simpleble/simplebluez/src/interfaces/Device1.cpp +170 -0
- data/vendor/simpleble/simplebluez/src/interfaces/GattCharacteristic1.cpp +118 -0
- data/vendor/simpleble/simplebluez/src/interfaces/GattDescriptor1.cpp +78 -0
- data/vendor/simpleble/simplebluez/src/interfaces/GattService1.cpp +28 -0
- data/vendor/simpleble/simplebluez/test/src/helpers/PythonRunner.cpp +53 -0
- data/vendor/simpleble/simplebluez/test/src/helpers/PythonRunner.h +24 -0
- data/vendor/simpleble/simplebluez/test/src/main.cpp +16 -0
- data/vendor/simpleble/simplecble/include/simplecble/adapter.h +188 -0
- data/vendor/simpleble/simplecble/include/simplecble/logging.h +37 -0
- data/vendor/simpleble/simplecble/include/simplecble/peripheral.h +304 -0
- data/vendor/simpleble/simplecble/include/simplecble/simpleble.h +21 -0
- data/vendor/simpleble/simplecble/include/simplecble/types.h +73 -0
- data/vendor/simpleble/simplecble/include/simplecble/utils.h +27 -0
- data/vendor/simpleble/simplecble/src/adapter.cpp +204 -0
- data/vendor/simpleble/simplecble/src/logging.cpp +19 -0
- data/vendor/simpleble/simplecble/src/peripheral.cpp +444 -0
- data/vendor/simpleble/simplecble/src/simpleble.cpp +5 -0
- data/vendor/simpleble/simplecble/src/utils.cpp +15 -0
- data/vendor/simpleble/simpledbus/include/simpledbus/advanced/Interface.h +67 -0
- data/vendor/simpleble/simpledbus/include/simpledbus/advanced/InterfaceRegistry.h +64 -0
- data/vendor/simpleble/simpledbus/include/simpledbus/advanced/Proxy.h +117 -0
- data/vendor/simpleble/simpledbus/include/simpledbus/base/Connection.h +50 -0
- data/vendor/simpleble/simpledbus/include/simpledbus/base/Exceptions.h +56 -0
- data/vendor/simpleble/simpledbus/include/simpledbus/base/Holder.h +147 -0
- data/vendor/simpleble/simpledbus/include/simpledbus/base/Logging.h +57 -0
- data/vendor/simpleble/simpledbus/include/simpledbus/base/Message.h +89 -0
- data/vendor/simpleble/simpledbus/include/simpledbus/base/Path.h +24 -0
- data/vendor/simpleble/simpledbus/include/simpledbus/interfaces/ObjectManager.h +26 -0
- data/vendor/simpleble/simpledbus/src/advanced/Interface.cpp +155 -0
- data/vendor/simpleble/simpledbus/src/advanced/Proxy.cpp +375 -0
- data/vendor/simpleble/simpledbus/src/base/Connection.cpp +222 -0
- data/vendor/simpleble/simpledbus/src/base/Exceptions.cpp +39 -0
- data/vendor/simpleble/simpledbus/src/base/Holder.cpp +739 -0
- data/vendor/simpleble/simpledbus/src/base/Logging.cpp +52 -0
- data/vendor/simpleble/simpledbus/src/base/Message.cpp +622 -0
- data/vendor/simpleble/simpledbus/src/base/Path.cpp +129 -0
- data/vendor/simpleble/simpledbus/src/interfaces/ObjectManager.cpp +58 -0
- data/vendor/simpleble/simpledbus/test/src/helpers/PythonRunner.cpp +53 -0
- data/vendor/simpleble/simpledbus/test/src/helpers/PythonRunner.h +24 -0
- data/vendor/simpleble/simpledbus/test/src/main.cpp +16 -0
- data/vendor/simpleble/simpledbus/test/src/test_holder.cpp +184 -0
- data/vendor/simpleble/simpledbus/test/src/test_message.cpp +397 -0
- data/vendor/simpleble/simpledbus/test/src/test_path.cpp +76 -0
- data/vendor/simpleble/simpledbus/test/src/test_proxy_children.cpp +109 -0
- data/vendor/simpleble/simpledbus/test/src/test_proxy_interfaces.cpp +102 -0
- data/vendor/simpleble/simpledbus/test/src/test_proxy_lifetime.cpp +18 -0
- data/vendor/simpleble/simpledroidble/simpledroidble/src/main/cpp/ThreadRunner.h +89 -0
- data/vendor/simpleble/simpledroidble/simpledroidble/src/main/cpp/android_utils.cpp +55 -0
- data/vendor/simpleble/simpledroidble/simpledroidble/src/main/cpp/android_utils.h +18 -0
- data/vendor/simpleble/simpledroidble/simpledroidble/src/main/cpp/simpleble_android.cpp +813 -0
- data/vendor/simpleble/simplejavable/cpp/src/core/AdapterWrapper.cpp +37 -0
- data/vendor/simpleble/simplejavable/cpp/src/core/AdapterWrapper.h +23 -0
- data/vendor/simpleble/simplejavable/cpp/src/core/Cache.cpp +58 -0
- data/vendor/simpleble/simplejavable/cpp/src/core/Cache.h +34 -0
- data/vendor/simpleble/simplejavable/cpp/src/core/PeripheralWrapper.cpp +17 -0
- data/vendor/simpleble/simplejavable/cpp/src/core/PeripheralWrapper.h +19 -0
- data/vendor/simpleble/simplejavable/cpp/src/java/lang/ArrayList.cpp +257 -0
- data/vendor/simpleble/simplejavable/cpp/src/java/lang/ArrayList.h +78 -0
- data/vendor/simpleble/simplejavable/cpp/src/java/lang/HashMap.cpp +96 -0
- data/vendor/simpleble/simplejavable/cpp/src/java/lang/HashMap.h +54 -0
- data/vendor/simpleble/simplejavable/cpp/src/java/lang/Integer.cpp +93 -0
- data/vendor/simpleble/simplejavable/cpp/src/java/lang/Integer.h +49 -0
- data/vendor/simpleble/simplejavable/cpp/src/java/lang/Iterator.cpp +85 -0
- data/vendor/simpleble/simplejavable/cpp/src/java/lang/Iterator.h +48 -0
- data/vendor/simpleble/simplejavable/cpp/src/org/simplejavable/AdapterCallback.cpp +91 -0
- data/vendor/simpleble/simplejavable/cpp/src/org/simplejavable/AdapterCallback.h +90 -0
- data/vendor/simpleble/simplejavable/cpp/src/org/simplejavable/Characteristic.cpp +35 -0
- data/vendor/simpleble/simplejavable/cpp/src/org/simplejavable/Characteristic.h +60 -0
- data/vendor/simpleble/simplejavable/cpp/src/org/simplejavable/DataCallback.cpp +33 -0
- data/vendor/simpleble/simplejavable/cpp/src/org/simplejavable/DataCallback.h +45 -0
- data/vendor/simpleble/simplejavable/cpp/src/org/simplejavable/Descriptor.cpp +30 -0
- data/vendor/simpleble/simplejavable/cpp/src/org/simplejavable/Descriptor.h +49 -0
- data/vendor/simpleble/simplejavable/cpp/src/org/simplejavable/PeripheralCallback.cpp +41 -0
- data/vendor/simpleble/simplejavable/cpp/src/org/simplejavable/PeripheralCallback.h +51 -0
- data/vendor/simpleble/simplejavable/cpp/src/org/simplejavable/Service.cpp +33 -0
- data/vendor/simpleble/simplejavable/cpp/src/org/simplejavable/Service.h +54 -0
- data/vendor/simpleble/simplejavable/cpp/src/simplejavable.cpp +361 -0
- data/vendor/simpleble/simplepyble/src/main.cpp +55 -0
- data/vendor/simpleble/simplepyble/src/wrap_adapter.cpp +106 -0
- data/vendor/simpleble/simplepyble/src/wrap_characteristic.cpp +56 -0
- data/vendor/simpleble/simplepyble/src/wrap_config.cpp +136 -0
- data/vendor/simpleble/simplepyble/src/wrap_descriptor.cpp +21 -0
- data/vendor/simpleble/simplepyble/src/wrap_peripheral.cpp +217 -0
- data/vendor/simpleble/simplepyble/src/wrap_service.cpp +32 -0
- data/vendor/simpleble/simplepyble/src/wrap_types.cpp +21 -0
- data/vendor/simpleble/simplersble/src/bindings/Bindings.cpp +338 -0
- data/vendor/simpleble/simplersble/src/bindings/Bindings.hpp +178 -0
- metadata +430 -0
@@ -0,0 +1,397 @@
|
|
1
|
+
#include <gtest/gtest.h>
|
2
|
+
|
3
|
+
#include <simpledbus/base/Connection.h>
|
4
|
+
#include <simpledbus/base/Message.h>
|
5
|
+
|
6
|
+
#include <chrono>
|
7
|
+
|
8
|
+
using namespace SimpleDBus;
|
9
|
+
|
10
|
+
class MessageTest : public ::testing::Test {
|
11
|
+
protected:
|
12
|
+
void SetUp() override {
|
13
|
+
conn = new Connection(DBUS_BUS_SESSION);
|
14
|
+
conn->init();
|
15
|
+
}
|
16
|
+
|
17
|
+
void TearDown() override {
|
18
|
+
conn->uninit();
|
19
|
+
delete conn;
|
20
|
+
conn = nullptr;
|
21
|
+
}
|
22
|
+
|
23
|
+
Connection* conn;
|
24
|
+
};
|
25
|
+
|
26
|
+
TEST_F(MessageTest, SendReceiveBooleanTrue) {
|
27
|
+
Message msg = Message::create_method_call("simpledbus.tester.python", "/", "simpledbus.tester.message",
|
28
|
+
"SendReceiveBoolean");
|
29
|
+
|
30
|
+
msg.append_argument(Holder::create_boolean(true), DBUS_TYPE_BOOLEAN_AS_STRING);
|
31
|
+
|
32
|
+
Message reply = conn->send_with_reply_and_block(msg);
|
33
|
+
Holder h_reply = reply.extract();
|
34
|
+
|
35
|
+
EXPECT_EQ(h_reply.type(), Holder::Type::BOOLEAN);
|
36
|
+
EXPECT_EQ(h_reply.get_boolean(), true);
|
37
|
+
}
|
38
|
+
|
39
|
+
TEST_F(MessageTest, SendReceiveBooleanFalse) {
|
40
|
+
Message msg = Message::create_method_call("simpledbus.tester.python", "/", "simpledbus.tester.message",
|
41
|
+
"SendReceiveBoolean");
|
42
|
+
|
43
|
+
msg.append_argument(Holder::create_boolean(false), DBUS_TYPE_BOOLEAN_AS_STRING);
|
44
|
+
|
45
|
+
Message reply = conn->send_with_reply_and_block(msg);
|
46
|
+
Holder h_reply = reply.extract();
|
47
|
+
|
48
|
+
EXPECT_EQ(h_reply.type(), Holder::Type::BOOLEAN);
|
49
|
+
EXPECT_EQ(h_reply.get_boolean(), false);
|
50
|
+
}
|
51
|
+
|
52
|
+
TEST_F(MessageTest, SendReceiveByte) {
|
53
|
+
Message msg = Message::create_method_call("simpledbus.tester.python", "/", "simpledbus.tester.message",
|
54
|
+
"SendReceiveByte");
|
55
|
+
|
56
|
+
uint8_t value = 0x42;
|
57
|
+
msg.append_argument(Holder::create_byte(value), DBUS_TYPE_BYTE_AS_STRING);
|
58
|
+
|
59
|
+
Message reply = conn->send_with_reply_and_block(msg);
|
60
|
+
Holder h_reply = reply.extract();
|
61
|
+
|
62
|
+
EXPECT_EQ(h_reply.type(), Holder::Type::BYTE);
|
63
|
+
EXPECT_EQ(h_reply.get_byte(), value);
|
64
|
+
}
|
65
|
+
|
66
|
+
TEST_F(MessageTest, SendReceiveInt16) {
|
67
|
+
Message msg = Message::create_method_call("simpledbus.tester.python", "/", "simpledbus.tester.message",
|
68
|
+
"SendReceiveInt16");
|
69
|
+
|
70
|
+
int16_t value = 0x1234;
|
71
|
+
msg.append_argument(Holder::create_int16(value), DBUS_TYPE_INT16_AS_STRING);
|
72
|
+
|
73
|
+
Message reply = conn->send_with_reply_and_block(msg);
|
74
|
+
Holder h_reply = reply.extract();
|
75
|
+
|
76
|
+
EXPECT_EQ(h_reply.type(), Holder::Type::INT16);
|
77
|
+
EXPECT_EQ(h_reply.get_int16(), value);
|
78
|
+
}
|
79
|
+
|
80
|
+
TEST_F(MessageTest, SendReceiveUint16) {
|
81
|
+
Message msg = Message::create_method_call("simpledbus.tester.python", "/", "simpledbus.tester.message",
|
82
|
+
"SendReceiveUint16");
|
83
|
+
|
84
|
+
uint16_t value = 0x1234;
|
85
|
+
msg.append_argument(Holder::create_uint16(value), DBUS_TYPE_UINT16_AS_STRING);
|
86
|
+
|
87
|
+
Message reply = conn->send_with_reply_and_block(msg);
|
88
|
+
Holder h_reply = reply.extract();
|
89
|
+
|
90
|
+
EXPECT_EQ(h_reply.type(), Holder::Type::UINT16);
|
91
|
+
EXPECT_EQ(h_reply.get_uint16(), value);
|
92
|
+
}
|
93
|
+
|
94
|
+
TEST_F(MessageTest, SendReceiveInt32) {
|
95
|
+
Message msg = Message::create_method_call("simpledbus.tester.python", "/", "simpledbus.tester.message",
|
96
|
+
"SendReceiveInt32");
|
97
|
+
|
98
|
+
int32_t value = 0x12345678;
|
99
|
+
msg.append_argument(Holder::create_int32(value), DBUS_TYPE_INT32_AS_STRING);
|
100
|
+
|
101
|
+
Message reply = conn->send_with_reply_and_block(msg);
|
102
|
+
Holder h_reply = reply.extract();
|
103
|
+
|
104
|
+
EXPECT_EQ(h_reply.type(), Holder::Type::INT32);
|
105
|
+
EXPECT_EQ(h_reply.get_int32(), value);
|
106
|
+
}
|
107
|
+
|
108
|
+
TEST_F(MessageTest, SendReceiveUint32) {
|
109
|
+
Message msg = Message::create_method_call("simpledbus.tester.python", "/", "simpledbus.tester.message",
|
110
|
+
"SendReceiveUint32");
|
111
|
+
|
112
|
+
uint32_t value = 0x12345678;
|
113
|
+
msg.append_argument(Holder::create_uint32(value), DBUS_TYPE_UINT32_AS_STRING);
|
114
|
+
|
115
|
+
Message reply = conn->send_with_reply_and_block(msg);
|
116
|
+
Holder h_reply = reply.extract();
|
117
|
+
|
118
|
+
EXPECT_EQ(h_reply.type(), Holder::Type::UINT32);
|
119
|
+
EXPECT_EQ(h_reply.get_uint32(), value);
|
120
|
+
}
|
121
|
+
|
122
|
+
TEST_F(MessageTest, SendReceiveInt64) {
|
123
|
+
Message msg = Message::create_method_call("simpledbus.tester.python", "/", "simpledbus.tester.message",
|
124
|
+
"SendReceiveInt64");
|
125
|
+
|
126
|
+
int64_t value = 0x1234567812345678;
|
127
|
+
msg.append_argument(Holder::create_int64(value), DBUS_TYPE_INT64_AS_STRING);
|
128
|
+
|
129
|
+
Message reply = conn->send_with_reply_and_block(msg);
|
130
|
+
Holder h_reply = reply.extract();
|
131
|
+
|
132
|
+
EXPECT_EQ(h_reply.type(), Holder::Type::INT64);
|
133
|
+
EXPECT_EQ(h_reply.get_int64(), value);
|
134
|
+
}
|
135
|
+
|
136
|
+
TEST_F(MessageTest, SendReceiveUint64) {
|
137
|
+
Message msg = Message::create_method_call("simpledbus.tester.python", "/", "simpledbus.tester.message",
|
138
|
+
"SendReceiveUint64");
|
139
|
+
|
140
|
+
uint64_t value = 0x1234567812345678;
|
141
|
+
msg.append_argument(Holder::create_uint64(value), DBUS_TYPE_UINT64_AS_STRING);
|
142
|
+
|
143
|
+
Message reply = conn->send_with_reply_and_block(msg);
|
144
|
+
Holder h_reply = reply.extract();
|
145
|
+
|
146
|
+
EXPECT_EQ(h_reply.type(), Holder::Type::UINT64);
|
147
|
+
EXPECT_EQ(h_reply.get_uint64(), value);
|
148
|
+
}
|
149
|
+
|
150
|
+
TEST_F(MessageTest, SendReceiveArrayInt32) {
|
151
|
+
Message msg = Message::create_method_call("simpledbus.tester.python", "/", "simpledbus.tester.message",
|
152
|
+
"SendReceiveArrayInt32");
|
153
|
+
|
154
|
+
Holder h_msg = Holder::create_array();
|
155
|
+
h_msg.array_append(Holder::create_int32(0x12345678));
|
156
|
+
h_msg.array_append(Holder::create_int32(0x87654321));
|
157
|
+
msg.append_argument(h_msg, "ai");
|
158
|
+
|
159
|
+
Message reply = conn->send_with_reply_and_block(msg);
|
160
|
+
Holder h_reply = reply.extract();
|
161
|
+
|
162
|
+
EXPECT_EQ(h_reply.type(), Holder::Type::ARRAY);
|
163
|
+
|
164
|
+
std::vector<Holder> array = h_reply.get_array();
|
165
|
+
|
166
|
+
ASSERT_EQ(array.size(), 2);
|
167
|
+
|
168
|
+
EXPECT_EQ(array[0].type(), Holder::Type::INT32);
|
169
|
+
EXPECT_EQ(array[0].get_int32(), 0x12345678);
|
170
|
+
|
171
|
+
EXPECT_EQ(array[1].type(), Holder::Type::INT32);
|
172
|
+
EXPECT_EQ(array[1].get_int32(), 0x87654321);
|
173
|
+
}
|
174
|
+
|
175
|
+
TEST_F(MessageTest, SendReceiveArrayString) {
|
176
|
+
Message msg = Message::create_method_call("simpledbus.tester.python", "/", "simpledbus.tester.message",
|
177
|
+
"SendReceiveArrayString");
|
178
|
+
|
179
|
+
Holder h_msg = Holder::create_array();
|
180
|
+
h_msg.array_append(Holder::create_string("Hello"));
|
181
|
+
h_msg.array_append(Holder::create_string("World"));
|
182
|
+
msg.append_argument(h_msg, "as");
|
183
|
+
|
184
|
+
Message reply = conn->send_with_reply_and_block(msg);
|
185
|
+
Holder h_reply = reply.extract();
|
186
|
+
|
187
|
+
EXPECT_EQ(h_reply.type(), Holder::Type::ARRAY);
|
188
|
+
|
189
|
+
std::vector<Holder> array = h_reply.get_array();
|
190
|
+
|
191
|
+
ASSERT_EQ(array.size(), 2);
|
192
|
+
|
193
|
+
EXPECT_EQ(array[0].type(), Holder::Type::STRING);
|
194
|
+
EXPECT_EQ(array[0].get_string(), "Hello");
|
195
|
+
|
196
|
+
EXPECT_EQ(array[1].type(), Holder::Type::STRING);
|
197
|
+
EXPECT_EQ(array[1].get_string(), "World");
|
198
|
+
}
|
199
|
+
|
200
|
+
TEST_F(MessageTest, SendReceiveDictInt32) {
|
201
|
+
Message msg = Message::create_method_call("simpledbus.tester.python", "/", "simpledbus.tester.message",
|
202
|
+
"SendReceiveDictInt32");
|
203
|
+
|
204
|
+
Holder h_msg = Holder::create_dict();
|
205
|
+
h_msg.dict_append(Holder::INT32, static_cast<int32_t>(0x12345678), Holder::create_int32(0x87654321));
|
206
|
+
h_msg.dict_append(Holder::INT32, static_cast<int32_t>(0x87654321), Holder::create_string("Hello"));
|
207
|
+
msg.append_argument(h_msg, "a{iv}");
|
208
|
+
|
209
|
+
Message reply = conn->send_with_reply_and_block(msg);
|
210
|
+
Holder h_reply = reply.extract();
|
211
|
+
|
212
|
+
EXPECT_EQ(h_reply.type(), Holder::Type::DICT);
|
213
|
+
|
214
|
+
std::map<int32_t, Holder> dict = h_reply.get_dict_int32();
|
215
|
+
|
216
|
+
ASSERT_EQ(dict.size(), 2);
|
217
|
+
ASSERT_EQ(dict.count(0x12345678), 1);
|
218
|
+
ASSERT_EQ(dict.count(0x87654321), 1);
|
219
|
+
|
220
|
+
EXPECT_EQ(dict[0x12345678].type(), Holder::Type::INT32);
|
221
|
+
EXPECT_EQ(dict[0x12345678].get_int32(), 0x87654321);
|
222
|
+
|
223
|
+
EXPECT_EQ(dict[0x87654321].type(), Holder::Type::STRING);
|
224
|
+
EXPECT_EQ(dict[0x87654321].get_string(), "Hello");
|
225
|
+
}
|
226
|
+
|
227
|
+
TEST_F(MessageTest, SendReceiveDictString) {
|
228
|
+
Message msg = Message::create_method_call("simpledbus.tester.python", "/", "simpledbus.tester.message",
|
229
|
+
"SendReceiveDictString");
|
230
|
+
|
231
|
+
Holder h_msg = Holder::create_dict();
|
232
|
+
h_msg.dict_append(Holder::STRING, "key1", Holder::create_int32(0x87654321));
|
233
|
+
h_msg.dict_append(Holder::STRING, "key2", Holder::create_string("Hello"));
|
234
|
+
msg.append_argument(h_msg, "a{sv}");
|
235
|
+
|
236
|
+
Message reply = conn->send_with_reply_and_block(msg);
|
237
|
+
Holder h_reply = reply.extract();
|
238
|
+
|
239
|
+
EXPECT_EQ(h_reply.type(), Holder::Type::DICT);
|
240
|
+
|
241
|
+
std::map<std::string, Holder> dict = h_reply.get_dict_string();
|
242
|
+
|
243
|
+
ASSERT_EQ(dict.size(), 2);
|
244
|
+
ASSERT_EQ(dict.count("key1"), 1);
|
245
|
+
ASSERT_EQ(dict.count("key2"), 1);
|
246
|
+
|
247
|
+
EXPECT_EQ(dict["key1"].type(), Holder::Type::INT32);
|
248
|
+
EXPECT_EQ(dict["key1"].get_int32(), 0x87654321);
|
249
|
+
|
250
|
+
EXPECT_EQ(dict["key2"].type(), Holder::Type::STRING);
|
251
|
+
EXPECT_EQ(dict["key2"].get_string(), "Hello");
|
252
|
+
}
|
253
|
+
|
254
|
+
TEST_F(MessageTest, ReceiveMethodCallSuccess) {
|
255
|
+
Message msg = Message::create_method_call("simpledbus.tester.python", "/", "simpledbus.tester.message",
|
256
|
+
"TriggerMethodCall");
|
257
|
+
|
258
|
+
msg.append_argument(Holder::create_string(conn->unique_name()), DBUS_TYPE_STRING_AS_STRING);
|
259
|
+
msg.append_argument(Holder::create_string("/my/custom/path"), DBUS_TYPE_STRING_AS_STRING);
|
260
|
+
msg.append_argument(Holder::create_string("my.interface"), DBUS_TYPE_STRING_AS_STRING);
|
261
|
+
msg.append_argument(Holder::create_string("MyMethod"), DBUS_TYPE_STRING_AS_STRING);
|
262
|
+
msg.append_argument(Holder::create_string("Hello World"), DBUS_TYPE_STRING_AS_STRING);
|
263
|
+
conn->send_with_reply_and_block(msg);
|
264
|
+
|
265
|
+
// Wait for the method call to be received
|
266
|
+
bool method_called = false;
|
267
|
+
std::chrono::time_point<std::chrono::steady_clock> end = std::chrono::steady_clock::now() + std::chrono::seconds(1);
|
268
|
+
while (std::chrono::steady_clock::now() < end) {
|
269
|
+
conn->read_write();
|
270
|
+
auto method_call = conn->pop_message();
|
271
|
+
if (method_call.is_valid()) {
|
272
|
+
EXPECT_EQ(method_call.get_path(), "/my/custom/path");
|
273
|
+
EXPECT_EQ(method_call.get_interface(), "my.interface");
|
274
|
+
EXPECT_EQ(method_call.get_member(), "MyMethod");
|
275
|
+
|
276
|
+
Holder arguments = method_call.extract();
|
277
|
+
EXPECT_EQ(arguments.type(), Holder::Type::STRING);
|
278
|
+
EXPECT_EQ(arguments.get_string(), "Hello World");
|
279
|
+
|
280
|
+
Message reply = Message::create_method_return(method_call);
|
281
|
+
reply.append_argument(Holder::create_string("Nice to meet you"), DBUS_TYPE_STRING_AS_STRING);
|
282
|
+
conn->send(reply);
|
283
|
+
method_called = true;
|
284
|
+
break;
|
285
|
+
}
|
286
|
+
}
|
287
|
+
EXPECT_TRUE(method_called);
|
288
|
+
}
|
289
|
+
|
290
|
+
TEST_F(MessageTest, ReceiveMethodCallFailure) {
|
291
|
+
Message msg = Message::create_method_call("simpledbus.tester.python", "/", "simpledbus.tester.message",
|
292
|
+
"TriggerMethodCall");
|
293
|
+
|
294
|
+
msg.append_argument(Holder::create_string(conn->unique_name()), DBUS_TYPE_STRING_AS_STRING);
|
295
|
+
msg.append_argument(Holder::create_string("/my/custom/path"), DBUS_TYPE_STRING_AS_STRING);
|
296
|
+
msg.append_argument(Holder::create_string("my.interface"), DBUS_TYPE_STRING_AS_STRING);
|
297
|
+
msg.append_argument(Holder::create_string("MyMethod"), DBUS_TYPE_STRING_AS_STRING);
|
298
|
+
msg.append_argument(Holder::create_string("Hello World"), DBUS_TYPE_STRING_AS_STRING);
|
299
|
+
conn->send_with_reply_and_block(msg);
|
300
|
+
|
301
|
+
// Wait for the method call to be received
|
302
|
+
bool method_called = false;
|
303
|
+
std::chrono::time_point<std::chrono::steady_clock> end = std::chrono::steady_clock::now() + std::chrono::seconds(1);
|
304
|
+
while (std::chrono::steady_clock::now() < end) {
|
305
|
+
conn->read_write();
|
306
|
+
auto method_call = conn->pop_message();
|
307
|
+
if (method_call.is_valid()) {
|
308
|
+
EXPECT_EQ(method_call.get_path(), "/my/custom/path");
|
309
|
+
EXPECT_EQ(method_call.get_interface(), "my.interface");
|
310
|
+
EXPECT_EQ(method_call.get_member(), "MyMethod");
|
311
|
+
|
312
|
+
Holder arguments = method_call.extract();
|
313
|
+
EXPECT_EQ(arguments.type(), Holder::Type::STRING);
|
314
|
+
EXPECT_EQ(arguments.get_string(), "Hello World");
|
315
|
+
|
316
|
+
Message reply = Message::create_error(method_call, "simpledbus.error.unknown", "Unknown error");
|
317
|
+
conn->send(reply);
|
318
|
+
method_called = true;
|
319
|
+
break;
|
320
|
+
}
|
321
|
+
}
|
322
|
+
EXPECT_TRUE(method_called);
|
323
|
+
}
|
324
|
+
|
325
|
+
TEST_F(MessageTest, CopyConstructor) {
|
326
|
+
// Create an original message
|
327
|
+
Message original = Message::create_method_call("org.example.Bus", "/org/example/Path", "org.example.Interface",
|
328
|
+
"ExampleMethod");
|
329
|
+
original.append_argument(Holder::create_string("Test argument"), "s");
|
330
|
+
|
331
|
+
// Test copy constructor
|
332
|
+
Message copy_constructed(original);
|
333
|
+
EXPECT_TRUE(copy_constructed.is_valid());
|
334
|
+
EXPECT_NE(copy_constructed.get_unique_id(), original.get_unique_id());
|
335
|
+
EXPECT_EQ(copy_constructed.get_path(), original.get_path());
|
336
|
+
EXPECT_EQ(copy_constructed.get_interface(), original.get_interface());
|
337
|
+
EXPECT_EQ(copy_constructed.get_member(), original.get_member());
|
338
|
+
|
339
|
+
// Verify that the original message is still valid and unchanged
|
340
|
+
EXPECT_TRUE(original.is_valid());
|
341
|
+
EXPECT_EQ(original.get_path(), "/org/example/Path");
|
342
|
+
EXPECT_EQ(original.get_interface(), "org.example.Interface");
|
343
|
+
EXPECT_EQ(original.get_member(), "ExampleMethod");
|
344
|
+
}
|
345
|
+
|
346
|
+
TEST_F(MessageTest, CopyAssignment) {
|
347
|
+
// Create an original message
|
348
|
+
Message original = Message::create_method_call("org.example.Bus", "/org/example/Path", "org.example.Interface",
|
349
|
+
"ExampleMethod");
|
350
|
+
original.append_argument(Holder::create_string("Test argument"), "s");
|
351
|
+
|
352
|
+
// Test copy assignment
|
353
|
+
Message copy_assigned;
|
354
|
+
copy_assigned = original;
|
355
|
+
EXPECT_TRUE(copy_assigned.is_valid());
|
356
|
+
EXPECT_NE(copy_assigned.get_unique_id(), original.get_unique_id());
|
357
|
+
EXPECT_EQ(copy_assigned.get_path(), original.get_path());
|
358
|
+
EXPECT_EQ(copy_assigned.get_interface(), original.get_interface());
|
359
|
+
EXPECT_EQ(copy_assigned.get_member(), original.get_member());
|
360
|
+
|
361
|
+
// Verify that the original message is still valid and unchanged
|
362
|
+
EXPECT_TRUE(original.is_valid());
|
363
|
+
EXPECT_EQ(original.get_path(), "/org/example/Path");
|
364
|
+
EXPECT_EQ(original.get_interface(), "org.example.Interface");
|
365
|
+
EXPECT_EQ(original.get_member(), "ExampleMethod");
|
366
|
+
}
|
367
|
+
|
368
|
+
TEST_F(MessageTest, MoveConstructor) {
|
369
|
+
// Create an original message
|
370
|
+
Message original = Message::create_method_call("org.example.Bus", "/org/example/Path", "org.example.Interface",
|
371
|
+
"ExampleMethod");
|
372
|
+
original.append_argument(Holder::create_string("Test argument"), "s");
|
373
|
+
|
374
|
+
// Test move constructor
|
375
|
+
Message move_constructed(std::move(original));
|
376
|
+
EXPECT_TRUE(move_constructed.is_valid());
|
377
|
+
EXPECT_FALSE(original.is_valid()); // Original should be invalidated
|
378
|
+
EXPECT_EQ(move_constructed.get_path(), "/org/example/Path");
|
379
|
+
EXPECT_EQ(move_constructed.get_interface(), "org.example.Interface");
|
380
|
+
EXPECT_EQ(move_constructed.get_member(), "ExampleMethod");
|
381
|
+
}
|
382
|
+
|
383
|
+
TEST_F(MessageTest, MoveAssignment) {
|
384
|
+
// Create an original message
|
385
|
+
Message original = Message::create_method_call("org.example.Bus", "/org/example/Path", "org.example.Interface",
|
386
|
+
"ExampleMethod");
|
387
|
+
original.append_argument(Holder::create_string("Test argument"), "s");
|
388
|
+
|
389
|
+
// Test move assignment
|
390
|
+
Message move_assigned;
|
391
|
+
move_assigned = std::move(original);
|
392
|
+
EXPECT_TRUE(move_assigned.is_valid());
|
393
|
+
EXPECT_FALSE(original.is_valid()); // Original should be invalidated
|
394
|
+
EXPECT_EQ(move_assigned.get_path(), "/org/example/Path");
|
395
|
+
EXPECT_EQ(move_assigned.get_interface(), "org.example.Interface");
|
396
|
+
EXPECT_EQ(move_assigned.get_member(), "ExampleMethod");
|
397
|
+
}
|
@@ -0,0 +1,76 @@
|
|
1
|
+
#include <gmock/gmock.h>
|
2
|
+
#include <gtest/gtest.h>
|
3
|
+
|
4
|
+
#include <simpledbus/base/Path.h>
|
5
|
+
|
6
|
+
using namespace SimpleDBus;
|
7
|
+
|
8
|
+
TEST(Path, CountElements) {
|
9
|
+
EXPECT_EQ(0, Path::count_elements("/"));
|
10
|
+
EXPECT_EQ(1, Path::count_elements("/a"));
|
11
|
+
EXPECT_EQ(2, Path::count_elements("/a/b"));
|
12
|
+
EXPECT_EQ(3, Path::count_elements("/a/b/c"));
|
13
|
+
}
|
14
|
+
|
15
|
+
TEST(Path, FetchElements) {
|
16
|
+
EXPECT_EQ("/", Path::fetch_elements("/a/b/c/d", 0));
|
17
|
+
EXPECT_EQ("/a", Path::fetch_elements("/a/b/c/d", 1));
|
18
|
+
EXPECT_EQ("/a/b", Path::fetch_elements("/a/b/c/d", 2));
|
19
|
+
EXPECT_EQ("/a/b/c", Path::fetch_elements("/a/b/c/d", 3));
|
20
|
+
EXPECT_EQ("/a/b/c/d", Path::fetch_elements("/a/b/c/d", 4));
|
21
|
+
}
|
22
|
+
|
23
|
+
TEST(Path, SplitElements) {
|
24
|
+
EXPECT_THAT(Path::split_elements("/"), ::testing::SizeIs(0));
|
25
|
+
EXPECT_THAT(Path::split_elements("/a"), ::testing::ElementsAre("a"));
|
26
|
+
EXPECT_THAT(Path::split_elements("/a/b"), ::testing::ElementsAre("a", "b"));
|
27
|
+
EXPECT_THAT(Path::split_elements("/a/b/c"), ::testing::ElementsAre("a", "b", "c"));
|
28
|
+
EXPECT_THAT(Path::split_elements("/a/b/c/d"), ::testing::ElementsAre("a", "b", "c", "d"));
|
29
|
+
}
|
30
|
+
|
31
|
+
TEST(Path, RecognizeDescendant) {
|
32
|
+
EXPECT_FALSE(Path::is_descendant("/a/b", "/a/b"));
|
33
|
+
EXPECT_FALSE(Path::is_descendant("/a/b", "/a"));
|
34
|
+
EXPECT_FALSE(Path::is_descendant("/a/b", "/"));
|
35
|
+
|
36
|
+
EXPECT_TRUE(Path::is_descendant("/a/b", "/a/b/c"));
|
37
|
+
EXPECT_TRUE(Path::is_descendant("/a/b", "/a/b/c/d"));
|
38
|
+
EXPECT_TRUE(Path::is_descendant("/a/b", "/a/b/c/d/e"));
|
39
|
+
}
|
40
|
+
|
41
|
+
TEST(Path, RecognizeAscendant) {
|
42
|
+
EXPECT_FALSE(Path::is_ascendant("/a/b", "/a/b"));
|
43
|
+
EXPECT_TRUE(Path::is_ascendant("/a/b", "/a"));
|
44
|
+
EXPECT_TRUE(Path::is_ascendant("/a/b", "/"));
|
45
|
+
|
46
|
+
EXPECT_FALSE(Path::is_ascendant("/a/b", "/a/b/c"));
|
47
|
+
EXPECT_FALSE(Path::is_ascendant("/a/b", "/a/b/c/d"));
|
48
|
+
EXPECT_FALSE(Path::is_ascendant("/a/b", "/a/b/c/d/e"));
|
49
|
+
}
|
50
|
+
|
51
|
+
TEST(Path, RecognizeChild) {
|
52
|
+
EXPECT_FALSE(Path::is_child("/a/b", "/a/b"));
|
53
|
+
EXPECT_FALSE(Path::is_child("/a/b", "/a"));
|
54
|
+
EXPECT_FALSE(Path::is_child("/a/b", "/"));
|
55
|
+
|
56
|
+
EXPECT_TRUE(Path::is_child("/a/b", "/a/b/c"));
|
57
|
+
EXPECT_FALSE(Path::is_child("/a/b", "/a/b/c/d"));
|
58
|
+
EXPECT_FALSE(Path::is_child("/a/b", "/a/b/c/d/e"));
|
59
|
+
}
|
60
|
+
|
61
|
+
TEST(Path, RecognizeParent) {
|
62
|
+
EXPECT_FALSE(Path::is_parent("/a/b", "/a/b"));
|
63
|
+
EXPECT_TRUE(Path::is_parent("/a/b", "/a"));
|
64
|
+
EXPECT_FALSE(Path::is_parent("/a/b", "/"));
|
65
|
+
|
66
|
+
EXPECT_FALSE(Path::is_parent("/a/b", "/a/b/c"));
|
67
|
+
EXPECT_FALSE(Path::is_parent("/a/b", "/a/b/c/d"));
|
68
|
+
EXPECT_FALSE(Path::is_parent("/a/b", "/a/b/c/d/e"));
|
69
|
+
}
|
70
|
+
|
71
|
+
TEST(Path, GenerateNextChild) {
|
72
|
+
EXPECT_EQ("/a", Path::next_child("/", "/a/b/c/d/e"));
|
73
|
+
EXPECT_EQ("/a/b", Path::next_child("/a", "/a/b/c/d/e"));
|
74
|
+
EXPECT_EQ("/a/b/c", Path::next_child("/a/b", "/a/b/c/d/e"));
|
75
|
+
EXPECT_EQ("/a/b/c/d", Path::next_child("/a/b/c", "/a/b/c/d/e"));
|
76
|
+
}
|
@@ -0,0 +1,109 @@
|
|
1
|
+
#include <gtest/gtest.h>
|
2
|
+
|
3
|
+
#include <simpledbus/advanced/Proxy.h>
|
4
|
+
|
5
|
+
using namespace SimpleDBus;
|
6
|
+
|
7
|
+
TEST(ProxyChildren, AppendChild) {
|
8
|
+
Proxy p = Proxy(nullptr, "", "/a/b");
|
9
|
+
|
10
|
+
p.path_add("/a/b/c", Holder());
|
11
|
+
EXPECT_EQ(1, p.children().size());
|
12
|
+
EXPECT_EQ(1, p.children().count("/a/b/c"));
|
13
|
+
EXPECT_EQ("/a/b/c", p.children().at("/a/b/c")->path());
|
14
|
+
}
|
15
|
+
|
16
|
+
TEST(ProxyChildren, AppendRepeatedChild) {
|
17
|
+
Proxy p = Proxy(nullptr, "", "/a/b");
|
18
|
+
p.path_add("/a/b/c", Holder());
|
19
|
+
|
20
|
+
// Attempting to add a child with the same name should be a no-op
|
21
|
+
p.path_add("/a/b/c", Holder());
|
22
|
+
EXPECT_EQ(1, p.children().size());
|
23
|
+
}
|
24
|
+
|
25
|
+
TEST(ProxyChildren, AppendExtendedChild) {
|
26
|
+
Proxy p = Proxy(nullptr, "", "/");
|
27
|
+
p.path_add("/a/b/c/d", Holder());
|
28
|
+
|
29
|
+
ASSERT_EQ(1, p.children().size());
|
30
|
+
ASSERT_EQ(1, p.children().count("/a"));
|
31
|
+
|
32
|
+
std::shared_ptr<Proxy> p_a = std::dynamic_pointer_cast<Proxy>(p.children().at("/a"));
|
33
|
+
ASSERT_EQ(1, p_a->children().size());
|
34
|
+
ASSERT_EQ(1, p_a->children().count("/a/b"));
|
35
|
+
|
36
|
+
std::shared_ptr<Proxy> p_a_b = std::dynamic_pointer_cast<Proxy>(p_a->children().at("/a/b"));
|
37
|
+
ASSERT_EQ(1, p_a_b->children().size());
|
38
|
+
ASSERT_EQ(1, p_a_b->children().count("/a/b/c"));
|
39
|
+
|
40
|
+
std::shared_ptr<Proxy> p_a_b_c = std::dynamic_pointer_cast<Proxy>(p_a_b->children().at("/a/b/c"));
|
41
|
+
ASSERT_EQ(1, p_a_b_c->children().size());
|
42
|
+
ASSERT_EQ(1, p_a_b_c->children().count("/a/b/c/d"));
|
43
|
+
}
|
44
|
+
|
45
|
+
TEST(ProxyChildren, RemoveSelf) {
|
46
|
+
Proxy p = Proxy(nullptr, "", "/");
|
47
|
+
|
48
|
+
// Should notify that the proxy can be safely deleted, as nothing worth keeping is left
|
49
|
+
ASSERT_TRUE(p.path_remove("/", Holder::create_array()));
|
50
|
+
|
51
|
+
// Add a child path without any interfaces
|
52
|
+
p.path_add("/a", Holder());
|
53
|
+
|
54
|
+
// Attempt to remove the path while holding a local copy of the child, should be a no-op
|
55
|
+
{
|
56
|
+
std::shared_ptr<Proxy> p_a = std::dynamic_pointer_cast<Proxy>(p.children().at("/a"));
|
57
|
+
// As there is another copy of the child, the proxy should not be deleted
|
58
|
+
ASSERT_FALSE(p.path_remove("/", Holder::create_array()));
|
59
|
+
ASSERT_EQ(1, p.children().size());
|
60
|
+
}
|
61
|
+
|
62
|
+
// Should notify that the proxy can be safely deleted, as nothing worth keeping is left
|
63
|
+
ASSERT_TRUE(p.path_remove("/", Holder::create_array()));
|
64
|
+
ASSERT_EQ(0, p.children().size());
|
65
|
+
}
|
66
|
+
|
67
|
+
TEST(ProxyChildren, RemoveChildNoInterfaces) {
|
68
|
+
Proxy p = Proxy(nullptr, "", "/");
|
69
|
+
p.path_add("/a", Holder());
|
70
|
+
|
71
|
+
// Attempt to remove the path while holding a local copy of the child, should be a no-op
|
72
|
+
{
|
73
|
+
std::shared_ptr<Proxy> p_a = std::dynamic_pointer_cast<Proxy>(p.children().at("/a"));
|
74
|
+
// As there is another copy of the child, the proxy should not be deleted
|
75
|
+
ASSERT_FALSE(p.path_remove("/a", Holder::create_array()));
|
76
|
+
ASSERT_EQ(1, p.children().size());
|
77
|
+
}
|
78
|
+
|
79
|
+
// As only the child was removed, the main proxy should not be deleted.
|
80
|
+
ASSERT_FALSE(p.path_remove("/a", Holder::create_array()));
|
81
|
+
ASSERT_EQ(0, p.children().size());
|
82
|
+
}
|
83
|
+
|
84
|
+
TEST(ProxyChildren, RemoveChildWithInterfaces) {
|
85
|
+
Proxy p = Proxy(nullptr, "", "/");
|
86
|
+
|
87
|
+
Holder managed_interfaces = Holder::create_dict();
|
88
|
+
managed_interfaces.dict_append(Holder::STRING, "i.1", Holder());
|
89
|
+
managed_interfaces.dict_append(Holder::STRING, "i.2", Holder());
|
90
|
+
p.path_add("/a", managed_interfaces);
|
91
|
+
|
92
|
+
Holder removed_interfaces = Holder::create_array();
|
93
|
+
removed_interfaces.array_append(Holder::create_string("i.2"));
|
94
|
+
p.path_remove("/a", removed_interfaces);
|
95
|
+
|
96
|
+
// Because /a has one interface still, it should still be in the children map.
|
97
|
+
ASSERT_EQ(1, p.children().size());
|
98
|
+
{
|
99
|
+
std::shared_ptr<Proxy> p_a = std::dynamic_pointer_cast<Proxy>(p.children().at("/a"));
|
100
|
+
ASSERT_EQ(1, p_a->interfaces_count());
|
101
|
+
ASSERT_EQ(1, p_a->interfaces().count("i.1"));
|
102
|
+
}
|
103
|
+
|
104
|
+
// Remove the second interface
|
105
|
+
removed_interfaces = Holder::create_array();
|
106
|
+
removed_interfaces.array_append(Holder::create_string("i.1"));
|
107
|
+
p.path_remove("/a", removed_interfaces);
|
108
|
+
ASSERT_EQ(0, p.children().size());
|
109
|
+
}
|
@@ -0,0 +1,102 @@
|
|
1
|
+
#include <gtest/gtest.h>
|
2
|
+
|
3
|
+
#include <simpledbus/advanced/Proxy.h>
|
4
|
+
#include <simpledbus/advanced/InterfaceRegistry.h>
|
5
|
+
|
6
|
+
using namespace SimpleDBus;
|
7
|
+
|
8
|
+
const AutoRegisterInterface<Interface> registry_i1{
|
9
|
+
"i.1",
|
10
|
+
// clang-format off
|
11
|
+
[](std::shared_ptr<Connection> conn, const std::string& bus_name, const std::string& path, const Holder& options) -> std::shared_ptr<SimpleDBus::Interface> {
|
12
|
+
return std::make_shared<Interface>(conn, bus_name, path, "i.1");
|
13
|
+
}
|
14
|
+
// clang-format on
|
15
|
+
};
|
16
|
+
|
17
|
+
const AutoRegisterInterface<Interface> registry_i2{
|
18
|
+
"i.2",
|
19
|
+
// clang-format off
|
20
|
+
[](std::shared_ptr<Connection> conn, const std::string& bus_name, const std::string& path, const Holder& options) -> std::shared_ptr<SimpleDBus::Interface> {
|
21
|
+
return std::make_shared<Interface>(conn, bus_name, path, "i.2");
|
22
|
+
}
|
23
|
+
// clang-format on
|
24
|
+
};
|
25
|
+
|
26
|
+
const AutoRegisterInterface<Interface> registry_i3{
|
27
|
+
"i.3",
|
28
|
+
// clang-format off
|
29
|
+
[](std::shared_ptr<Connection> conn, const std::string& bus_name, const std::string& path, const Holder& options) -> std::shared_ptr<SimpleDBus::Interface> {
|
30
|
+
return std::make_shared<Interface>(conn, bus_name, path, "i.3");
|
31
|
+
}
|
32
|
+
// clang-format on
|
33
|
+
};
|
34
|
+
|
35
|
+
TEST(ProxyInterfaces, LoadInterfaces) {
|
36
|
+
Holder managed_interfaces = Holder::create_dict();
|
37
|
+
managed_interfaces.dict_append(Holder::STRING, "i.1", Holder());
|
38
|
+
|
39
|
+
Proxy h = Proxy(nullptr, "", "/");
|
40
|
+
EXPECT_FALSE(h.interfaces_loaded());
|
41
|
+
|
42
|
+
// TODO: Check that all properties of the interface are correctly loaded.
|
43
|
+
|
44
|
+
h.interfaces_load(managed_interfaces);
|
45
|
+
|
46
|
+
EXPECT_TRUE(h.interfaces_loaded());
|
47
|
+
EXPECT_EQ(1, h.interfaces().size());
|
48
|
+
EXPECT_EQ(1, h.interfaces().count("i.1"));
|
49
|
+
}
|
50
|
+
|
51
|
+
TEST(ProxyInterfaces, UnloadInterfaces) {
|
52
|
+
Holder managed_interfaces = Holder::create_dict();
|
53
|
+
managed_interfaces.dict_append(Holder::STRING, "i.1", Holder());
|
54
|
+
managed_interfaces.dict_append(Holder::STRING, "i.2", Holder());
|
55
|
+
managed_interfaces.dict_append(Holder::STRING, "i.3", Holder());
|
56
|
+
|
57
|
+
Proxy h = Proxy(nullptr, "", "/");
|
58
|
+
h.interfaces_load(managed_interfaces);
|
59
|
+
EXPECT_EQ(3, h.interfaces_count());
|
60
|
+
|
61
|
+
Holder removed_interfaces = Holder::create_array();
|
62
|
+
removed_interfaces.array_append(Holder::create_string("i.3"));
|
63
|
+
h.interfaces_unload(removed_interfaces);
|
64
|
+
|
65
|
+
EXPECT_EQ(2, h.interfaces_count());
|
66
|
+
EXPECT_TRUE(h.interfaces_loaded());
|
67
|
+
EXPECT_FALSE(h.interfaces().at("i.3")->is_loaded());
|
68
|
+
|
69
|
+
removed_interfaces = Holder::create_array();
|
70
|
+
removed_interfaces.array_append(Holder::create_string("i.2"));
|
71
|
+
h.interfaces_unload(removed_interfaces);
|
72
|
+
|
73
|
+
EXPECT_EQ(1, h.interfaces_count());
|
74
|
+
EXPECT_TRUE(h.interfaces_loaded());
|
75
|
+
EXPECT_FALSE(h.interfaces().at("i.2")->is_loaded());
|
76
|
+
|
77
|
+
removed_interfaces = Holder::create_array();
|
78
|
+
removed_interfaces.array_append(Holder::create_string("i.1"));
|
79
|
+
h.interfaces_unload(removed_interfaces);
|
80
|
+
|
81
|
+
EXPECT_EQ(0, h.interfaces_count());
|
82
|
+
EXPECT_FALSE(h.interfaces_loaded());
|
83
|
+
EXPECT_FALSE(h.interfaces().at("i.1")->is_loaded());
|
84
|
+
}
|
85
|
+
|
86
|
+
TEST(ProxyInterfaces, ReloadInterfaces) {
|
87
|
+
Holder managed_interfaces = Holder::create_dict();
|
88
|
+
managed_interfaces.dict_append(Holder::STRING, "i.1", Holder());
|
89
|
+
managed_interfaces.dict_append(Holder::STRING, "i.2", Holder());
|
90
|
+
managed_interfaces.dict_append(Holder::STRING, "i.3", Holder());
|
91
|
+
|
92
|
+
Proxy h = Proxy(nullptr, "", "/");
|
93
|
+
h.interfaces_load(managed_interfaces);
|
94
|
+
EXPECT_EQ(3, h.interfaces_count());
|
95
|
+
|
96
|
+
managed_interfaces = Holder::create_dict();
|
97
|
+
managed_interfaces.dict_append(Holder::STRING, "i.1", Holder());
|
98
|
+
managed_interfaces.dict_append(Holder::STRING, "i.3", Holder());
|
99
|
+
h.interfaces_reload(managed_interfaces);
|
100
|
+
|
101
|
+
EXPECT_EQ(2, h.interfaces_count());
|
102
|
+
}
|