]> git.eshelyaron.com Git - emacs.git/commitdiff
* src/dbusbind.c (xd_signature): Better type check for array elements.
authorMichael Albinus <michael.albinus@gmx.de>
Mon, 5 Oct 2020 11:58:28 +0000 (13:58 +0200)
committerMichael Albinus <michael.albinus@gmx.de>
Mon, 5 Oct 2020 11:58:28 +0000 (13:58 +0200)
* test/lisp/net/dbus-tests.el (dbus-test01-compound-types): Extend test.

src/dbusbind.c
test/lisp/net/dbus-tests.el

index 1ac77313a35c6e96e374fcfe4af9cf7314ed2c0a..7904606d39e29948bdc6ba70d7b5d617131a7d5a 100644 (file)
@@ -446,12 +446,18 @@ xd_signature (char *signature, int dtype, int parent_type, Lisp_Object object)
        {
          Lisp_Object elt1 = XD_NEXT_VALUE (elt);
          if (CONSP (elt1) && STRINGP (XCAR (elt1)) && NILP (XCDR (elt1)))
-           subsig = SSDATA (XCAR (elt1));
+           {
+             subsig = SSDATA (XCAR (elt1));
+             elt = Qnil;
+           }
        }
 
       while (!NILP (elt))
        {
-         if (subtype != XD_OBJECT_TO_DBUS_TYPE (CAR_SAFE (elt)))
+         char x[DBUS_MAXIMUM_SIGNATURE_LENGTH];
+         subtype = XD_OBJECT_TO_DBUS_TYPE (CAR_SAFE (elt));
+         xd_signature (x, subtype, dtype, CAR_SAFE (XD_NEXT_VALUE (elt)));
+         if (strcmp (subsig, x) != 0)
            wrong_type_argument (intern ("D-Bus"), CAR_SAFE (elt));
          elt = CDR_SAFE (XD_NEXT_VALUE (elt));
        }
index 94816bb4929778a6784bd892f60c4a2bfa050cbd..cd2e166c103b4405a68fb6f341c6fd782afd34df 100644 (file)
   (should-error
    (dbus-check-arguments :session dbus--test-service :object-path)
    :type 'wrong-type-argument)
-  ;; Raises an error on stdin.
+  ;; Raises an error on stderr.
   (should-error
    (dbus-check-arguments :session dbus--test-service :object-path "string")
    :type 'dbus-error)
   (should-error
    (dbus-check-arguments :session dbus--test-service :signature)
    :type 'wrong-type-argument)
-  ;; Raises an error on stdin.
+  ;; Raises an error on stderr.
   (should-error
    (dbus-check-arguments :session dbus--test-service :signature "string")
    :type 'dbus-error)
   (should
    (dbus-check-arguments
     :session dbus--test-service '(:array :string "string1" "string2")))
+  (should
+   (dbus-check-arguments
+    :session dbus--test-service '(:array :signature "s" :signature "ao")))
   ;; Empty array (of strings).
   (should (dbus-check-arguments :session dbus--test-service '(:array)))
+  ;; Empty array (of object paths).
   (should
    (dbus-check-arguments :session dbus--test-service '(:array :signature "o")))
   ;; Different element types.
     :session dbus--test-service
     '(:array :string "string" :object-path "/object/path"))
    :type 'wrong-type-argument)
+  ;; Different variant types in array don't matter.
+  (should
+   (dbus-check-arguments
+    :session dbus--test-service
+    '(:array
+      (:variant :string "string1")
+      (:variant (:struct :string "string2" :object-path "/object/path")))))
 
   ;; `:variant'.  It contains exactly one element.
   (should
    (dbus-check-arguments
     :session dbus--test-service
     '(:array (:dict-entry :string "string" :boolean nil))))
-  ;; This is an alternative syntax.  FIXME: Shall this be supported?
+  ;; This is an alternative syntax.
   (should
    (dbus-check-arguments
     :session dbus--test-service
    (dbus-check-arguments
     :session dbus--test-service '(:dict-entry :string "string" :boolean t))
    :type 'wrong-type-argument)
-  ;; Different dict entry types are not ched.  FIXME: Add check.
-  ;; (should-error
-  ;;  (dbus-check-arguments
-  ;;   :session dbus--test-service
-  ;;   '(:array
-  ;;     (:dict-entry :string "string1" :boolean t)
-  ;;     (:dict-entry :string "string2" :object-path "/object/path")))
-  ;;  :type 'wrong-type-argument)
+  ;; Different dict entry types in array.
+  (should-error
+   (dbus-check-arguments
+    :session dbus--test-service
+    '(:array
+      (:dict-entry :string "string1" :boolean t)
+      (:dict-entry :string "string2" :object-path "/object/path")))
+   :type 'wrong-type-argument)
 
   ;; `:struct'.  There is no restriction what could be an element of a struct.
   (should
   ;; Empty struct.
   (should-error
    (dbus-check-arguments :session dbus--test-service '(:struct))
+   :type 'wrong-type-argument)
+  ;; Different struct types in array.
+  (should-error
+   (dbus-check-arguments
+    :session dbus--test-service
+    '(:array
+      (:struct :string "string1" :boolean t)
+      (:struct :object-path "/object/path")))
    :type 'wrong-type-argument))
 
 (defun dbus--test-register-service (bus)