tests: add test for Flatpak-Upgrade-From header on install vs update

Add an integration test that verifies the Flatpak-Upgrade-From HTTP
header is correctly sent during update operations but absent during
fresh installs. This header is used by Flathub to distinguish updates
from new installs in download statistics.

To support the test, extend web-server.py to optionally log Flatpak-*
request headers to a separate file.
This commit is contained in:
razzeee
2026-04-21 09:22:52 +02:00
committed by Sebastian Wick
parent fffe38a2b0
commit fad37dfa8c
3 changed files with 80 additions and 2 deletions

View File

@@ -409,6 +409,7 @@ tests = {
'extra-data': {'wrap': ['user', 'system']},
'preinstall': {},
'run-custom': {'wrap': ['user', 'system']},
'upgrade-from-header': {'wrap': ['user', 'system', 'system-norevokefs']},
}
wrapped_tests = []

View File

@@ -0,0 +1,60 @@
#!/bin/bash
set -euo pipefail
. "$(dirname "$0")"/libtest.sh
skip_without_bwrap
skip_revokefs_without_fuse
echo "1..4"
# Override the httpd function to enable header logging before setup_repo calls
# it. The web-server.py will log Flatpak-Ref and Flatpak-Upgrade-From headers
# to httpd-headers-log.
httpd () {
if [ $# -eq 0 ] ; then
set web-server.py repos "$(pwd)"/httpd-headers-log
fi
COMMAND=$1
shift
rm -f httpd-pipe
mkfifo httpd-pipe
PYTHONUNBUFFERED=1 "$(dirname "$0")"/$COMMAND "$@" 3> httpd-pipe 2>&1 | tee -a httpd-log >&2 &
read < httpd-pipe
}
touch httpd-headers-log
setup_repo
truncate -s 0 httpd-headers-log
install_repo
APP_REF="app/org.test.Hello/${ARCH}/master"
assert_not_file_has_content httpd-headers-log "Flatpak-Upgrade-From"
ok "no Flatpak-Upgrade-From header on fresh install"
assert_file_has_content httpd-headers-log "Flatpak-Ref: ${APP_REF}"
ok "Flatpak-Ref header sent on fresh install"
INSTALLED_COMMIT=$(${FLATPAK} ${U} info --show-commit org.test.Hello)
make_updated_app
truncate -s 0 httpd-headers-log
${FLATPAK} ${U} update -y org.test.Hello >&2
assert_file_has_content httpd-headers-log "Flatpak-Upgrade-From: ${INSTALLED_COMMIT}"
ok "Flatpak-Upgrade-From header sent with correct commit hash on update"
assert_file_has_content httpd-headers-log "Flatpak-Ref: ${APP_REF}"
ok "Flatpak-Ref header sent on update"

View File

@@ -15,6 +15,8 @@ from io import BytesIO
import sys
class RequestHandler(http_server.SimpleHTTPRequestHandler):
headers_log_file = None
def handle_tokens(self):
need_token_path = self.translate_path(self.path) + ".need_token"
if os.path.isfile(need_token_path):
@@ -34,14 +36,26 @@ class RequestHandler(http_server.SimpleHTTPRequestHandler):
return True
return False
def log_flatpak_headers(self):
if self.headers_log_file is None:
return
for name in ("Flatpak-Ref", "Flatpak-Upgrade-From", "Flatpak-Is-Update"):
value = self.headers.get(name)
if value is not None:
with open(self.headers_log_file, 'a+') as f:
f.write("%s: %s\n" % (name, value))
def do_GET(self):
self.log_flatpak_headers()
if self.handle_tokens():
return None
self.headers.__delitem__("If-Modified-Since")
return super().do_GET()
def run(dir):
def run(dir, headers_log=None):
RequestHandler.protocol_version = "HTTP/1.0"
RequestHandler.headers_log_file = headers_log
httpd = http_server.HTTPServer( ("127.0.0.1", 0), RequestHandler)
host, port = httpd.socket.getsockname()[:2]
with open("httpd-port", 'w') as file:
@@ -59,7 +73,10 @@ def run(dir):
if __name__ == '__main__':
dir = None
headers_log = None
if len(sys.argv) >= 2 and len(sys.argv[1]) > 0:
dir = sys.argv[1]
if len(sys.argv) >= 3 and len(sys.argv[2]) > 0:
headers_log = sys.argv[2]
run(dir)
run(dir, headers_log)