Subject: bug#43252: 27.1; DBus properties lack type hints or overrides

From: Hugh Daschbach <[email-masked]>
Date: Thu, 10 Sep 2020 15:53:29 -0700

Michael Albinus writes:

> Michael Albinus <[email-masked]> writes:
>
> Hi Hugh,
>
>> Reading the BlueZ D-Bus GATT API description, you seem to need 
>> only
>> basic types and arrays of basic types as properties. So I will 
>> start
>> adding arrays of basic types. Other, more complex compound 
>> types will
>> follow later.

That's mostly true.  There is another BlueZ interface 
(advertising) that
take a byte keyed dictionary.  It isn't obvious from the 
documentation
https://git.kernel.org/pub/scm/bluetooth/bluez.git/tree/doc/advertising-api.txt.
But the Manufacturer ID described mentioned in the 
ManufacturerData
dictionary description is a byte value.

The property table in the BlueZ source code looks like:

	{ "ManufacturerData", "a{qv}", get_manufacturer_data, 
	NULL,
						manufacturer_data_exists 
						},

(https://git.kernel.org/pub/scm/bluetooth/bluez.git/tree/client/advertising.c#n465)

It isn't clear that there's a commitment to support such a data
structure.  The DBus info page says "Every dictionary entry has a 
string
as a key".

> I have pushed my recent work to master. dbus-register-property,
> dbus-get-property, dbus-get-all-properties and
> dbus-get-all-managed-objects shall work now for your byte
> array. dbus-set-property will follow tomorrow, as well as other 
> compound
> types but array.
>

With your latest work, I have successful tests for byte arrays, 
string
arrays, object arrays, boolean arrays, and string keyed 
dictionaries.

I haven't been able to verify property signatures programatically. 
I
have turned on dbus-debug and verified signatures reported by the
message formatter.  I assume introspection is in the queue.  With
introspection, we could extend the tests.

I assume I shouldn't care about tests that fail with debug turned 
on.

WRT byte keyed dictionaries, I've attached a failing test.  I 
don't know
if you want to look at it or not.

Still waiting for a response from [email-masked].  I assume a 
delay of a
few days is to be expected.

Thanks again,
Hugh

[1mdiff --git a/test/lisp/net/dbus-tests.el b/test/lisp/net/dbus-tests.el[m
[1mindex a8e052efbef..c0e85449a37 100644[m
[1m--- a/test/lisp/net/dbus-tests.el[m
[1m+++ b/test/lisp/net/dbus-tests.el[m
[36m@@ -521,6 +521,56 @@[m [mdbus-test05-register-property-several-paths[m
     ;; Cleanup.[m
     (dbus-unregister-service :session dbus--test-service)))[m
 [m
[32m+[m[32m(ert-deftest dbus-test05-register-property-types ()[m
[32m+[m[32m  "Check property type preservation for an own service."[m
[32m+[m[32m  (skip-unless dbus--test-enabled-session-bus)[m
[32m+[m[32m  (dbus-ignore-errors (dbus-unregister-service :session dbus--test-service))[m
[32m+[m
[32m+[m[32m  (unwind-protect[m
[32m+[m[32m    (let ((object-array "ByteDictionary")[m
[32m+[m[32m          (expected '((8[m
[32m+[m[32m                       ("byte eight"))[m
[32m+[m[32m                      (16[m
[32m+[m[32m                       ("byte sixteen"))[m
[32m+[m[32m                      (48[m
[32m+[m[32m                       ((8 9 10))))))[m
[32m+[m[32m      (should[m
[32m+[m[32m       (equal[m
[32m+[m[32m        (dbus-register-property[m
[32m+[m[32m         :session dbus--test-service dbus--test-path[m
[32m+[m[32m         dbus--test-interface object-array :read[m
[32m+[m[32m         '(:array[m
[32m+[m[32m           :dict-entry (:byte 8 (:variant :string "byte-eight"))[m
[32m+[m[32m           :dict-entry (:byte 16 (:variant :object-path "/byte sixteen"))[m
[32m+[m[32m           :dict-entry (:byte 48  (:variant (:array :byte 8 :byte 9 :byte 10)))))[m
[32m+[m[32m        `((:property :session ,dbus--test-interface ,object-array)[m
[32m+[m[32m          (,dbus--test-service ,dbus--test-path))))[m
[32m+[m[32m      (should[m
[32m+[m[32m       (equal[m
[32m+[m[32m        (dbus-get-property[m
[32m+[m[32m         :session dbus--test-service dbus--test-path[m
[32m+[m[32m         dbus--test-interface object-array)[m
[32m+[m[32m        expected))[m
[32m+[m
[32m+[m
[32m+[m[32m      ;; A test for `dbus-get-property' shall be added.[m
[32m+[m
[32m+[m[32m      (let ((result[m
[32m+[m[32m             (dbus-get-all-properties[m
[32m+[m[32m              :session dbus--test-service dbus--test-path[m
[32m+[m[32m              dbus--test-interface)))[m
[32m+[m[32m        (should (equal (cdr (assoc object-array result)) expected)))[m
[32m+[m
[32m+[m[32m      (let ((result[m
[32m+[m[32m             (dbus-get-all-managed-objects :session dbus--test-service "/"))[m
[32m+[m[32m            result)[m
[32m+[m[32m        (should (setq result1 (cadr (assoc dbus--test-path result))))[m
[32m+[m[32m        (should (setq result1 (cadr (assoc dbus--test-interface result1))))[m
[32m+[m[32m        (should (equal (cdr (assoc object-array result1)) expected))))[m
[32m+[m
[32m+[m[32m    ;; Cleanup.[m
[32m+[m[32m    (dbus-unregister-service :session dbus--test-service)))[m
[32m+[m
 (defun dbus-test-all (&optional interactive)[m
   "Run all tests for \\[dbus]."[m
   (interactive "p")[m