From unknown Wed Sep 10 20:08:11 2025 X-Loop: help-debbugs@gnu.org Subject: [bug#46850] [PATCH] tests: Add Transmission Daemon system test. Resent-From: Simon South Original-Sender: "Debbugs-submit" Resent-CC: guix-patches@gnu.org Resent-Date: Mon, 01 Mar 2021 15:15:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: report 46850 X-GNU-PR-Package: guix-patches X-GNU-PR-Keywords: patch To: 46850@debbugs.gnu.org Cc: ludo@gnu.org, Simon South X-Debbugs-Original-To: guix-patches@gnu.org Received: via spool by submit@debbugs.gnu.org id=B.161461165417046 (code B ref -1); Mon, 01 Mar 2021 15:15:02 +0000 Received: (at submit) by debbugs.gnu.org; 1 Mar 2021 15:14:14 +0000 Received: from localhost ([127.0.0.1]:50323 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1lGkFR-0004Qr-9K for submit@debbugs.gnu.org; Mon, 01 Mar 2021 10:14:13 -0500 Received: from lists.gnu.org ([209.51.188.17]:59348) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1lGkFP-0004Qi-Hp for submit@debbugs.gnu.org; Mon, 01 Mar 2021 10:14:12 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:56094) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lGkFP-00023f-DB for guix-patches@gnu.org; Mon, 01 Mar 2021 10:14:11 -0500 Received: from mailout.easymail.ca ([64.68.200.34]:47598) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lGkFK-0002K9-GN; Mon, 01 Mar 2021 10:14:11 -0500 Received: from localhost (localhost [127.0.0.1]) by mailout.easymail.ca (Postfix) with ESMTP id 4C267BF885; Mon, 1 Mar 2021 15:14:03 +0000 (UTC) X-Virus-Scanned: Debian amavisd-new at emo04-pco.easydns.vpn Received: from mailout.easymail.ca ([127.0.0.1]) by localhost (emo04-pco.easydns.vpn [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id WtxrfL0LAu8y; Mon, 1 Mar 2021 15:14:02 +0000 (UTC) Received: from localhost.localdomain (unknown [108.162.141.195]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mailout.easymail.ca (Postfix) with ESMTPSA id E2A8DC2A52; Mon, 1 Mar 2021 15:13:59 +0000 (UTC) From: Simon South Date: Mon, 1 Mar 2021 10:13:29 -0500 Message-Id: <20210301151329.17060-1-simon@simonsouth.net> X-Mailer: git-send-email 2.25.2 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Received-SPF: pass client-ip=64.68.200.34; envelope-from=simon@simonsouth.net; helo=mailout.easymail.ca X-Spam_score_int: -41 X-Spam_score: -4.2 X-Spam_bar: ---- X-Spam_report: (-4.2 / 5.0 requ) BAYES_00=-1.9, RCVD_IN_DNSWL_MED=-2.3, RCVD_IN_MSPIKE_H4=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-Spam-Score: -1.3 (-) X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -2.3 (--) * gnu/tests/file-sharing.scm: New file. * gnu/local.mk (GNU_SYSTEM_MODULES): Add it. --- gnu/local.mk | 1 + gnu/tests/file-sharing.scm | 271 +++++++++++++++++++++++++++++++++++++ 2 files changed, 272 insertions(+) create mode 100644 gnu/tests/file-sharing.scm diff --git a/gnu/local.mk b/gnu/local.mk index 0954158d4c..190bb40f2a 100644 --- a/gnu/local.mk +++ b/gnu/local.mk @@ -694,6 +694,7 @@ GNU_SYSTEM_MODULES = \ %D%/tests/desktop.scm \ %D%/tests/dict.scm \ %D%/tests/docker.scm \ + %D%/tests/file-sharing.scm \ %D%/tests/ganeti.scm \ %D%/tests/guix.scm \ %D%/tests/monitoring.scm \ diff --git a/gnu/tests/file-sharing.scm b/gnu/tests/file-sharing.scm new file mode 100644 index 0000000000..9a8ee6a593 --- /dev/null +++ b/gnu/tests/file-sharing.scm @@ -0,0 +1,271 @@ +;;; GNU Guix --- Functional package management for GNU +;;; Copyright © 2021 Simon South +;;; +;;; 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 . + +;;; +;;; The Transmission Daemon service. +;;; + +(define-module (gnu tests file-sharing) + #:use-module (gnu packages bittorrent) + #:use-module (gnu services) + #:use-module (gnu services file-sharing) + #:use-module (gnu services networking) + #:use-module (gnu system vm) + #:use-module (gnu tests) + #:use-module (guix gexp) + #:export (%test-transmission-daemon)) + +(define %transmission-daemon-user "transmission") +(define %transmission-daemon-group "transmission") + +(define %transmission-daemon-config-dir "/var/lib/transmission-daemon") +(define %transmission-daemon-watch-dir + (string-append %transmission-daemon-config-dir "/watch")) +(define %transmission-daemon-incomplete-dir + (string-append %transmission-daemon-config-dir "/incomplete")) + +(define %transmission-daemon-settings-file + (string-append %transmission-daemon-config-dir "/settings.json")) + +(define %transmission-daemon-peer-port 51000) ; default is 51413 + +(define %transmission-daemon-rpc-port 9999) ; default is 9091 +(define %transmission-daemon-rpc-username "test-username") +(define %transmission-daemon-rpc-password "test-password") + +(define %transmission-daemon-test-configuration + (transmission-daemon-configuration + (incomplete-dir-enabled? #t) + (incomplete-dir %transmission-daemon-incomplete-dir) + + (watch-dir-enabled? #t) + (watch-dir %transmission-daemon-watch-dir) + + (peer-port-random-on-start? #f) + (peer-port %transmission-daemon-peer-port) + + (rpc-enabled? #t) + (rpc-port %transmission-daemon-rpc-port) + (rpc-whitelist-enabled? #f) + (rpc-authentication-required? #t) + (rpc-username %transmission-daemon-rpc-username) + (rpc-password (transmission-password-hash %transmission-daemon-rpc-password + "yEK0q3.X")))) + +(define (run-transmission-daemon-test) + (define os + (marionette-operating-system + (simple-operating-system + (service dhcp-client-service-type) + (service transmission-daemon-service-type + %transmission-daemon-test-configuration)) + #:imported-modules '((gnu services herd) + (json parser)) + #:requirements '(transmission-daemon))) + + (define test + (with-imported-modules '((gnu build marionette)) + #~(begin + (use-modules (gnu build marionette) + (srfi srfi-64)) + + (define marionette + (make-marionette + (list #$(virtual-machine + (operating-system os) + (port-forwardings + `((9091 . ,%transmission-daemon-rpc-port))))))) + + (mkdir #$output) + (chdir #$output) + + (test-begin "transmission-daemon") + + ;; Make sure the "transmission" user and group have been created. + (test-assert "\"transmission\" user exists" + (marionette-eval + '(begin + (getpwnam #$%transmission-daemon-user) + #t) + marionette)) + (test-assert "\"transmission\" group exists" + (marionette-eval + '(begin + (getgrnam #$%transmission-daemon-group) + #t) + marionette)) + + ;; Make sure Transmission Daemon's configuration directory has been + ;; created with the correct ownership and permissions. + (test-assert "configuration directory exists" + (marionette-eval + '(eq? (stat:type (stat #$%transmission-daemon-config-dir)) + 'directory) + marionette)) + (test-assert "configuration directory has correct ownership" + (marionette-eval + '(let ((config-dir (stat #$%transmission-daemon-config-dir)) + (transmission-user (getpwnam #$%transmission-daemon-user))) + (and (eqv? (stat:uid config-dir) + (passwd:uid transmission-user)) + (eqv? (stat:gid config-dir) + (passwd:gid transmission-user)))) + marionette)) + (test-assert "configuration directory has expected permissions" + (marionette-eval + '(eqv? (stat:perms (stat #$%transmission-daemon-config-dir)) + #o750) + marionette)) + + ;; Make sure the incomplete-downloads and watch directories have been + ;; created with the correct ownership and permissions. + (test-assert "incomplete-downloads directory exists" + (marionette-eval + '(eq? (stat:type (stat #$%transmission-daemon-incomplete-dir)) + 'directory) + marionette)) + (test-assert "incomplete-downloads directory has correct ownership" + (marionette-eval + '(let ((incomplete-dir + (stat #$%transmission-daemon-incomplete-dir)) + (transmission-user + (getpwnam #$%transmission-daemon-user))) + (and (eqv? (stat:uid incomplete-dir) + (passwd:uid transmission-user)) + (eqv? (stat:gid incomplete-dir) + (passwd:gid transmission-user)))) + marionette)) + (test-assert + "incomplete-downloads directory has expected permissions" + (marionette-eval + '(eqv? (stat:perms (stat #$%transmission-daemon-incomplete-dir)) + #o750) + marionette)) + + (test-assert "watch directory exists" + (marionette-eval + '(eq? (stat:type (stat #$%transmission-daemon-watch-dir)) + 'directory) + marionette)) + (test-assert "watch directory has correct ownership" + (marionette-eval + '(let ((watch-dir (stat #$%transmission-daemon-watch-dir)) + (transmission-user (getpwnam #$%transmission-daemon-user))) + (and (eqv? (stat:uid watch-dir) + (passwd:uid transmission-user)) + (eqv? (stat:gid watch-dir) + (passwd:gid transmission-user)))) + marionette)) + (test-assert "watch directory has expected permissions" + (marionette-eval + '(eqv? (stat:perms (stat #$%transmission-daemon-watch-dir)) + #o770) + marionette)) + + ;; Make sure the settings file has been created and appears valid. + (test-assert "settings file exists" + (marionette-eval + '(file-exists? #$%transmission-daemon-settings-file) + marionette)) + (test-assert "settings file is valid JSON" + (marionette-eval + '(begin + (use-modules (json parser)) + (with-input-from-file #$%transmission-daemon-settings-file + (lambda () + (json->scm))) + #t) + marionette)) + (test-assert "settings file contains a non-empty JSON object" + (marionette-eval + '(begin + (use-modules (json parser) + (srfi srfi-1)) + (let ((settings (with-input-from-file + #$%transmission-daemon-settings-file + (lambda () + (json->scm))))) + (and (list? settings) + (not (null? settings)) + (every pair? settings)))) + marionette)) + + ;; Make sure Transmission Daemon is running. + (test-assert "transmission-daemon is running" + (marionette-eval + '(begin + (use-modules (gnu services herd)) + (live-service-running + (find (lambda (live-service) + (memq 'transmission-daemon + (live-service-provision live-service))) + (current-services)))) + marionette)) + + ;; Make sure the daemon is listening for peer connections. + (test-assert "transmission-daemon is listening for peers" + (wait-for-tcp-port #$%transmission-daemon-peer-port marionette)) + + ;; Make sure the daemon is listening for RPC-client connections. + (test-assert "transmission-daemon is listening for RPC clients" + (wait-for-tcp-port #$%transmission-daemon-rpc-port marionette)) + + ;; Make sure the RPC-authentication settings are honored. + (test-assert "transmission-daemon requires RPC authentication" + (let ((transmission-remote + (string-append #+transmission "/bin/transmission-remote"))) + (with-error-to-port (%make-void-port "w") + (lambda () + (not (zero? (system* transmission-remote + "--session-info"))))))) + (test-assert "transmission-daemon rejects incorrect RPC credentials" + (let ((transmission-remote + (string-append #+transmission "/bin/transmission-remote")) + (wrong-auth-string + (string-append #$%transmission-daemon-rpc-username + ":" + "wrong-" + #$%transmission-daemon-rpc-password))) + (with-error-to-port (%make-void-port "w") + (lambda () + (not (zero? (system* transmission-remote + "--auth" wrong-auth-string + "--session-info"))))))) + (test-assert "transmission-daemon accepts correct RPC credentials" + (let ((transmission-remote + (string-append #+transmission "/bin/transmission-remote")) + (auth-string + (string-append #$%transmission-daemon-rpc-username + ":" + #$%transmission-daemon-rpc-password))) + (with-output-to-port (%make-void-port "w") + (lambda () + (zero? (system* transmission-remote + "--auth" auth-string + "--session-info")))))) + + (test-end) + (exit (= (test-runner-fail-count (test-runner-current)) 0))))) + + (gexp->derivation "transmission-daemon-test" test)) + +(define %test-transmission-daemon + (system-test + (name "transmission-daemon") + (description "Test a running Transmission Daemon service.") + (value (run-transmission-daemon-test)))) -- 2.25.2 From unknown Wed Sep 10 20:08:11 2025 MIME-Version: 1.0 X-Mailer: MIME-tools 5.505 (Entity 5.505) X-Loop: help-debbugs@gnu.org From: help-debbugs@gnu.org (GNU bug Tracking System) To: Simon South Subject: bug#46850: closed (Re: bug#46850: [PATCH] tests: Add Transmission Daemon system test.) Message-ID: References: <87mtunt41k.fsf@gnu.org> <20210301151329.17060-1-simon@simonsouth.net> X-Gnu-PR-Message: they-closed 46850 X-Gnu-PR-Package: guix-patches X-Gnu-PR-Keywords: patch Reply-To: 46850@debbugs.gnu.org Date: Sun, 28 Mar 2021 20:31:02 +0000 Content-Type: multipart/mixed; boundary="----------=_1616963462-10068-1" This is a multi-part message in MIME format... ------------=_1616963462-10068-1 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Your bug report #46850: [PATCH] tests: Add Transmission Daemon system test. which was filed against the guix-patches package, has been closed. The explanation is attached below, along with your original report. If you require more details, please reply to 46850@debbugs.gnu.org. --=20 46850: http://debbugs.gnu.org/cgi/bugreport.cgi?bug=3D46850 GNU Bug Tracking System Contact help-debbugs@gnu.org with problems ------------=_1616963462-10068-1 Content-Type: message/rfc822 Content-Disposition: inline Content-Transfer-Encoding: 7bit Received: (at 46850-done) by debbugs.gnu.org; 28 Mar 2021 20:30:11 +0000 Received: from localhost ([127.0.0.1]:47131 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1lQc31-0002bF-CP for submit@debbugs.gnu.org; Sun, 28 Mar 2021 16:30:11 -0400 Received: from eggs.gnu.org ([209.51.188.92]:49092) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1lQc2z-0002a0-Mu for 46850-done@debbugs.gnu.org; Sun, 28 Mar 2021 16:30:10 -0400 Received: from fencepost.gnu.org ([2001:470:142:3::e]:58991) by eggs.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1lQc2u-00060Y-0J; Sun, 28 Mar 2021 16:30:04 -0400 Received: from [2a01:e0a:1d:7270:af76:b9b:ca24:c465] (port=44820 helo=ribbon) by fencepost.gnu.org with esmtpsa (TLS1.2:RSA_AES_256_CBC_SHA1:256) (Exim 4.82) (envelope-from ) id 1lQc2q-0004hd-PD; Sun, 28 Mar 2021 16:30:01 -0400 From: =?utf-8?Q?Ludovic_Court=C3=A8s?= To: Simon South Subject: Re: bug#46850: [PATCH] tests: Add Transmission Daemon system test. References: <20210301151329.17060-1-simon@simonsouth.net> Date: Sun, 28 Mar 2021 22:29:59 +0200 In-Reply-To: <20210301151329.17060-1-simon@simonsouth.net> (Simon South's message of "Mon, 1 Mar 2021 10:13:29 -0500") Message-ID: <87mtunt41k.fsf@gnu.org> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/27.1 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 46850-done Cc: 46850-done@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.7 (-) Hi Simon, Simon South skribis: > * gnu/tests/file-sharing.scm: New file. > * gnu/local.mk (GNU_SYSTEM_MODULES): Add it. Wow, nice work! I=E2=80=99ve applied it, all the tests pass. :-) Great that you were able to all these aspects of the daemon functioning. Thank you! Ludo=E2=80=99. ------------=_1616963462-10068-1 Content-Type: message/rfc822 Content-Disposition: inline Content-Transfer-Encoding: 7bit Received: (at submit) by debbugs.gnu.org; 1 Mar 2021 15:14:14 +0000 Received: from localhost ([127.0.0.1]:50323 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1lGkFR-0004Qr-9K for submit@debbugs.gnu.org; Mon, 01 Mar 2021 10:14:13 -0500 Received: from lists.gnu.org ([209.51.188.17]:59348) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1lGkFP-0004Qi-Hp for submit@debbugs.gnu.org; Mon, 01 Mar 2021 10:14:12 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:56094) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lGkFP-00023f-DB for guix-patches@gnu.org; Mon, 01 Mar 2021 10:14:11 -0500 Received: from mailout.easymail.ca ([64.68.200.34]:47598) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lGkFK-0002K9-GN; Mon, 01 Mar 2021 10:14:11 -0500 Received: from localhost (localhost [127.0.0.1]) by mailout.easymail.ca (Postfix) with ESMTP id 4C267BF885; Mon, 1 Mar 2021 15:14:03 +0000 (UTC) X-Virus-Scanned: Debian amavisd-new at emo04-pco.easydns.vpn Received: from mailout.easymail.ca ([127.0.0.1]) by localhost (emo04-pco.easydns.vpn [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id WtxrfL0LAu8y; Mon, 1 Mar 2021 15:14:02 +0000 (UTC) Received: from localhost.localdomain (unknown [108.162.141.195]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mailout.easymail.ca (Postfix) with ESMTPSA id E2A8DC2A52; Mon, 1 Mar 2021 15:13:59 +0000 (UTC) From: Simon South To: guix-patches@gnu.org Subject: [PATCH] tests: Add Transmission Daemon system test. Date: Mon, 1 Mar 2021 10:13:29 -0500 Message-Id: <20210301151329.17060-1-simon@simonsouth.net> X-Mailer: git-send-email 2.25.2 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Received-SPF: pass client-ip=64.68.200.34; envelope-from=simon@simonsouth.net; helo=mailout.easymail.ca X-Spam_score_int: -41 X-Spam_score: -4.2 X-Spam_bar: ---- X-Spam_report: (-4.2 / 5.0 requ) BAYES_00=-1.9, RCVD_IN_DNSWL_MED=-2.3, RCVD_IN_MSPIKE_H4=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-Spam-Score: -1.3 (-) X-Debbugs-Envelope-To: submit Cc: ludo@gnu.org, Simon South X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -2.3 (--) * gnu/tests/file-sharing.scm: New file. * gnu/local.mk (GNU_SYSTEM_MODULES): Add it. --- gnu/local.mk | 1 + gnu/tests/file-sharing.scm | 271 +++++++++++++++++++++++++++++++++++++ 2 files changed, 272 insertions(+) create mode 100644 gnu/tests/file-sharing.scm diff --git a/gnu/local.mk b/gnu/local.mk index 0954158d4c..190bb40f2a 100644 --- a/gnu/local.mk +++ b/gnu/local.mk @@ -694,6 +694,7 @@ GNU_SYSTEM_MODULES = \ %D%/tests/desktop.scm \ %D%/tests/dict.scm \ %D%/tests/docker.scm \ + %D%/tests/file-sharing.scm \ %D%/tests/ganeti.scm \ %D%/tests/guix.scm \ %D%/tests/monitoring.scm \ diff --git a/gnu/tests/file-sharing.scm b/gnu/tests/file-sharing.scm new file mode 100644 index 0000000000..9a8ee6a593 --- /dev/null +++ b/gnu/tests/file-sharing.scm @@ -0,0 +1,271 @@ +;;; GNU Guix --- Functional package management for GNU +;;; Copyright © 2021 Simon South +;;; +;;; 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 . + +;;; +;;; The Transmission Daemon service. +;;; + +(define-module (gnu tests file-sharing) + #:use-module (gnu packages bittorrent) + #:use-module (gnu services) + #:use-module (gnu services file-sharing) + #:use-module (gnu services networking) + #:use-module (gnu system vm) + #:use-module (gnu tests) + #:use-module (guix gexp) + #:export (%test-transmission-daemon)) + +(define %transmission-daemon-user "transmission") +(define %transmission-daemon-group "transmission") + +(define %transmission-daemon-config-dir "/var/lib/transmission-daemon") +(define %transmission-daemon-watch-dir + (string-append %transmission-daemon-config-dir "/watch")) +(define %transmission-daemon-incomplete-dir + (string-append %transmission-daemon-config-dir "/incomplete")) + +(define %transmission-daemon-settings-file + (string-append %transmission-daemon-config-dir "/settings.json")) + +(define %transmission-daemon-peer-port 51000) ; default is 51413 + +(define %transmission-daemon-rpc-port 9999) ; default is 9091 +(define %transmission-daemon-rpc-username "test-username") +(define %transmission-daemon-rpc-password "test-password") + +(define %transmission-daemon-test-configuration + (transmission-daemon-configuration + (incomplete-dir-enabled? #t) + (incomplete-dir %transmission-daemon-incomplete-dir) + + (watch-dir-enabled? #t) + (watch-dir %transmission-daemon-watch-dir) + + (peer-port-random-on-start? #f) + (peer-port %transmission-daemon-peer-port) + + (rpc-enabled? #t) + (rpc-port %transmission-daemon-rpc-port) + (rpc-whitelist-enabled? #f) + (rpc-authentication-required? #t) + (rpc-username %transmission-daemon-rpc-username) + (rpc-password (transmission-password-hash %transmission-daemon-rpc-password + "yEK0q3.X")))) + +(define (run-transmission-daemon-test) + (define os + (marionette-operating-system + (simple-operating-system + (service dhcp-client-service-type) + (service transmission-daemon-service-type + %transmission-daemon-test-configuration)) + #:imported-modules '((gnu services herd) + (json parser)) + #:requirements '(transmission-daemon))) + + (define test + (with-imported-modules '((gnu build marionette)) + #~(begin + (use-modules (gnu build marionette) + (srfi srfi-64)) + + (define marionette + (make-marionette + (list #$(virtual-machine + (operating-system os) + (port-forwardings + `((9091 . ,%transmission-daemon-rpc-port))))))) + + (mkdir #$output) + (chdir #$output) + + (test-begin "transmission-daemon") + + ;; Make sure the "transmission" user and group have been created. + (test-assert "\"transmission\" user exists" + (marionette-eval + '(begin + (getpwnam #$%transmission-daemon-user) + #t) + marionette)) + (test-assert "\"transmission\" group exists" + (marionette-eval + '(begin + (getgrnam #$%transmission-daemon-group) + #t) + marionette)) + + ;; Make sure Transmission Daemon's configuration directory has been + ;; created with the correct ownership and permissions. + (test-assert "configuration directory exists" + (marionette-eval + '(eq? (stat:type (stat #$%transmission-daemon-config-dir)) + 'directory) + marionette)) + (test-assert "configuration directory has correct ownership" + (marionette-eval + '(let ((config-dir (stat #$%transmission-daemon-config-dir)) + (transmission-user (getpwnam #$%transmission-daemon-user))) + (and (eqv? (stat:uid config-dir) + (passwd:uid transmission-user)) + (eqv? (stat:gid config-dir) + (passwd:gid transmission-user)))) + marionette)) + (test-assert "configuration directory has expected permissions" + (marionette-eval + '(eqv? (stat:perms (stat #$%transmission-daemon-config-dir)) + #o750) + marionette)) + + ;; Make sure the incomplete-downloads and watch directories have been + ;; created with the correct ownership and permissions. + (test-assert "incomplete-downloads directory exists" + (marionette-eval + '(eq? (stat:type (stat #$%transmission-daemon-incomplete-dir)) + 'directory) + marionette)) + (test-assert "incomplete-downloads directory has correct ownership" + (marionette-eval + '(let ((incomplete-dir + (stat #$%transmission-daemon-incomplete-dir)) + (transmission-user + (getpwnam #$%transmission-daemon-user))) + (and (eqv? (stat:uid incomplete-dir) + (passwd:uid transmission-user)) + (eqv? (stat:gid incomplete-dir) + (passwd:gid transmission-user)))) + marionette)) + (test-assert + "incomplete-downloads directory has expected permissions" + (marionette-eval + '(eqv? (stat:perms (stat #$%transmission-daemon-incomplete-dir)) + #o750) + marionette)) + + (test-assert "watch directory exists" + (marionette-eval + '(eq? (stat:type (stat #$%transmission-daemon-watch-dir)) + 'directory) + marionette)) + (test-assert "watch directory has correct ownership" + (marionette-eval + '(let ((watch-dir (stat #$%transmission-daemon-watch-dir)) + (transmission-user (getpwnam #$%transmission-daemon-user))) + (and (eqv? (stat:uid watch-dir) + (passwd:uid transmission-user)) + (eqv? (stat:gid watch-dir) + (passwd:gid transmission-user)))) + marionette)) + (test-assert "watch directory has expected permissions" + (marionette-eval + '(eqv? (stat:perms (stat #$%transmission-daemon-watch-dir)) + #o770) + marionette)) + + ;; Make sure the settings file has been created and appears valid. + (test-assert "settings file exists" + (marionette-eval + '(file-exists? #$%transmission-daemon-settings-file) + marionette)) + (test-assert "settings file is valid JSON" + (marionette-eval + '(begin + (use-modules (json parser)) + (with-input-from-file #$%transmission-daemon-settings-file + (lambda () + (json->scm))) + #t) + marionette)) + (test-assert "settings file contains a non-empty JSON object" + (marionette-eval + '(begin + (use-modules (json parser) + (srfi srfi-1)) + (let ((settings (with-input-from-file + #$%transmission-daemon-settings-file + (lambda () + (json->scm))))) + (and (list? settings) + (not (null? settings)) + (every pair? settings)))) + marionette)) + + ;; Make sure Transmission Daemon is running. + (test-assert "transmission-daemon is running" + (marionette-eval + '(begin + (use-modules (gnu services herd)) + (live-service-running + (find (lambda (live-service) + (memq 'transmission-daemon + (live-service-provision live-service))) + (current-services)))) + marionette)) + + ;; Make sure the daemon is listening for peer connections. + (test-assert "transmission-daemon is listening for peers" + (wait-for-tcp-port #$%transmission-daemon-peer-port marionette)) + + ;; Make sure the daemon is listening for RPC-client connections. + (test-assert "transmission-daemon is listening for RPC clients" + (wait-for-tcp-port #$%transmission-daemon-rpc-port marionette)) + + ;; Make sure the RPC-authentication settings are honored. + (test-assert "transmission-daemon requires RPC authentication" + (let ((transmission-remote + (string-append #+transmission "/bin/transmission-remote"))) + (with-error-to-port (%make-void-port "w") + (lambda () + (not (zero? (system* transmission-remote + "--session-info"))))))) + (test-assert "transmission-daemon rejects incorrect RPC credentials" + (let ((transmission-remote + (string-append #+transmission "/bin/transmission-remote")) + (wrong-auth-string + (string-append #$%transmission-daemon-rpc-username + ":" + "wrong-" + #$%transmission-daemon-rpc-password))) + (with-error-to-port (%make-void-port "w") + (lambda () + (not (zero? (system* transmission-remote + "--auth" wrong-auth-string + "--session-info"))))))) + (test-assert "transmission-daemon accepts correct RPC credentials" + (let ((transmission-remote + (string-append #+transmission "/bin/transmission-remote")) + (auth-string + (string-append #$%transmission-daemon-rpc-username + ":" + #$%transmission-daemon-rpc-password))) + (with-output-to-port (%make-void-port "w") + (lambda () + (zero? (system* transmission-remote + "--auth" auth-string + "--session-info")))))) + + (test-end) + (exit (= (test-runner-fail-count (test-runner-current)) 0))))) + + (gexp->derivation "transmission-daemon-test" test)) + +(define %test-transmission-daemon + (system-test + (name "transmission-daemon") + (description "Test a running Transmission Daemon service.") + (value (run-transmission-daemon-test)))) -- 2.25.2 ------------=_1616963462-10068-1--