unofficial mirror of guix-patches@gnu.org 
 help / color / mirror / code / Atom feed
* [bug#74670] [PATCH] tests: pack: Fix AppImage tests.
@ 2024-12-03 15:13 Noé Lopez via Guix-patches via
  2024-12-12 21:58 ` Ludovic Courtès
                   ` (3 more replies)
  0 siblings, 4 replies; 9+ messages in thread
From: Noé Lopez via Guix-patches via @ 2024-12-03 15:13 UTC (permalink / raw)
  To: 74670; +Cc: Noé Lopez, Ludovic Courtès

From: Noé Lopez <noelopez@free.fr>

* tests/pack.scm: Add glibc to AppImage tests’ profiles.

Change-Id: I7890b902f65a2944ae8fa03db8a964deda3c725c
---
Hi,

This patch fixes the tests failing for AppImage pack.  I believe the issue was
that without the AppImage runtime (--appimage-extract-and-run), the glibc is
not available to the AppRun binary, causing a file not found error.

This is an issue caused because AppRun is built using the relocatable runtime,
which requires (or at least is built with) the glibc.

This is not an issue when using the AppImage runtime with FUSE, since it
correctly mounts the store payload before starting the AppRun.

Have a nice day,
Noé

 tests/pack.scm | 39 ++++++++++++++++++++++++++++-----------
 1 file changed, 28 insertions(+), 11 deletions(-)

diff --git a/tests/pack.scm b/tests/pack.scm
index 1c1e312557..2cb643f136 100644
--- a/tests/pack.scm
+++ b/tests/pack.scm
@@ -1,5 +1,5 @@
 ;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2017-2021, 2023 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2017-2021, 2023, 2024 Ludovic Courtès <ludo@gnu.org>
 ;;; Copyright © 2018 Ricardo Wurmus <rekado@elephly.net>
 ;;; Copyright © 2021, 2023 Maxim Cournoyer <maxim.cournoyer@gmail.com>
 ;;; Copyright © 2023 Oleg Pykhalov <go.wigust@gmail.com>
@@ -34,7 +34,7 @@ (define-module (test-pack)
   #:use-module ((guix build utils) #:select (%store-directory))
   #:use-module (gnu packages)
   #:use-module ((gnu packages base) #:select (libc-utf8-locales-for-target
-                                              hello))
+                                              hello glibc))
   #:use-module (gnu packages bootstrap)
   #:use-module ((gnu packages package-management) #:select (rpm))
   #:use-module ((gnu packages compression) #:select (squashfs-tools))
