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:
		
							parent
							
								
									13993c77fe
								
							
						
					
					
						commit
						ff913cf514
					
				
					 1 changed files with 128 additions and 134 deletions
				
			
		|  | @ -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)) | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Reference in a new issue