tests: ssh: Use 'with-extensions'.

* gnu/tests/ssh.scm (run-ssh-test)[test]: Wrap body in
'with-extensions'.  Remove %load-path manipulation code.
This commit is contained in:
Ludovic Courtès 2018-05-28 18:23:24 +02:00
parent 13993c77fe
commit ff913cf514
No known key found for this signature in database
GPG Key ID: 090B11993D9AEBB5
1 changed files with 128 additions and 134 deletions

View File

@ -1,5 +1,5 @@
;;; GNU Guix --- Functional package management for GNU ;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2016, 2017 Ludovic Courtès <ludo@gnu.org> ;;; Copyright © 2016, 2017, 2018 Ludovic Courtès <ludo@gnu.org>
;;; Copyright © 2017 Clément Lassieur <clement@lassieur.org> ;;; Copyright © 2017 Clément Lassieur <clement@lassieur.org>
;;; Copyright © 2017 Marius Bakke <mbakke@fastmail.com> ;;; Copyright © 2017 Marius Bakke <mbakke@fastmail.com>
;;; ;;;
@ -49,156 +49,150 @@ When SFTP? is true, run an SFTP server test."
(define test (define test
(with-imported-modules '((gnu build marionette)) (with-imported-modules '((gnu build marionette))
#~(begin (with-extensions (list guile-ssh)
(eval-when (expand load eval) #~(begin
;; Prepare to use Guile-SSH. (use-modules (gnu build marionette)
(set! %load-path (srfi srfi-26)
(cons (string-append #+guile-ssh "/share/guile/site/" (srfi srfi-64)
(effective-version)) (ice-9 match)
%load-path))) (ssh session)
(ssh auth)
(ssh channel)
(ssh sftp))
(use-modules (gnu build marionette) (define marionette
(srfi srfi-26) ;; Enable TCP forwarding of the guest's port 22.
(srfi srfi-64) (make-marionette (list #$vm)))
(ice-9 match)
(ssh session)
(ssh auth)
(ssh channel)
(ssh sftp))
(define marionette (define (make-session-for-test)
;; Enable TCP forwarding of the guest's port 22. "Make a session with predefined parameters for a test."
(make-marionette (list #$vm))) (make-session #:user "root"
#:port 2222
#:host "localhost"
#:log-verbosity 'protocol))
(define (make-session-for-test) (define (call-with-connected-session proc)
"Make a session with predefined parameters for a test." "Call the one-argument procedure PROC with a freshly created and
(make-session #:user "root"
#:port 2222
#:host "localhost"
#:log-verbosity 'protocol))
(define (call-with-connected-session proc)
"Call the one-argument procedure PROC with a freshly created and
connected SSH session object, return the result of the procedure call. The connected SSH session object, return the result of the procedure call. The
session is disconnected when the PROC is finished." session is disconnected when the PROC is finished."
(let ((session (make-session-for-test))) (let ((session (make-session-for-test)))
(dynamic-wind (dynamic-wind
(lambda () (lambda ()
(let ((result (connect! session))) (let ((result (connect! session)))
(unless (equal? result 'ok) (unless (equal? result 'ok)
(error "Could not connect to a server" (error "Could not connect to a server"
session result)))) session result))))
(lambda () (proc session)) (lambda () (proc session))
(lambda () (disconnect! session))))) (lambda () (disconnect! session)))))
(define (call-with-connected-session/auth proc) (define (call-with-connected-session/auth proc)
"Make an authenticated session. We should be able to connect as "Make an authenticated session. We should be able to connect as
root with an empty password." root with an empty password."
(call-with-connected-session (call-with-connected-session
(lambda (session) (lambda (session)
;; Try the simple authentication methods. Dropbear requires ;; Try the simple authentication methods. Dropbear requires
;; 'none' when there are no passwords, whereas OpenSSH accepts ;; 'none' when there are no passwords, whereas OpenSSH accepts
;; 'password' with an empty password. ;; 'password' with an empty password.
(let loop ((methods (list (cut userauth-password! <> "") (let loop ((methods (list (cut userauth-password! <> "")
(cut userauth-none! <>)))) (cut userauth-none! <>))))
(match methods (match methods
(() (()
(error "all the authentication methods failed")) (error "all the authentication methods failed"))
((auth rest ...) ((auth rest ...)
(match (pk 'auth (auth session)) (match (pk 'auth (auth session))
('success ('success
(proc session)) (proc session))
('denied ('denied
(loop rest))))))))) (loop rest)))))))))
(mkdir #$output) (mkdir #$output)
(chdir #$output) (chdir #$output)
(test-begin "ssh-daemon") (test-begin "ssh-daemon")
;; Wait for sshd to be up and running. ;; Wait for sshd to be up and running.
(test-eq "service running" (test-eq "service running"
'running! 'running!
(marionette-eval (marionette-eval
'(begin '(begin
(use-modules (gnu services herd)) (use-modules (gnu services herd))
(start-service 'ssh-daemon) (start-service 'ssh-daemon)
'running!) 'running!)
marionette)) marionette))
;; Check sshd's PID file. ;; Check sshd's PID file.
(test-equal "sshd PID" (test-equal "sshd PID"
(wait-for-file #$pid-file marionette) (wait-for-file #$pid-file marionette)
(marionette-eval (marionette-eval
'(begin '(begin
(use-modules (gnu services herd) (use-modules (gnu services herd)
(srfi srfi-1)) (srfi srfi-1))
(live-service-running (live-service-running
(find (lambda (live) (find (lambda (live)
(memq 'ssh-daemon (memq 'ssh-daemon
(live-service-provision live))) (live-service-provision live)))
(current-services)))) (current-services))))
marionette)) marionette))
;; Connect to the guest over SSH. Make sure we can run a shell ;; Connect to the guest over SSH. Make sure we can run a shell
;; command there. ;; command there.
(test-equal "shell command" (test-equal "shell command"
'hello 'hello
(call-with-connected-session/auth (call-with-connected-session/auth
(lambda (session) (lambda (session)
;; FIXME: 'get-server-public-key' segfaults. ;; FIXME: 'get-server-public-key' segfaults.
;; (get-server-public-key session) ;; (get-server-public-key session)
(let ((channel (make-channel session))) (let ((channel (make-channel session)))
(channel-open-session channel) (channel-open-session channel)
(channel-request-exec channel "echo hello > /root/witness") (channel-request-exec channel "echo hello > /root/witness")
(and (zero? (channel-get-exit-status channel)) (and (zero? (channel-get-exit-status channel))
(wait-for-file "/root/witness" marionette)))))) (wait-for-file "/root/witness" marionette))))))
;; Connect to the guest over SFTP. Make sure we can write and ;; Connect to the guest over SFTP. Make sure we can write and
;; read a file there. ;; read a file there.
(unless #$sftp? (unless #$sftp?
(test-skip 1)) (test-skip 1))
(test-equal "SFTP file writing and reading" (test-equal "SFTP file writing and reading"
'hello 'hello
(call-with-connected-session/auth (call-with-connected-session/auth
(lambda (session) (lambda (session)
(let ((sftp-session (make-sftp-session session)) (let ((sftp-session (make-sftp-session session))
(witness "/root/sftp-witness")) (witness "/root/sftp-witness"))
(call-with-remote-output-file sftp-session witness (call-with-remote-output-file sftp-session witness
(cut display "hello" <>)) (cut display "hello" <>))
(call-with-remote-input-file sftp-session witness (call-with-remote-input-file sftp-session witness
read))))) read)))))
;; Connect to the guest over SSH. Make sure we can run commands ;; Connect to the guest over SSH. Make sure we can run commands
;; from the system profile. ;; from the system profile.
(test-equal "run executables from system profile" (test-equal "run executables from system profile"
#t #t
(call-with-connected-session/auth (call-with-connected-session/auth
(lambda (session) (lambda (session)
(let ((channel (make-channel session))) (let ((channel (make-channel session)))
(channel-open-session channel) (channel-open-session channel)
(channel-request-exec (channel-request-exec
channel channel
(string-append (string-append
"mkdir -p /root/.guix-profile/bin && " "mkdir -p /root/.guix-profile/bin && "
"touch /root/.guix-profile/bin/path-witness && " "touch /root/.guix-profile/bin/path-witness && "
"chmod 755 /root/.guix-profile/bin/path-witness")) "chmod 755 /root/.guix-profile/bin/path-witness"))
(zero? (channel-get-exit-status channel)))))) (zero? (channel-get-exit-status channel))))))
;; Connect to the guest over SSH. Make sure we can run commands ;; Connect to the guest over SSH. Make sure we can run commands
;; from the user profile. ;; from the user profile.
(test-equal "run executable from user profile" (test-equal "run executable from user profile"
#t #t
(call-with-connected-session/auth (call-with-connected-session/auth
(lambda (session) (lambda (session)
(let ((channel (make-channel session))) (let ((channel (make-channel session)))
(channel-open-session channel) (channel-open-session channel)
(channel-request-exec channel "path-witness") (channel-request-exec channel "path-witness")
(zero? (channel-get-exit-status channel)))))) (zero? (channel-get-exit-status channel))))))
(test-end) (test-end)
(exit (= (test-runner-fail-count (test-runner-current)) 0))))) (exit (= (test-runner-fail-count (test-runner-current)) 0))))))
(gexp->derivation name test)) (gexp->derivation name test))