summary refs log tree commit diff
path: root/tests/services/telephony.scm
diff options
context:
space:
mode:
authorMaxim Cournoyer <maxim.cournoyer@gmail.com>2021-04-15 01:18:24 -0400
committerMaxim Cournoyer <maxim.cournoyer@gmail.com>2021-08-02 15:15:02 -0400
commit69dcc24c9f0cdfea674eb690e7755d26a25ced2b (patch)
tree657e1068cea480e45c8fe7ea4c15b0f982bae52a /tests/services/telephony.scm
parent8e1f94421873777c6bb0b83daa4f81cbacc8b3ff (diff)
downloadguix-69dcc24c9f0cdfea674eb690e7755d26a25ced2b.tar.gz
services: Add a service for Jami.
* gnu/services/telephony.scm (string-or-computed-file?)
(string-list?, account-fingerprint-list?): New procedures.
(maybe-string-list, maybe-account-fingerprint-list)
(maybe-boolean, maybe-string, jami-account-list): New configuration field
types.
(serialize-string-list, serialize-boolean, serialize-string)
(jami-account, jami-account->alist, jami-configuration)
(jami-account-list?, jami-account-list-maybe): New procedures.
(%jami-accounts): New variable.
(jami-configuration->command-line-arguments): New procedure.
(jami-dbus-session-activation, jami-shepherd-services): New procedures.
(jami-service-type): New variable.
* gnu/build/jami-service.scm: New file.
* gnu/tests/data/jami-dummy-account.dat: Likewise.
* gnu/tests/telephony.scm: Likewise.
* gnu/local.mk (GNU_SYSTEM_MODULES): Register them.
* Makefile.am (SCM_TESTS): Register the test file.
(dist_patch_DATA): Register the new data file.
* doc/guix.texi (Telephony Services): Document it.
Diffstat (limited to 'tests/services/telephony.scm')
-rw-r--r--tests/services/telephony.scm446
1 files changed, 446 insertions, 0 deletions
diff --git a/tests/services/telephony.scm b/tests/services/telephony.scm
new file mode 100644
index 0000000000..b4a0f120d4
--- /dev/null
+++ b/tests/services/telephony.scm
@@ -0,0 +1,446 @@
+;;; GNU Guix --- Functional package management for GNU
+;;; Copyright © 2021 Maxim Cournoyer <maxim.cournoyer@gmail.com>
+;;;
+;;; This file is part of GNU Guix.
+;;;
+;;; GNU Guix is free software; you can redistribute it and/or modify it
+;;; under the terms of the GNU General Public License as published by
+;;; the Free Software Foundation; either version 3 of the License, or (at
+;;; your option) any later version.
+;;;
+;;; GNU Guix is distributed in the hope that it will be useful, but
+;;; WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;;; GNU General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU General Public License
+;;; along with GNU Guix.  If not, see <http://www.gnu.org/licenses/>.
+
+(define-module (tests services telephony)
+  #:use-module (gnu build jami-service)
+  #:use-module (gnu services telephony)
+  #:use-module (srfi srfi-64))
+
+;;; Tests for the (gnu services telephony) and related modules.
+
+(test-begin "jami-service")
+
+(define parse-dbus-reply
+  (@@ (gnu build jami-service) parse-dbus-reply))
+
+(define parse-account-ids
+  (@@ (gnu build jami-service) parse-account-ids))
+
+(define parse-account-details
+  (@@ (gnu build jami-service) parse-account-details))
+
+(define parse-contacts
+  (@@ (gnu build jami-service) parse-contacts))
+
+(define jami-account->alist
+  (@@ (gnu services telephony) jami-account->alist))
+
+;; $ dbus-send --print-reply --dest="cx.ring.Ring" \
+;; "/cx/ring/Ring/ConfigurationManager" \
+;; "cx.ring.Ring.ConfigurationManager.getAccountList"
+(define getAccountList-reply "\
+method return time=1622217253.386711 sender=:1.7 -> destination=:1.14 serial=140 reply_serial=2
+   array [
+      string \"addf37fbb558d6a0\"
+      string \"d5cbeb7d08c98a65\"
+      string \"398af0c6b74ce101\"
+   ]
+")
+
+(test-equal "parse-account-ids"
+  '("addf37fbb558d6a0" "d5cbeb7d08c98a65" "398af0c6b74ce101")
+  (parse-account-ids getAccountList-reply))
+
+;; $ dbus-send --print-reply --dest="cx.ring.Ring" \
+;; "/cx/ring/Ring/ConfigurationManager" \
+;; "cx.ring.Ring.ConfigurationManager.getAccountDetails" \
+;; 'string:398af0c6b74ce101'
+(define getAccountDetails-reply "\
+method return time=1622254991.789588 sender=:1.7 -> destination=:1.19 serial=145 reply_serial=2
+   array [
+      dict entry(
+         string \"Account.accountDiscovery\"
+         string \"false\"
+      )
+      dict entry(
+         string \"Account.accountPublish\"
+         string \"false\"
+      )
+      dict entry(
+         string \"Account.activeCallLimit\"
+         string \"-1\"
+      )
+      dict entry(
+         string \"Account.alias\"
+         string \"some-rendezvous-point-name\"
+      )
+      dict entry(
+         string \"Account.allModeratorEnabled\"
+         string \"true\"
+      )
+      dict entry(
+         string \"Account.allowCertFromContact\"
+         string \"true\"
+      )
+      dict entry(
+         string \"Account.allowCertFromHistory\"
+         string \"true\"
+      )
+      dict entry(
+         string \"Account.allowCertFromTrusted\"
+         string \"true\"
+      )
+      dict entry(
+         string \"Account.archiveHasPassword\"
+         string \"false\"
+      )
+      dict entry(
+         string \"Account.audioPortMax\"
+         string \"32766\"
+      )
+      dict entry(
+         string \"Account.audioPortMin\"
+         string \"16384\"
+      )
+      dict entry(
+         string \"Account.autoAnswer\"
+         string \"false\"
+      )
+      dict entry(
+         string \"Account.defaultModerators\"
+         string \"\"
+      )
+      dict entry(
+         string \"Account.deviceID\"
+         string \"94b4070fc7a8afa8482c777a9822c52e6af2e1bd\"
+      )
+      dict entry(
+         string \"Account.deviceName\"
+         string \"some-device\"
+      )
+      dict entry(
+         string \"Account.dhtProxyListUrl\"
+         string \"https://config.jami.net/proxyList\"
+      )
+      dict entry(
+         string \"Account.displayName\"
+         string \"some-rendezvous-point-name\"
+      )
+      dict entry(
+         string \"Account.dtmfType\"
+         string \"overrtp\"
+      )
+      dict entry(
+         string \"Account.enable\"
+         string \"true\"
+      )
+      dict entry(
+         string \"Account.hasCustomUserAgent\"
+         string \"false\"
+      )
+      dict entry(
+         string \"Account.hostname\"
+         string \"bootstrap.jami.net\"
+      )
+      dict entry(
+         string \"Account.localInterface\"
+         string \"default\"
+      )
+      dict entry(
+         string \"Account.localModeratorsEnabled\"
+         string \"true\"
+      )
+      dict entry(
+         string \"Account.mailbox\"
+         string \"\"
+      )
+      dict entry(
+         string \"Account.managerUri\"
+         string \"\"
+      )
+      dict entry(
+         string \"Account.managerUsername\"
+         string \"\"
+      )
+      dict entry(
+         string \"Account.peerDiscovery\"
+         string \"false\"
+      )
+      dict entry(
+         string \"Account.presenceSubscribeSupported\"
+         string \"true\"
+      )
+      dict entry(
+         string \"Account.proxyEnabled\"
+         string \"false\"
+      )
+      dict entry(
+         string \"Account.proxyPushToken\"
+         string \"\"
+      )
+      dict entry(
+         string \"Account.proxyServer\"
+         string \"dhtproxy.jami.net:[80-95]\"
+      )
+      dict entry(
+         string \"Account.publishedAddress\"
+         string \"\"
+      )
+      dict entry(
+         string \"Account.publishedPort\"
+         string \"5060\"
+      )
+      dict entry(
+         string \"Account.publishedSameAsLocal\"
+         string \"true\"
+      )
+      dict entry(
+         string \"Account.rendezVous\"
+         string \"true\"
+      )
+      dict entry(
+         string \"Account.ringtoneEnabled\"
+         string \"true\"
+      )
+      dict entry(
+         string \"Account.ringtonePath\"
+         string \"/usr/share/ring/ringtones/default.opus\"
+      )
+      dict entry(
+         string \"Account.type\"
+         string \"RING\"
+      )
+      dict entry(
+         string \"Account.upnpEnabled\"
+         string \"true\"
+      )
+      dict entry(
+         string \"Account.useragent\"
+         string \"\"
+      )
+      dict entry(
+         string \"Account.username\"
+         string \"ccb8bbe2382343f7feb140710ab48aaf1b55634e\"
+      )
+      dict entry(
+         string \"Account.videoEnabled\"
+         string \"true\"
+      )
+      dict entry(
+         string \"Account.videoPortMax\"
+         string \"65534\"
+      )
+      dict entry(
+         string \"Account.videoPortMin\"
+         string \"49152\"
+      )
+      dict entry(
+         string \"DHT.PublicInCalls\"
+         string \"true\"
+      )
+      dict entry(
+         string \"DHT.port\"
+         string \"7766\"
+      )
+      dict entry(
+         string \"RingNS.account\"
+         string \"3989b55313a911b6f0c004748b49b254f35c9ef6\"
+      )
+      dict entry(
+         string \"RingNS.uri\"
+         string \"\"
+      )
+      dict entry(
+         string \"SRTP.enable\"
+         string \"true\"
+      )
+      dict entry(
+         string \"SRTP.keyExchange\"
+         string \"sdes\"
+      )
+      dict entry(
+         string \"SRTP.rtpFallback\"
+         string \"false\"
+      )
+      dict entry(
+         string \"STUN.enable\"
+         string \"false\"
+      )
+      dict entry(
+         string \"STUN.server\"
+         string \"\"
+      )
+      dict entry(
+         string \"TLS.certificateFile\"
+         string \"/var/lib/jami/.local/share/jami/398af0c6b74ce101/ring_device.crt\"
+      )
+      dict entry(
+         string \"TLS.certificateListFile\"
+         string \"\"
+      )
+      dict entry(
+         string \"TLS.ciphers\"
+         string \"\"
+      )
+      dict entry(
+         string \"TLS.method\"
+         string \"Automatic\"
+      )
+      dict entry(
+         string \"TLS.negotiationTimeoutSec\"
+         string \"-1\"
+      )
+      dict entry(
+         string \"TLS.password\"
+         string \"\"
+      )
+      dict entry(
+         string \"TLS.privateKeyFile\"
+         string \"/var/lib/jami/.local/share/jami/398af0c6b74ce101/ring_device.key\"
+      )
+      dict entry(
+         string \"TLS.requireClientCertificate\"
+         string \"true\"
+      )
+      dict entry(
+         string \"TLS.serverName\"
+         string \"\"
+      )
+      dict entry(
+         string \"TLS.verifyClient\"
+         string \"true\"
+      )
+      dict entry(
+         string \"TLS.verifyServer\"
+         string \"true\"
+      )
+      dict entry(
+         string \"TURN.enable\"
+         string \"true\"
+      )
+      dict entry(
+         string \"TURN.password\"
+         string \"ring\"
+      )
+      dict entry(
+         string \"TURN.realm\"
+         string \"ring\"
+      )
+      dict entry(
+         string \"TURN.server\"
+         string \"turn.jami.net\"
+      )
+      dict entry(
+         string \"TURN.username\"
+         string \"ring\"
+      )
+   ]
+")
+
+(test-equal "parse-account-details; username, alias and display name"
+  '("ccb8bbe2382343f7feb140710ab48aaf1b55634e" ;username
+    "some-rendezvous-point-name"               ;alias
+    "some-rendezvous-point-name")              ;displayName
+  (let ((account-details (parse-account-details getAccountDetails-reply)))
+    (list (assoc-ref account-details "Account.username")
+          (assoc-ref account-details "Account.alias")
+          (assoc-ref account-details "Account.displayName"))))
+
+(define getContacts-reply "\
+method return time=1627014042.752673 sender=:1.113 -> destination=:1.186 serial=220 reply_serial=2
+   array [
+      array [
+         dict entry(
+            string \"added\"
+            string \"1578883327\"
+         )
+         dict entry(
+            string \"confirmed\"
+            string \"true\"
+         )
+         dict entry(
+            string \"id\"
+            string \"1c7d5a09464223442549fef172a3cf6f4de9b01c\"
+         )
+      ]
+      array [
+         dict entry(
+            string \"added\"
+            string \"1623107941\"
+         )
+         dict entry(
+            string \"confirmed\"
+            string \"true\"
+         )
+         dict entry(
+            string \"id\"
+            string \"5903c6c9ac5cb863c64e559add3d5d1c8c563449\"
+         )
+      ]
+      array [
+         dict entry(
+            string \"added\"
+            string \"1595996256\"
+         )
+         dict entry(
+            string \"confirmed\"
+            string \"true\"
+         )
+         dict entry(
+            string \"id\"
+            string \"ff2d72a548693214fb3a0f0f7a943b5e2bb9be03\"
+         )
+      ]
+   ]")
+
+(test-equal "parse-account-contacts"
+  '((("added" . "1578883327")
+     ("confirmed" . "true")
+     ("id" . "1c7d5a09464223442549fef172a3cf6f4de9b01c"))
+    (("added" . "1623107941")
+     ("confirmed" . "true")
+     ("id" . "5903c6c9ac5cb863c64e559add3d5d1c8c563449"))
+    (("added" . "1595996256")
+     ("confirmed" . "true")
+     ("id" . "ff2d72a548693214fb3a0f0f7a943b5e2bb9be03")))
+  (parse-contacts getContacts-reply))
+
+(define getContacts-empty-reply "\
+method return time=1627400787.873988 sender=:1.1197 -> destination=:1.1463 serial=2127 reply_serial=2
+   array [
+   ]")
+
+(test-equal "parse-account-contacts, empty array"
+  '()
+  (parse-contacts getContacts-empty-reply))
+
+(define %dummy-jami-account (jami-account
+                             (archive "/tmp/dummy.gz")))
+
+(define %dummy-jami-account-2 (jami-account
+                               (archive "/tmp/dummy.gz")
+                               (rendezvous-point? #t)
+                               (peer-discovery? #f)
+                               (bootstrap-hostnames '("bootstrap.me"
+                                                      "fallback.another.host"))
+                               (name-server-uri "https://my.name.server")))
+
+(test-equal "jami-account->alist, no account detail value set"
+  '()
+  (jami-account->alist %dummy-jami-account))
+
+(test-equal "jami-account->alist, with account detail values"
+  '(("Account.hostname" . "bootstrap.me;fallback.another.host")
+    ("Account.peerDiscovery" . "false")
+    ("Account.rendezVous" . "true")
+    ("RingNS.uri" . "https://my.name.server"))
+  (sort (jami-account->alist %dummy-jami-account-2)
+        (lambda (x y)
+          (string<=? (car x) (car y)))))
+
+(test-end)