22let
33 pname = "http" ;
44 inherit ( pkgs ) lib ;
5+ mockServer = ../../tests/http-mock-server.py ;
56 installedExtension =
67 postgresMajorVersion :
7- self . legacyPackages . ${ pkgs . stdenv . hostPlatform . system } . "psql_${ postgresMajorVersion } " . exts . "${
8+ self . legacyPackages . ${ pkgs . pkgsLinux . stdenv . hostPlatform . system } . "psql_${ postgresMajorVersion } " . exts . "${
89 pname
910 } " ;
1011 versions = postgresqlMajorVersion : ( installedExtension postgresqlMajorVersion ) . versions ;
1314 let
1415 majorVersion =
1516 if postgresql . isOrioleDB then "orioledb-17" else lib . versions . major postgresql . version ;
16- pkg = pkgs . buildEnv {
17+ pkg = pkgs . pkgsLinux . buildEnv {
1718 name = "postgresql-${ majorVersion } -${ pname } " ;
1819 paths = [
1920 postgresql
2021 postgresql . lib
2122 ( installedExtension majorVersion )
2223 ]
2324 ++ lib . optional ( postgresql . isOrioleDB
24- ) self . legacyPackages . ${ pkgs . stdenv . hostPlatform . system } . psql_orioledb-17 . exts . orioledb ;
25+ ) self . legacyPackages . ${ pkgs . pkgsLinux . stdenv . hostPlatform . system } . psql_orioledb-17 . exts . orioledb ;
2526 passthru = {
2627 inherit ( postgresql ) version psqlSchema ;
2728 installedExtensions = [ ( installedExtension majorVersion ) ] ;
3031 withJIT = pkg ;
3132 withoutJIT = pkg ;
3233 } ;
33- nativeBuildInputs = [ pkgs . makeWrapper ] ;
34+ nativeBuildInputs = [ pkgs . pkgsLinux . makeWrapper ] ;
3435 pathsToLink = [
3536 "/"
3637 "/bin"
4445 } ;
4546 in
4647 pkg ;
47- psql_15 = postgresqlWithExtension self . packages . ${ pkgs . stdenv . hostPlatform . system } . postgresql_15 ;
48- psql_17 = postgresqlWithExtension self . packages . ${ pkgs . stdenv . hostPlatform . system } . postgresql_17 ;
48+ psql_15 =
49+ postgresqlWithExtension
50+ self . packages . ${ pkgs . pkgsLinux . stdenv . hostPlatform . system } . postgresql_15 ;
51+ psql_17 =
52+ postgresqlWithExtension
53+ self . packages . ${ pkgs . pkgsLinux . stdenv . hostPlatform . system } . postgresql_17 ;
4954 orioledb_17 =
5055 postgresqlWithExtension
51- self . packages . ${ pkgs . stdenv . hostPlatform . system } . postgresql_orioledb-17 ;
56+ self . packages . ${ pkgs . pkgsLinux . stdenv . hostPlatform . system } . postgresql_orioledb-17 ;
5257in
53- self . inputs . nixpkgs . lib . nixos . runTest {
58+ pkgs . testers . runNixOSTest {
5459 name = pname ;
55- hostPkgs = pkgs ;
5660 nodes . server =
5761 { config , ... } :
5862 {
59- virtualisation = {
60- forwardPorts = [
61- {
62- from = "host" ;
63- host . port = 13022 ;
64- guest . port = 22 ;
65- }
66- ] ;
67- } ;
6863 services . openssh = {
6964 enable = true ;
7065 } ;
7166
7267 services . postgresql = {
7368 enable = true ;
74- package = postgresqlWithExtension self . packages . ${ pkgs . stdenv . hostPlatform . system } . postgresql_15 ;
69+ package =
70+ postgresqlWithExtension
71+ self . packages . ${ pkgs . pkgsLinux . stdenv . hostPlatform . system } . postgresql_15 ;
7572 settings = ( installedExtension "15" ) . defaultSettings or { } ;
7673 authentication = ''
7774 local all postgres peer map=postgres
@@ -89,24 +86,40 @@ self.inputs.nixpkgs.lib.nixos.runTest {
8986 ] ;
9087 initialScript = pkgs . writeText "init-postgres" ''
9188 CREATE TABLE IF NOT EXISTS test_config (key TEXT PRIMARY KEY, value TEXT);
92- INSERT INTO test_config (key, value) VALUES ('http_mock_port', '8880') ON CONFLICT (key) DO UPDATE SET value = EXCLUDED.value;
9389 '' ;
9490 } ;
9591
9692 systemd . services . http-mock-server = {
9793 wantedBy = [ "multi-user.target" ] ;
94+ before = [ "postgresql.service" ] ;
9895 serviceConfig = {
9996 Type = "simple" ;
97+ Restart = "on-failure" ;
98+ RestartSec = "2" ;
99+ TimeoutStartSec = "30" ;
100+ User = "root" ;
101+ } ;
102+ environment = {
103+ HTTP_MOCK_PORT_FILE = "/tmp/http-mock-port" ;
104+ PYTHONUNBUFFERED = "1" ;
100105 } ;
101106 script = ''
102- ${ pkgs . python3 } /bin/python3 ${ ../../tests/http-mock-server.py }
107+ # Ensure temp directory exists
108+ mkdir -p /tmp
109+
110+ # Start the mock server
111+ exec ${ pkgs . pkgsLinux . python3 } /bin/python3 ${ mockServer }
103112 '' ;
104113 } ;
105114
115+ systemd . services . postgresql = {
116+ after = [ "http-mock-server.service" ] ;
117+ } ;
118+
106119 specialisation . postgresql17 . configuration = {
107120 services . postgresql = {
108121 package = lib . mkForce (
109- postgresqlWithExtension self . packages . ${ pkgs . stdenv . hostPlatform . system } . postgresql_17
122+ postgresqlWithExtension self . packages . ${ pkgs . pkgsLinux . stdenv . hostPlatform . system } . postgresql_17
110123 ) ;
111124 settings = ( ( installedExtension "17" ) . defaultSettings or { } ) ;
112125 } ;
@@ -124,10 +137,10 @@ self.inputs.nixpkgs.lib.nixos.runTest {
124137 let
125138 oldPostgresql =
126139 postgresqlWithExtension
127- self . packages . ${ pkgs . stdenv . hostPlatform . system } . postgresql_15 ;
140+ self . packages . ${ pkgs . pkgsLinux . stdenv . hostPlatform . system } . postgresql_15 ;
128141 newPostgresql =
129142 postgresqlWithExtension
130- self . packages . ${ pkgs . stdenv . hostPlatform . system } . postgresql_17 ;
143+ self . packages . ${ pkgs . pkgsLinux . stdenv . hostPlatform . system } . postgresql_17 ;
131144 oldDataDir = "${ builtins . dirOf config . services . postgresql . dataDir } /${ oldPostgresql . psqlSchema } " ;
132145 newDataDir = "${ builtins . dirOf config . services . postgresql . dataDir } /${ newPostgresql . psqlSchema } " ;
133146 in
@@ -152,7 +165,8 @@ self.inputs.nixpkgs.lib.nixos.runTest {
152165 specialisation . orioledb17 . configuration = {
153166 services . postgresql = {
154167 package = lib . mkForce (
155- postgresqlWithExtension self . packages . ${ pkgs . stdenv . hostPlatform . system } . postgresql_orioledb-17
168+ postgresqlWithExtension
169+ self . packages . ${ pkgs . pkgsLinux . stdenv . hostPlatform . system } . postgresql_orioledb-17
156170 ) ;
157171 settings = lib . mkForce (
158172 ( ( installedExtension "17" ) . defaultSettings or { } )
@@ -175,7 +189,6 @@ self.inputs.nixpkgs.lib.nixos.runTest {
175189 pkgs . writeText "init-postgres-with-orioledb" ''
176190 CREATE EXTENSION orioledb CASCADE;
177191 CREATE TABLE IF NOT EXISTS test_config (key TEXT PRIMARY KEY, value TEXT);
178- INSERT INTO test_config (key, value) VALUES ('http_mock_port', '8880') ON CONFLICT (key) DO UPDATE SET value = EXCLUDED.value;
179192 ''
180193 ) ;
181194 } ;
@@ -194,7 +207,7 @@ self.inputs.nixpkgs.lib.nixos.runTest {
194207 let
195208 newPostgresql =
196209 postgresqlWithExtension
197- self . packages . ${ pkgs . stdenv . hostPlatform . system } . postgresql_orioledb-17 ;
210+ self . packages . ${ pkgs . pkgsLinux . stdenv . hostPlatform . system } . postgresql_orioledb-17 ;
198211 in
199212 ''
200213 if [[ -z "${ newPostgresql . psqlSchema } " ]]; then
@@ -243,8 +256,37 @@ self.inputs.nixpkgs.lib.nixos.runTest {
243256 start_all()
244257
245258 server.wait_for_unit("multi-user.target")
259+ server.wait_for_unit("http-mock-server.service")
246260 server.wait_for_unit("postgresql.service")
247261
262+ # Read the HTTP mock port and configure it in PostgreSQL
263+ # Wait for the port file to be created with retry logic
264+ server.succeed("""
265+ for i in {1..30}; do
266+ if [ -f /tmp/http-mock-port ]; then
267+ break
268+ fi
269+ echo "Waiting for HTTP mock server port file... ($i/30)"
270+ sleep 1
271+ done
272+
273+ if [ ! -f /tmp/http-mock-port ]; then
274+ echo "ERROR: HTTP mock server port file not found after 30 seconds"
275+ systemctl status http-mock-server.service || true
276+ journalctl -u http-mock-server.service --no-pager || true
277+ exit 1
278+ fi
279+ """)
280+
281+ http_port = server.succeed("cat /tmp/http-mock-port").strip()
282+ server.succeed(f"""
283+ sudo -u postgres psql -d postgres -c '
284+ CREATE TABLE IF NOT EXISTS test_config (key TEXT PRIMARY KEY, value TEXT);
285+ INSERT INTO test_config (key, value) VALUES ('"'"'http_mock_port'"'"', '"'"'{http_port}'"'"')
286+ ON CONFLICT (key) DO UPDATE SET value = EXCLUDED.value;
287+ '
288+ """)
289+
248290 test = PostgresExtensionTest(server, extension_name, versions, sql_test_directory, support_upgrade, ext_schema, lib_name)
249291 test.create_schema()
250292
@@ -269,6 +311,14 @@ self.inputs.nixpkgs.lib.nixos.runTest {
269311 server.succeed(
270312 "${ pg17-configuration } /bin/switch-to-configuration test >&2"
271313 )
314+ server.wait_for_unit("postgresql.service")
315+ # Reconfigure the HTTP mock port after switching PostgreSQL version
316+ server.succeed(f"""
317+ sudo -u postgres psql -d postgres -c '
318+ INSERT INTO test_config (key, value) VALUES ('"'"'http_mock_port'"'"', '"'"'{http_port}'"'"')
319+ ON CONFLICT (key) DO UPDATE SET value = EXCLUDED.value;
320+ '
321+ """)
272322
273323 with subtest("Check last version of the extension after postgresql upgrade"):
274324 test.assert_version_matches(last_version)
@@ -289,6 +339,14 @@ self.inputs.nixpkgs.lib.nixos.runTest {
289339 server.succeed(
290340 "${ orioledb17-configuration } /bin/switch-to-configuration test >&2"
291341 )
342+ server.wait_for_unit("postgresql.service")
343+ # Reconfigure the HTTP mock port after switching to orioledb
344+ server.succeed(f"""
345+ sudo -u postgres psql -d postgres -c '
346+ INSERT INTO test_config (key, value) VALUES ('"'"'http_mock_port'"'"', '"'"'{http_port}'"'"')
347+ ON CONFLICT (key) DO UPDATE SET value = EXCLUDED.value;
348+ '
349+ """)
292350 installed_extensions=test.run_sql("""SELECT extname FROM pg_extension WHERE extname = 'orioledb';""")
293351 assert "orioledb" in installed_extensions
294352 test.create_schema()
0 commit comments