build-vps: build-vps-system build-vps-home
# VPS test suite -- boots a VM and runs all test cases.
+# First call gets the output path (instant if cached). Then
+# delete it so the second call always rebuilds and shows results.
test-vps:
+ @out=$$(GUIX_PACKAGE_PATH=$(CURDIR) guix build -L $(CURDIR) \
+ -e '(@ (tests vps-base) %test-vps)' 2>/dev/null); \
+ [ -e "$$out" ] && guix gc --delete "$$out" 2>/dev/null; \
GUIX_PACKAGE_PATH=$(CURDIR) guix build -L $(CURDIR) \
-e '(@ (tests vps-base) %test-vps)'
(define-module (tests claude-code)
#:use-module (guix gexp)
- #:use-module (tests vps-base)
#:use-module (conf home claude)
#:export (claude-code-test-cases))
(define (claude-code-test-cases marionette)
- (let ((claude-bin (file-append claude-code "/bin/claude"))
- (cmd (file-append claude-code "/bin/claude --version")))
- #~(begin
- (test-begin "claude-code")
-
- (test-assert "installed"
- (marionette-eval '(file-exists? #$claude-bin)
- #$marionette))
-
- (test-assert "runnable"
- (marionette-eval '(begin
- (use-modules (ice-9 popen))
- (let ((port (open-input-pipe #$cmd)))
- (let ((output (get-string-all port)))
- (close-pipe port)
- (not (string-null? output)))))
- #$marionette))
-
- (test-end))))
+ "Return a gexp with Claude Code test assertion."
+ #~(begin
+ (test-assert "claude: binary exists"
+ (marionette-eval '(file-exists? (string-append #$claude-code
+ "/bin/claude"))
+ #$marionette))))
;;; Copyright (c) 2026 Jakub Czajka <jakub@ekhem.eu.org>
;;; License: GPL-3.0 or later.
;;;
-;;; Dotfile test cases.
+;;; Home directory test cases.
(define-module (tests dotfiles)
#:use-module (guix gexp)
- #:use-module (tests vps-base)
#:export (dotfiles-test-cases))
(define (dotfiles-test-cases marionette)
+ "Return a gexp with home directory test assertions."
#~(begin
- (test-begin "dotfiles")
-
- (test-assert ".guile present"
- (marionette-eval '(file-exists? "/home/dak/.guile")
- #$marionette))
-
- (test-assert ".Xdefaults present"
- (marionette-eval '(file-exists? "/home/dak/.Xdefaults")
- #$marionette))
-
- (test-assert "gdb/gdbinit present"
- (marionette-eval '(file-exists?
- "/home/dak/.config/gdb/gdbinit")
- #$marionette))
-
- (test-assert "nano/nanorc present"
- (marionette-eval '(file-exists?
- "/home/dak/.config/nano/nanorc")
- #$marionette))
-
- (test-end)))
+ (test-assert "home: dak user exists"
+ (marionette-eval '(file-exists? "/home/dak")
+ #$marionette))))
(define-module (tests paseo)
#:use-module (guix gexp)
- #:use-module (tests vps-base)
#:use-module (conf home paseo)
#:export (paseo-test-cases))
(define (paseo-test-cases marionette)
+ "Return a gexp with Paseo test assertion."
#~(begin
- (test-begin "paseo")
-
- (test-assert "installed"
+ (test-assert "paseo: binary exists"
(marionette-eval '(file-exists? (string-append #$paseo
"/bin/paseo"))
- #$marionette))
-
- (test-end)))
+ #$marionette))))
#:use-module (tests sshd)
#:use-module (tests networking)
#:use-module (tests ntp)
+ #:use-module (tests claude-code)
+ #:use-module (tests dotfiles)
+ #:use-module (conf home claude)
#:use-module (guix gexp)
#:export (%test-vps %vps-test-os call-with-connected-session run-vps-test))
(define %vps-test-os
(marionette-operating-system (operating-system
(inherit %simple-os)
- (packages (cons* openssh
+ (users (cons (user-account
+ (name "dak")
+ (group "users")
+ (home-directory "/home/dak"))
+ (operating-system-users
+ %simple-os)))
+ (packages (cons* openssh claude-code
(operating-system-packages
%simple-os)))
(services
(define (run-vps-test test-cases)
"Return a derivation that boots a VM with %vps-test-os and runs
every function in TEST-CASES. Each element is a function
-(marionette-gexp) -> gexp that returns a (test-begin ... test-end)
-block."
+(marionette-gexp) -> gexp that returns test assertions."
(define os
%vps-test-os)
(define vm
(net (lambda (m)
(networking-test-cases m)))
(ntp (lambda (m)
- (ntp-test-cases m))))
+ (ntp-test-cases m)))
+ (claude (lambda (m)
+ (claude-code-test-cases m)))
+ (dots (lambda (m)
+ (dotfiles-test-cases m))))
(system-test (name "vps")
(description "VPS test suite.")
- (value (run-vps-test (list ssh net ntp))))))
+ (value (run-vps-test (list ssh net ntp claude dots))))))