@@ -347,36 +347,53 @@ (define rpm-for-tests
     (mlet* %store-monad
         ((guile   (set-guile-for-build (default-guile)))
          (profile -> (profile
-                      (content (packages->manifest (list %bootstrap-guile hello)))
+                      (content (packages->manifest (list %bootstrap-guile hello glibc)))
                       (hooks '())
                       (locales? #f)))
          (image   (self-contained-appimage "hello-appimage" profile
                                            #:entry-point "bin/hello"
                                            #:extra-options
-                                           (list #:relocatable? #t)))
+                                           '(#:relocatable? #t)))
          (check   (gexp->derivation
                    "check-appimage"
-                   #~(invoke #$image))))
-      (built-derivations (list check))))
+                   (with-imported-modules '((guix build utils))
+                     #~(begin
+                         (use-modules (ice-9 popen)
+                                      (guix build utils))
+                         (let ((pipe (open-pipe* OPEN_READ
+                                                 #$image "--appimage-extract-and-run")))
+                           (call-with-output-file #$output
+                             (lambda (port)
+                               (dump-port pipe port)))
+                           (exit (status:exit-val (close-pipe pipe)))))))))
+      (built-derivations (list (pk 'APPIMAGE-drv check)))))
 
   (unless store (test-skip 1))
   (test-assertm "appimage + localstatedir"
     (mlet* %store-monad
         ((guile   (set-guile-for-build (default-guile)))
          (profile -> (profile
-                      (content (packages->manifest (list %bootstrap-guile hello)))
+                      (content (packages->manifest (list %bootstrap-guile hello glibc)))
                       (hooks '())
                       (locales? #f)))
          (image   (self-contained-appimage "hello-appimage" profile
                                            #:entry-point "bin/hello"
                                            #:localstatedir? #t
                                            #:extra-options
-                                           (list #:relocatable? #t)))
+                                           '(#:relocatable? #t)))
          (check   (gexp->derivation
                    "check-appimage"
-                   #~(begin
-                       (invoke #$image)))))
-      (built-derivations (list check))))
+                   (with-imported-modules '((guix build utils))
+                     #~(begin
+                         (use-modules (ice-9 popen)
+                                      (guix build utils))
+                         (let ((pipe (open-pipe* OPEN_READ
+                                                 #$image "--appimage-extract-and-run")))
+                           (call-with-output-file #$output
+                             (lambda (port)
+                               (dump-port pipe port)))
+                           (exit (status:exit-val (close-pipe pipe)))))))))
+      (built-derivations (list (pk 'APPIMAGE-drv check)))))
 
   (unless store (test-skip 1))
   (test-assertm "deb archive with symlinks and control files"

base-commit: bb8a6f0ac47296d3a18e1e0a26ea3a833eb77c4a
-- 
2.46.0





^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [bug#74670] [PATCH] tests: pack: Fix AppImage tests.
  2024-12-03 15:13 [bug#74670] [PATCH] tests: pack: Fix AppImage tests Noé Lopez via Guix-patches via
@ 2024-12-12 21:58 ` Ludovic Courtès
  2024-12-12 21:59 ` Ludovic Courtès
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 9+ messages in thread
From: Ludovic Courtès @ 2024-12-12 21:58 UTC (permalink / raw)
  To: Noé Lopez; +Cc: 74670

[-- Attachment #1: Type: text/plain, Size: 1130 bytes --]

Hi Noé,

Noé Lopez <noe@noé.eu> skribis:

> From: Noé Lopez <noelopez@free.fr>
>
> * tests/pack.scm: Add glibc to AppImage tests’ profiles.
>
> Change-Id: I7890b902f65a2944ae8fa03db8a964deda3c725c
> ---
> Hi,
>
> This patch fixes the tests failing for AppImage pack.  I believe the issue was
> that without the AppImage runtime (--appimage-extract-and-run), the glibc is
> not available to the AppRun binary, causing a file not found error.
>
> This is an issue caused because AppRun is built using the relocatable runtime,
> which requires (or at least is built with) the glibc.

Hmm, that further limits the applicability of AppImage, but OK.  (Not
our fault!)

I noticed that the tests were not going very far, so I tried the patch
below to: (1) check the output of ‘hello’ in the first test, (2) change
the second test to check for the existence of /var/guix/db/db.sqlite.

The second test doesn’t work though, because where’s that file supposed
to live?  The image is apparently extracted in an unguessable directory,
so cannot tell where it is.  Am I right?

Thanks,
Ludo’.


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: Type: text/x-patch, Size: 4798 bytes --]

diff --git a/tests/pack.scm b/tests/pack.scm
index 2cb643f136..7fcae1ec1f 100644
--- a/tests/pack.scm
+++ b/tests/pack.scm
@@ -39,9 +39,10 @@ (define-module (test-pack)
   #:use-module ((gnu packages package-management) #:select (rpm))
   #:use-module ((gnu packages compression) #:select (squashfs-tools))
   #:use-module ((gnu packages debian) #:select (dpkg))
-  #:use-module ((gnu packages guile) #:select (guile-sqlite3))
+  #:use-module ((gnu packages guile) #:select (guile-sqlite3 guile-3.0))
   #:use-module ((gnu packages gnupg) #:select (guile-gcrypt))
   #:use-module ((gnu packages linux) #:select (fakeroot))
+  #:use-module ((ice-9 textual-ports) #:select (get-string-all))
   #:use-module (srfi srfi-64))
 
 (define %store
@@ -347,7 +348,9 @@ (define rpm-for-tests
     (mlet* %store-monad
         ((guile   (set-guile-for-build (default-guile)))
          (profile -> (profile
-                      (content (packages->manifest (list %bootstrap-guile hello glibc)))
+                      ;; When using '--appimage-extract-and-run', the dynamic
+                      ;; linker is necessary, hence glibc below.
+                      (content (packages->manifest (list hello glibc)))
                       (hooks '())
                       (locales? #f)))
          (image   (self-contained-appimage "hello-appimage" profile
@@ -366,34 +369,46 @@ (define rpm-for-tests
                              (lambda (port)
                                (dump-port pipe port)))
                            (exit (status:exit-val (close-pipe pipe)))))))))
-      (built-derivations (list (pk 'APPIMAGE-drv check)))))
+      (mbegin %store-monad
+        (built-derivations (list (pk 'APPIMAGE-drv check)))
+        (return (string=? (call-with-input-file (derivation->output-path check)
+                            get-string-all)
+                          "Hello, world!\n")))))
 
   (unless store (test-skip 1))
   (test-assertm "appimage + localstatedir"
     (mlet* %store-monad
         ((guile   (set-guile-for-build (default-guile)))
          (profile -> (profile
-                      (content (packages->manifest (list %bootstrap-guile hello glibc)))
+                      ;; When using '--appimage-extract-and-run', the dynamic
+                      ;; linker is necessary, hence glibc below.
+                      (content (packages->manifest (list guile-3.0 glibc)))
                       (hooks '())
                       (locales? #f)))
-         (image   (self-contained-appimage "hello-appimage" profile
-                                           #:entry-point "bin/hello"
+         (image   (self-contained-appimage "guile-appimage" profile
+                                           #:entry-point "bin/guile"
                                            #:localstatedir? #t
                                            #:extra-options
                                            '(#:relocatable? #t)))
          (check   (gexp->derivation
-                   "check-appimage"
-                   (with-imported-modules '((guix build utils))
-                     #~(begin
-                         (use-modules (ice-9 popen)
-                                      (guix build utils))
-                         (let ((pipe (open-pipe* OPEN_READ
-                                                 #$image "--appimage-extract-and-run")))
-                           (call-with-output-file #$output
-                             (lambda (port)
-                               (dump-port pipe port)))
-                           (exit (status:exit-val (close-pipe pipe)))))))))
-      (built-derivations (list (pk 'APPIMAGE-drv check)))))
+                   "check-appimage-with-localstatedir"
+                   #~(begin
+                       (system* #$image "--appimage-extract-and-run" "-c"
+                                (object->string
+                                 `(call-with-output-file #$output
+                                    (lambda (port)
+                                      (display "Hello from Guile!\n"
+                                               port)))))
+                       (execl #$image #$image "--appimage-extract-and-run" "-c"
+                              (object->string
+                               '(exit
+                                 (pk 'db? (getcwd)
+                                     (file-exists? "var/guix/db/db.sqlite")))))))))
+      (mbegin %store-monad
+        (built-derivations (list (pk 'APPIMAGE-drv check)))
+        (return (string=? (call-with-input-file (derivation->output-path check)
+                            get-string-all)
+                          "Hello from Guile!\n")))))
 
   (unless store (test-skip 1))
   (test-assertm "deb archive with symlinks and control files"

^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [bug#74670] [PATCH] tests: pack: Fix AppImage tests.
  2024-12-03 15:13 [bug#74670] [PATCH] tests: pack: Fix AppImage tests Noé Lopez via Guix-patches via
  2024-12-12 21:58 ` Ludovic Courtès
@ 2024-12-12 21:59 ` Ludovic Courtès
  2024-12-18 23:58 ` [bug#74670] [PATCH v2 0/2] " Noé Lopez via Guix-patches
  2024-12-19  0:23 ` [bug#74670] [PATCH v3 0/2] tests: pack: Fix AppImage tests Noé Lopez via Guix-patches via
  3 siblings, 0 replies; 9+ messages in thread
From: Ludovic Courtès @ 2024-12-12 21:59 UTC (permalink / raw)
  To: Noé Lopez; +Cc: 74670

[-- Attachment #1: Type: text/plain, Size: 1130 bytes --]

Hi Noé,

Noé Lopez <noe@noé.eu> skribis:

> From: Noé Lopez <noelopez@free.fr>
>
> * tests/pack.scm: Add glibc to AppImage tests’ profiles.
>
> Change-Id: I7890b902f65a2944ae8fa03db8a964deda3c725c
> ---
> Hi,
>
> This patch fixes the tests failing for AppImage pack.  I believe the issue was
> that without the AppImage runtime (--appimage-extract-and-run), the glibc is
> not available to the AppRun binary, causing a file not found error.
>
> This is an issue caused because AppRun is built using the relocatable runtime,
> which requires (or at least is built with) the glibc.

Hmm, that further limits the applicability of AppImage, but OK.  (Not
our fault!)

I noticed that the tests were not going very far, so I tried the patch
below to: (1) check the output of ‘hello’ in the first test, (2) change
the second test to check for the existence of /var/guix/db/db.sqlite.

The second test doesn’t work though, because where’s that file supposed
to live?  The image is apparently extracted in an unguessable directory,
so cannot tell where it is.  Am I right?

Thanks,
Ludo’.


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: Type: text/x-patch, Size: 4798 bytes --]

diff --git a/tests/pack.scm b/tests/pack.scm
index 2cb643f136..7fcae1ec1f 100644
--- a/tests/pack.scm
+++ b/tests/pack.scm
@@ -39,9 +39,10 @@ (define-module (test-pack)
   #:use-module ((gnu packages package-management) #:select (rpm))
   #:use-module ((gnu packages compression) #:select (squashfs-tools))
   #:use-module ((gnu packages debian) #:select (dpkg))
-  #:use-module ((gnu packages guile) #:select (guile-sqlite3))
+  #:use-module ((gnu packages guile) #:select (guile-sqlite3 guile-3.0))
   #:use-module ((gnu packages gnupg) #:select (guile-gcrypt))
   #:use-module ((gnu packages linux) #:select (fakeroot))
+  #:use-module ((ice-9 textual-ports) #:select (get-string-all))
   #:use-module (srfi srfi-64))
 
 (define %store
@@ -347,7 +348,9 @@ (define rpm-for-tests
     (mlet* %store-monad
         ((guile   (set-guile-for-build (default-guile)))
          (profile -> (profile
-                      (content (packages->manifest (list %bootstrap-guile hello glibc)))
+                      ;; When using '--appimage-extract-and-run', the dynamic
+                      ;; linker is necessary, hence glibc below.
+                      (content (packages->manifest (list hello glibc)))
                       (hooks '())
                       (locales? #f)))
          (image   (self-contained-appimage "hello-appimage" profile
@@ -366,34 +369,46 @@ (define rpm-for-tests
                              (lambda (port)
                                (dump-port pipe port)))
                            (exit (status:exit-val (close-pipe pipe)))))))))
-      (built-derivations (list (pk 'APPIMAGE-drv check)))))
+      (mbegin %store-monad
+        (built-derivations (list (pk 'APPIMAGE-drv check)))
+        (return (string=? (call-with-input-file (derivation->output-path check)
+                            get-string-all)
+                          "Hello, world!\n")))))
 
   (unless store (test-skip 1))
   (test-assertm "appimage + localstatedir"
     (mlet* %store-monad
         ((guile   (set-guile-for-build (default-guile)))
          (profile -> (profile
-                      (content (packages->manifest (list %bootstrap-guile hello glibc)))
+                      ;; When using '--appimage-extract-and-run', the dynamic
+                      ;; linker is necessary, hence glibc below.
+                      (content (packages->manifest (list guile-3.0 glibc)))
                       (hooks '())
                       (locales? #f)))
-         (image   (self-contained-appimage "hello-appimage" profile
-                                           #:entry-point "bin/hello"
+         (image   (self-contained-appimage "guile-appimage" profile
+                                           #:entry-point "bin/guile"
                                            #:localstatedir? #t
                                            #:extra-options
                                            '(#:relocatable? #t)))
          (check   (gexp->derivation
-                   "check-appimage"
-                   (with-imported-modules '((guix build utils))
-                     #~(begin
-                         (use-modules (ice-9 popen)
-                                      (guix build utils))
-                         (let ((pipe (open-pipe* OPEN_READ
-                                                 #$image "--appimage-extract-and-run")))
-                           (call-with-output-file #$output
-                             (lambda (port)
-                               (dump-port pipe port)))
-                           (exit (status:exit-val (close-pipe pipe)))))))))
-      (built-derivations (list (pk 'APPIMAGE-drv check)))))
+                   "check-appimage-with-localstatedir"
+                   #~(begin
+                       (system* #$image "--appimage-extract-and-run" "-c"
+                                (object->string
+                                 `(call-with-output-file #$output
+                                    (lambda (port)
+                                      (display "Hello from Guile!\n"
+                                               port)))))
+                       (execl #$image #$image "--appimage-extract-and-run" "-c"
+                              (object->string
+                               '(exit
+                                 (pk 'db? (getcwd)
+                                     (file-exists? "var/guix/db/db.sqlite")))))))))
+      (mbegin %store-monad
+        (built-derivations (list (pk 'APPIMAGE-drv check)))
+        (return (string=? (call-with-input-file (derivation->output-path check)
+                            get-string-all)
+                          "Hello from Guile!\n")))))
 
   (unless store (test-skip 1))
   (test-assertm "deb archive with symlinks and control files"

^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [bug#74670] [PATCH v2 0/2] Fix AppImage tests.
  2024-12-03 15:13 [bug#74670] [PATCH] tests: pack: Fix AppImage tests Noé Lopez via Guix-patches via
  2024-12-12 21:58 ` Ludovic Courtès
  2024-12-12 21:59 ` Ludovic Courtès
@ 2024-12-18 23:58 ` Noé Lopez via Guix-patches
  2024-12-18 23:59   ` [bug#74670] [PATCH v2 1/2] pack: Support localstatedir in AppImage format Noé Lopez via Guix-patches
  2024-12-19  0:23 ` [bug#74670] [PATCH v3 0/2] tests: pack: Fix AppImage tests Noé Lopez via Guix-patches via
  3 siblings, 1 reply; 9+ messages in thread
From: Noé Lopez via Guix-patches @ 2024-12-18 23:58 UTC (permalink / raw)
  To: 74670; +Cc: Noé Lopez

From: Noé Lopez <noelopez@free.fr>

Hi,

Thanks you very much for working on the tests, I should have spent more time
on them myself.

> I noticed that the tests were not going very far, so I tried the patch
> below to: (1) check the output of ‘hello’ in the first test, (2) change
> the second test to check for the existence of /var/guix/db/db.sqlite.
>
> The second test doesn’t work though, because where’s that file supposed
> to live?  The image is apparently extracted in an unguessable directory,
> so cannot tell where it is.  Am I right?

Yes, --appimage-extract-and-run uses a temporary directory but you can use
--appimage-extract which always places the contents in ./squashfs-root.

The other reason the test did not work is because the localstatedir option
wasn’t supported to begin with, this is an oversight that I could have avoided.

I’m sending a second version with the localstatedir support and your updated
tests.

Thanks,
Noé

Noé Lopez (2):
  pack: Support localstatedir in AppImage format.
  build: pack: Fix unexpected type in assert-utf8-local.

 guix/build/pack.scm   |  2 +-
 guix/scripts/pack.scm | 13 ++++++++++-
 tests/pack.scm        | 51 ++++++++++++++++++++++++++++---------------
 3 files changed, 46 insertions(+), 20 deletions(-)


base-commit: bb8a6f0ac47296d3a18e1e0a26ea3a833eb77c4a
prerequisite-patch-id: f3798629973582541e158d322c1a461038c657b8
-- 
2.46.0





^ permalink raw reply	[flat|nested] 9+ messages in thread

* [bug#74670] [PATCH v2 1/2] pack: Support localstatedir in AppImage format.
  2024-12-18 23:58 ` [bug#74670] [PATCH v2 0/2] " Noé Lopez via Guix-patches
@ 2024-12-18 23:59   ` Noé Lopez via Guix-patches
  0 siblings, 0 replies; 9+ messages in thread
From: Noé Lopez via Guix-patches @ 2024-12-18 23:59 UTC (permalink / raw)
  To: 74670
  Cc: Noé Lopez, Christopher Baines, Josselin Poiret,
	Ludovic Courtès, Mathieu Othacehe, Simon Tournier,
	Tobias Geerinckx-Rice

From: Noé Lopez <noe@xn--no-cja.eu>

From: Noé Lopez <noelopez@free.fr>

* guix/scripts/pack.scm (self-contained-appimage): Support localstatedir
option.
* tests/pack.scm: Update tests.

Change-Id: Ibf4758db890b2db0cff4b663fed6564015e347d1
---
 guix/scripts/pack.scm | 13 ++++++++++-
 tests/pack.scm        | 51 ++++++++++++++++++++++++++++---------------
 2 files changed, 45 insertions(+), 19 deletions(-)

diff --git a/guix/scripts/pack.scm b/guix/scripts/pack.scm
index 58cd55b129..61e2da12e7 100644
--- a/guix/scripts/pack.scm
+++ b/guix/scripts/pack.scm
@@ -1018,15 +1018,22 @@ (define* (self-contained-appimage name profile
              compressor-name
              %valid-compressors)))
 
+  (define database
+    (and localstatedir?
+         (file-append (store-database (list profile))
+                      "/db/db.sqlite")))
+
   (define builder
     (with-extensions (list guile-gcrypt)
       (with-imported-modules (source-module-closure
                               '((guix build store-copy)
-                                (guix build utils))
+                                (guix build utils)
+                                (gnu build install))
                               #:select? not-config?)
         #~(begin
             (use-modules (guix build utils)
                          (guix build store-copy)
+                         (gnu build install)
                          (rnrs io ports)
                          (srfi srfi-1)
                          (srfi srfi-26))
@@ -1060,6 +1067,10 @@ (define* (self-contained-appimage name profile
                (string-append appdir "/" #$name ".desktop")
                #:name #$name
                #:exec #$entry-point)
+              ;; Install database and gc roots.
+              (when #+database
+                ;; Initialize /var/guix.
+                (install-database-and-gc-roots appdir #+database profile))
               ;; Compress the AppDir.
               (invoke #+(file-append squashfs-tools "/bin/mksquashfs") appdir
                       squashfs "-root-owned" "-noappend"
diff --git a/tests/pack.scm b/tests/pack.scm
index 2cb643f136..00a8e250ed 100644
--- a/tests/pack.scm
+++ b/tests/pack.scm
@@ -39,9 +39,10 @@ (define-module (test-pack)
   #:use-module ((gnu packages package-management) #:select (rpm))
   #:use-module ((gnu packages compression) #:select (squashfs-tools))
   #:use-module ((gnu packages debian) #:select (dpkg))
-  #:use-module ((gnu packages guile) #:select (guile-sqlite3))
+  #:use-module ((gnu packages guile) #:select (guile-sqlite3 guile-3.0))
   #:use-module ((gnu packages gnupg) #:select (guile-gcrypt))
   #:use-module ((gnu packages linux) #:select (fakeroot))
+  #:use-module ((ice-9 textual-ports) #:select (get-string-all))
   #:use-module (srfi srfi-64))
 
 (define %store
@@ -347,7 +348,9 @@ (define rpm-for-tests
     (mlet* %store-monad
         ((guile   (set-guile-for-build (default-guile)))
          (profile -> (profile
-                      (content (packages->manifest (list %bootstrap-guile hello glibc)))
+                      ;; When using '--appimage-extract-and-run', the dynamic
+                      ;; linker is necessary, hence glibc below.
+                      (content (packages->manifest (list hello glibc)))
                       (hooks '())
                       (locales? #f)))
          (image   (self-contained-appimage "hello-appimage" profile
@@ -366,34 +369,46 @@ (define rpm-for-tests
                              (lambda (port)
                                (dump-port pipe port)))
                            (exit (status:exit-val (close-pipe pipe)))))))))
-      (built-derivations (list (pk 'APPIMAGE-drv check)))))
+      (mbegin %store-monad
+        (built-derivations (list (pk 'APPIMAGE-drv check)))
+        (return (string=? (call-with-input-file (derivation->output-path check)
+                            get-string-all)
+                          "Hello, world!\n")))))
 
   (unless store (test-skip 1))
   (test-assertm "appimage + localstatedir"
     (mlet* %store-monad
         ((guile   (set-guile-for-build (default-guile)))
          (profile -> (profile
-                      (content (packages->manifest (list %bootstrap-guile hello glibc)))
+                      ;; When using '--appimage-extract-and-run', the dynamic
+                      ;; linker is necessary, hence glibc below.
+                      (content (packages->manifest (list guile-3.0 glibc)))
                       (hooks '())
                       (locales? #f)))
-         (image   (self-contained-appimage "hello-appimage" profile
-                                           #:entry-point "bin/hello"
+         (image   (self-contained-appimage "guile-appimage" profile
+                                           #:entry-point "bin/guile"
                                            #:localstatedir? #t
                                            #:extra-options
                                            '(#:relocatable? #t)))
          (check   (gexp->derivation
-                   "check-appimage"
-                   (with-imported-modules '((guix build utils))
-                     #~(begin
-                         (use-modules (ice-9 popen)
-                                      (guix build utils))
-                         (let ((pipe (open-pipe* OPEN_READ
-                                                 #$image "--appimage-extract-and-run")))
-                           (call-with-output-file #$output
-                             (lambda (port)
-                               (dump-port pipe port)))
-                           (exit (status:exit-val (close-pipe pipe)))))))))
-      (built-derivations (list (pk 'APPIMAGE-drv check)))))
+                   "check-appimage-with-localstatedir"
+                   #~(begin
+                       (system* #$image "--appimage-extract-and-run" "-c"
+                                (object->string
+                                 `(call-with-output-file #$output
+                                    (lambda (port)
+                                      (display "Hello from Guile!\n"
+                                               port)))))
+                       (execl #$image #$image "--appimage-extract" "-c"
+                              (object->string
+                               '(exit
+                                 (pk 'db? (getcwd)
+                                     (file-exists? "squashfs-root/var/guix/db/db.sqlite")))))))))
+      (mbegin %store-monad
+        (built-derivations (list (pk 'APPIMAGE-drv check)))
+        (return (string=? (call-with-input-file (derivation->output-path check)
+                            get-string-all)
+                          "Hello from Guile!\n")))))
 
   (unless store (test-skip 1))
   (test-assertm "deb archive with symlinks and control files"
-- 
2.46.0





^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [bug#74670] [PATCH v3 0/2] tests: pack: Fix AppImage tests.
  2024-12-03 15:13 [bug#74670] [PATCH] tests: pack: Fix AppImage tests Noé Lopez via Guix-patches via
                   ` (2 preceding siblings ...)
  2024-12-18 23:58 ` [bug#74670] [PATCH v2 0/2] " Noé Lopez via Guix-patches
@ 2024-12-19  0:23 ` Noé Lopez via Guix-patches via
  2024-12-19  0:23   ` [bug#74670] [PATCH v3 1/2] pack: Support localstatedir in AppImage format Noé Lopez via Guix-patches via
  2024-12-19  0:23   ` [bug#74670] [PATCH v3 2/2] tests: pack: Improve AppImage tests Noé Lopez via Guix-patches via
  3 siblings, 2 replies; 9+ messages in thread
From: Noé Lopez via Guix-patches via @ 2024-12-19  0:23 UTC (permalink / raw)
  To: 74670; +Cc: Noé Lopez, Ludovic Courtès

From: Noé Lopez <noelopez@free.fr>

(messed up git in v2)

Hi,

Thanks you very much for working on the tests, I should have spent more time
on them myself.

> I noticed that the tests were not going very far, so I tried the patch
> below to: (1) check the output of ‘hello’ in the first test, (2) change
> the second test to check for the existence of /var/guix/db/db.sqlite.
>
> The second test doesn’t work though, because where’s that file supposed
> to live?  The image is apparently extracted in an unguessable directory,
> so cannot tell where it is.  Am I right?

Yes, --appimage-extract-and-run uses a temporary directory but you can use
--appimage-extract which always places the contents in ./squashfs-root.

The other reason the test did not work is because the localstatedir option
wasn’t supported to begin with, this is an oversight that I could have avoided
by knowing what I was doing.

I’m sending a second version with the localstatedir support and your updated
tests.

Thanks,
Noé

Noé Lopez (2):
  pack: Support localstatedir in AppImage format.
  tests: pack: Improve AppImage tests.

 guix/scripts/pack.scm | 13 +++++++++-
 tests/pack.scm        | 60 +++++++++++++++++++++++++++++++++----------
 2 files changed, 58 insertions(+), 15 deletions(-)


base-commit: 1a62f687e504c67f26693f3bc60a90e503ab4ea9
-- 
2.46.0





^ permalink raw reply	[flat|nested] 9+ messages in thread

* [bug#74670] [PATCH v3 1/2] pack: Support localstatedir in AppImage format.
  2024-12-19  0:23 ` [bug#74670] [PATCH v3 0/2] tests: pack: Fix AppImage tests Noé Lopez via Guix-patches via
@ 2024-12-19  0:23   ` Noé Lopez via Guix-patches via
  2024-12-19  0:23   ` [bug#74670] [PATCH v3 2/2] tests: pack: Improve AppImage tests Noé Lopez via Guix-patches via
  1 sibling, 0 replies; 9+ messages in thread
From: Noé Lopez via Guix-patches via @ 2024-12-19  0:23 UTC (permalink / raw)
  To: 74670
  Cc: Noé Lopez, Christopher Baines, Josselin Poiret,
	Ludovic Courtès, Mathieu Othacehe, Simon Tournier,
	Tobias Geerinckx-Rice

From: Noé Lopez <noelopez@free.fr>

* guix/scripts/pack.scm (self-contained-appimage): Support localstatedir
option.

Change-Id: I296b3d3e442aa90f36de62a9b23aba4a2c3de9a0
---
 guix/scripts/pack.scm | 13 ++++++++++++-
 1 file changed, 12 insertions(+), 1 deletion(-)

diff --git a/guix/scripts/pack.scm b/guix/scripts/pack.scm
index d0e66c3013..7f5a5f2aa7 100644
--- a/guix/scripts/pack.scm
+++ b/guix/scripts/pack.scm
@@ -1018,15 +1018,22 @@ (define* (self-contained-appimage name profile
              compressor-name
              %valid-compressors)))
 
+  (define database
+    (and localstatedir?
+         (file-append (store-database (list profile))
+                      "/db/db.sqlite")))
+
   (define builder
     (with-extensions (list guile-gcrypt)
       (with-imported-modules (source-module-closure
                               '((guix build store-copy)
-                                (guix build utils))
+                                (guix build utils)
+                                (gnu build install))
                               #:select? not-config?)
         #~(begin
             (use-modules (guix build utils)
                          (guix build store-copy)
+                         (gnu build install)
                          (rnrs io ports)
                          (srfi srfi-1)
                          (srfi srfi-26))
@@ -1060,6 +1067,10 @@ (define* (self-contained-appimage name profile
                (string-append appdir "/" #$name ".desktop")
                #:name #$name
                #:exec #$entry-point)
+              ;; Install database and gc roots.
+              (when #+database
+                ;; Initialize /var/guix.
+                (install-database-and-gc-roots appdir #+database profile))
               ;; Compress the AppDir.
               (invoke #+(file-append squashfs-tools "/bin/mksquashfs") appdir
                       squashfs "-root-owned" "-noappend"
-- 
2.46.0





^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [bug#74670] [PATCH v3 2/2] tests: pack: Improve AppImage tests.
  2024-12-19  0:23 ` [bug#74670] [PATCH v3 0/2] tests: pack: Fix AppImage tests Noé Lopez via Guix-patches via
  2024-12-19  0:23   ` [bug#74670] [PATCH v3 1/2] pack: Support localstatedir in AppImage format Noé Lopez via Guix-patches via
@ 2024-12-19  0:23   ` Noé Lopez via Guix-patches via
  2024-12-23 18:37     ` Ludovic Courtès
  1 sibling, 1 reply; 9+ messages in thread
From: Noé Lopez via Guix-patches via @ 2024-12-19  0:23 UTC (permalink / raw)
  To: 74670; +Cc: Noé Lopez, Ludovic Courtès

From: Noé Lopez <noelopez@free.fr>

* tests/pack.scm: Improve AppImage tests.

Change-Id: I7890b902f65a2944ae8fa03db8a964deda3c725c
---
 tests/pack.scm | 60 ++++++++++++++++++++++++++++++++++++++------------
 1 file changed, 46 insertions(+), 14 deletions(-)

diff --git a/tests/pack.scm b/tests/pack.scm
index 1c1e312557..4eac98fbdd 100644
--- a/tests/pack.scm
+++ b/tests/pack.scm
@@ -1,5 +1,5 @@
 ;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2017-2021, 2023 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2017-2021, 2023, 2024 Ludovic Courtès <ludo@gnu.org>
 ;;; Copyright © 2018 Ricardo Wurmus <rekado@elephly.net>
 ;;; Copyright © 2021, 2023 Maxim Cournoyer <maxim.cournoyer@gmail.com>
 ;;; Copyright © 2023 Oleg Pykhalov <go.wigust@gmail.com>
@@ -34,14 +34,15 @@ (define-module (test-pack)
   #:use-module ((guix build utils) #:select (%store-directory))
   #:use-module (gnu packages)
   #:use-module ((gnu packages base) #:select (libc-utf8-locales-for-target
-                                              hello))
+                                              hello glibc))
   #:use-module (gnu packages bootstrap)
   #:use-module ((gnu packages package-management) #:select (rpm))
   #:use-module ((gnu packages compression) #:select (squashfs-tools))
   #:use-module ((gnu packages debian) #:select (dpkg))
-  #:use-module ((gnu packages guile) #:select (guile-sqlite3))
+  #:use-module ((gnu packages guile) #:select (guile-sqlite3 guile-3.0))
   #:use-module ((gnu packages gnupg) #:select (guile-gcrypt))
   #:use-module ((gnu packages linux) #:select (fakeroot))
+  #:use-module ((ice-9 textual-ports) #:select (get-string-all))
   #:use-module (srfi srfi-64))
 
 (define %store
@@ -347,36 +348,67 @@ (define rpm-for-tests
     (mlet* %store-monad
         ((guile   (set-guile-for-build (default-guile)))
          (profile -> (profile
-                      (content (packages->manifest (list %bootstrap-guile hello)))
+                      ;; When using '--appimage-extract-and-run', the dynamic
+                      ;; linker is necessary, hence glibc below.
+                      (content (packages->manifest (list hello glibc)))
                       (hooks '())
                       (locales? #f)))
          (image   (self-contained-appimage "hello-appimage" profile
                                            #:entry-point "bin/hello"
                                            #:extra-options
-                                           (list #:relocatable? #t)))
+                                           '(#:relocatable? #t)))
          (check   (gexp->derivation
                    "check-appimage"
-                   #~(invoke #$image))))
-      (built-derivations (list check))))
+                   (with-imported-modules '((guix build utils))
+                     #~(begin
+                         (use-modules (ice-9 popen)
+                                      (guix build utils))
+                         (let ((pipe (open-pipe* OPEN_READ
+                                                 #$image "--appimage-extract-and-run")))
+                           (call-with-output-file #$output
+                             (lambda (port)
+                               (dump-port pipe port)))
+                           (exit (status:exit-val (close-pipe pipe)))))))))
+      (mbegin %store-monad
+        (built-derivations (list (pk 'APPIMAGE-drv check)))
+        (return (string=? (call-with-input-file (derivation->output-path check)
+                            get-string-all)
+                          "Hello, world!\n")))))
 
   (unless store (test-skip 1))
   (test-assertm "appimage + localstatedir"
     (mlet* %store-monad
         ((guile   (set-guile-for-build (default-guile)))
          (profile -> (profile
-                      (content (packages->manifest (list %bootstrap-guile hello)))
+                      ;; When using '--appimage-extract-and-run', the dynamic
+                      ;; linker is necessary, hence glibc below.
+                      (content (packages->manifest (list guile-3.0 glibc)))
                       (hooks '())
                       (locales? #f)))
-         (image   (self-contained-appimage "hello-appimage" profile
-                                           #:entry-point "bin/hello"
+         (image   (self-contained-appimage "guile-appimage" profile
+                                           #:entry-point "bin/guile"
                                            #:localstatedir? #t
                                            #:extra-options
-                                           (list #:relocatable? #t)))
+                                           '(#:relocatable? #t)))
          (check   (gexp->derivation
-                   "check-appimage"
+                   "check-appimage-with-localstatedir"
                    #~(begin
-                       (invoke #$image)))))
-      (built-derivations (list check))))
+                       (system* #$image "--appimage-extract-and-run" "-c"
+                                (object->string
+                                 `(call-with-output-file #$output
+                                    (lambda (port)
+                                      (display "Hello from Guile!\n"
+                                               port)))))
+                       (execl #$image #$image "--appimage-extract"
+                              (object->string
+                               '(exit
+                                 (pk 'db? (getcwd)
+                                     (file-exists? "squashfs-root/var/guix/db/db.sqlite")))))))))
+      (mbegin %store-monad
+        (built-derivations (list (pk 'APPIMAGE-drv check)))
+        (return (string=? (call-with-input-file (derivation->output-path check)
+                            get-string-all)
+                          "Hello from Guile!\n")))))
 
   (unless store (test-skip 1))
   (test-assertm "deb archive with symlinks and control files"
-- 
2.46.0





^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [bug#74670] [PATCH v3 2/2] tests: pack: Improve AppImage tests.
  2024-12-19  0:23   ` [bug#74670] [PATCH v3 2/2] tests: pack: Improve AppImage tests Noé Lopez via Guix-patches via
@ 2024-12-23 18:37     ` Ludovic Courtès
  0 siblings, 0 replies; 9+ messages in thread
From: Ludovic Courtès @ 2024-12-23 18:37 UTC (permalink / raw)
  To: Noé Lopez; +Cc: 74670

Hi Noé,

Noé Lopez <noe@noé.eu> skribis:

> From: Noé Lopez <noelopez@free.fr>
>
> * tests/pack.scm: Improve AppImage tests.
>
> Change-Id: I7890b902f65a2944ae8fa03db8a964deda3c725c

[...]

> +                       (system* #$image "--appimage-extract-and-run" "-c"
> +                                (object->string
> +                                 `(call-with-output-file #$output
> +                                    (lambda (port)
> +                                      (display "Hello from Guile!\n"
> +                                               port)))))
> +                       (execl #$image #$image "--appimage-extract"
> +                              (object->string
> +                               '(exit
> +                                 (pk 'db? (getcwd)
> +                                     (file-exists? "squashfs-root/var/guix/db/db.sqlite")))))))))

The second part here does nothing: you can place any other file name and
it still exits successfully.

Looking at an strace, I think ‘--appimage-extract’ does next to nothing:
essentially it reads /proc/self/exe, create an empty “squashfs-root”
directory, and exits.

Could you check exactly what’s happening?

We’re getting really close!

Thanks,
Ludo’.




^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2024-12-23 18:38 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-12-03 15:13 [bug#74670] [PATCH] tests: pack: Fix AppImage tests Noé Lopez via Guix-patches via
2024-12-12 21:58 ` Ludovic Courtès
2024-12-12 21:59 ` Ludovic Courtès
2024-12-18 23:58 ` [bug#74670] [PATCH v2 0/2] " Noé Lopez via Guix-patches
2024-12-18 23:59   ` [bug#74670] [PATCH v2 1/2] pack: Support localstatedir in AppImage format Noé Lopez via Guix-patches
2024-12-19  0:23 ` [bug#74670] [PATCH v3 0/2] tests: pack: Fix AppImage tests Noé Lopez via Guix-patches via
2024-12-19  0:23   ` [bug#74670] [PATCH v3 1/2] pack: Support localstatedir in AppImage format Noé Lopez via Guix-patches via
2024-12-19  0:23   ` [bug#74670] [PATCH v3 2/2] tests: pack: Improve AppImage tests Noé Lopez via Guix-patches via
2024-12-23 18:37     ` Ludovic Courtès

Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/guix.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).